aboutsummaryrefslogtreecommitdiff
path: root/src/compiler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler.c')
-rw-r--r--src/compiler.c87
1 files changed, 38 insertions, 49 deletions
diff --git a/src/compiler.c b/src/compiler.c
index 5b48aaf..46d20a8 100644
--- a/src/compiler.c
+++ b/src/compiler.c
@@ -24,8 +24,8 @@ static usize strnlen(const char *str, usize max_length) {
return len;
}
-/* TODO: Allow to specify size and members? */
-static CHECK_RESULT int create_default_type(amal_compiler *compiler, const char *name, u32 num_pointers, u32 fixed_size, amal_default_type **default_type) {
+/* TODO: Allow to specify members? */
+static CHECK_RESULT int create_default_type(amal_compiler *compiler, const char *name, u32 num_pointers, u32 fixed_size, amal_default_type **default_type, bool is_signed) {
StructDecl *struct_decl;
Ast *expr;
LhsExpr *lhs_expr;
@@ -34,6 +34,7 @@ static CHECK_RESULT int create_default_type(amal_compiler *compiler, const char
return_if_error(structdecl_init(struct_decl, &compiler->root_scope, &compiler->allocator));
struct_decl->fields_num_pointers = num_pointers;
struct_decl->fields_fixed_size_bytes = fixed_size;
+ struct_decl->is_signed = is_signed;
return_if_error(arena_allocator_alloc(&compiler->allocator, sizeof(amal_default_type), (void**)default_type));
lhs_expr = &(*default_type)->lhs_expr;
@@ -48,41 +49,46 @@ static CHECK_RESULT int create_default_type(amal_compiler *compiler, const char
return scope_add_child(&compiler->root_scope, expr);
}
-static CHECK_RESULT int create_default_type_num_pointers(amal_compiler *compiler, const char *name, u32 num_pointers, amal_default_type **default_type) {
- return create_default_type(compiler, name, num_pointers, 0, default_type);
+static CHECK_RESULT int create_default_type_num_pointers(amal_compiler *compiler, const char *name, u32 num_pointers, amal_default_type **default_type, bool is_signed) {
+ return create_default_type(compiler, name, num_pointers, 0, default_type, is_signed);
}
-static CHECK_RESULT int create_default_type_fixed_size(amal_compiler *compiler, const char *name, u32 byte_size, amal_default_type **default_type) {
- return create_default_type(compiler, name, 0, byte_size, default_type);
+static CHECK_RESULT int create_default_type_fixed_size(amal_compiler *compiler, const char *name, u32 byte_size, amal_default_type **default_type, bool is_signed) {
+ return create_default_type(compiler, name, 0, byte_size, default_type, is_signed);
}
static CHECK_RESULT int init_default_types(amal_compiler *compiler) {
- /* POD */
- return_if_error(create_default_type_fixed_size(compiler, "i8", 1, &compiler->default_types.i8));
- return_if_error(create_default_type_fixed_size(compiler, "i16", 2, &compiler->default_types.i16));
- return_if_error(create_default_type_fixed_size(compiler, "i32", 4, &compiler->default_types.i32));
- return_if_error(create_default_type_fixed_size(compiler, "i64", 8, &compiler->default_types.i64));
- return_if_error(create_default_type_fixed_size(compiler, "u8", 1, &compiler->default_types.u8));
- return_if_error(create_default_type_fixed_size(compiler, "u16", 2, &compiler->default_types.u16));
- return_if_error(create_default_type_fixed_size(compiler, "u32", 4, &compiler->default_types.u32));
- return_if_error(create_default_type_fixed_size(compiler, "u64", 8, &compiler->default_types.u64));
- return_if_error(create_default_type_num_pointers(compiler, "isize", 1, &compiler->default_types.isize));
- return_if_error(create_default_type_num_pointers(compiler, "usize", 1, &compiler->default_types.usize));
- return_if_error(create_default_type_fixed_size(compiler, "f32", 4, &compiler->default_types.f32));
- return_if_error(create_default_type_fixed_size(compiler, "f64", 8, &compiler->default_types.f64));
- return_if_error(create_default_type_fixed_size(compiler, "bool", 1, &compiler->default_types.bool));
+ /* Plain old datatype */
+ return_if_error(create_default_type_fixed_size(compiler, "i8", 1, &compiler->default_types.i8, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "i16", 2, &compiler->default_types.i16, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "i32", 4, &compiler->default_types.i32, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "i64", 8, &compiler->default_types.i64, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "u8", 1, &compiler->default_types.u8, bool_false));
+ return_if_error(create_default_type_fixed_size(compiler, "u16", 2, &compiler->default_types.u16, bool_false));
+ return_if_error(create_default_type_fixed_size(compiler, "u32", 4, &compiler->default_types.u32, bool_false));
+ return_if_error(create_default_type_fixed_size(compiler, "u64", 8, &compiler->default_types.u64, bool_false));
+ return_if_error(create_default_type_num_pointers(compiler, "isize", 1, &compiler->default_types.isize, bool_true));
+ return_if_error(create_default_type_num_pointers(compiler, "usize", 1, &compiler->default_types.usize, bool_false));
+ return_if_error(create_default_type_fixed_size(compiler, "f32", 4, &compiler->default_types.f32, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "f64", 8, &compiler->default_types.f64, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "bool", 1, &compiler->default_types.bool, bool_false));
/* TODO: str should be a struct with the fields @data (ptr) and @size (usize) */
/* Types with more than one member */
- return_if_error(create_default_type_num_pointers(compiler, "str", 1, &compiler->default_types.str));
+ return_if_error(create_default_type_num_pointers(compiler, "str", 1, &compiler->default_types.str, bool_false));
/* C types */
- return_if_error(create_default_type_fixed_size(compiler, "c_char", sizeof(char), &compiler->default_types.c_char));
- return_if_error(create_default_type_fixed_size(compiler, "c_short", sizeof(short), &compiler->default_types.c_short));
- return_if_error(create_default_type_fixed_size(compiler, "c_int", sizeof(int), &compiler->default_types.c_int));
- return_if_error(create_default_type_fixed_size(compiler, "c_long", sizeof(long), &compiler->default_types.c_long));
- return_if_error(create_default_type_num_pointers(compiler, "c_void", 0, &compiler->default_types.c_void));
- return_if_error(create_default_type_num_pointers(compiler, "...", 0, &compiler->default_types.c_varargs));
+ /*
+ TODO: Have special handling for these. The size of these types should be the size of the C types
+ as they are on the machine that runs the final program, not the size of the machine that compiled
+ the program.
+ */
+ return_if_error(create_default_type_fixed_size(compiler, "c_char", sizeof(char), &compiler->default_types.c_char, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "c_short", sizeof(short), &compiler->default_types.c_short, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "c_int", sizeof(int), &compiler->default_types.c_int, bool_true));
+ return_if_error(create_default_type_fixed_size(compiler, "c_long", sizeof(long), &compiler->default_types.c_long, bool_true));
+ return_if_error(create_default_type_num_pointers(compiler, "c_void", 0, &compiler->default_types.c_void, bool_false));
+ return_if_error(create_default_type_num_pointers(compiler, "...", 0, &compiler->default_types.c_varargs, bool_false));
compiler->default_types.arithmetic_types[0] = compiler->default_types.i8;
compiler->default_types.arithmetic_types[1] = compiler->default_types.u8;
@@ -99,28 +105,6 @@ static CHECK_RESULT int init_default_types(amal_compiler *compiler) {
compiler->default_types.arithmetic_types[11] = compiler->default_types.c_short;
compiler->default_types.arithmetic_types[12] = compiler->default_types.c_int;
compiler->default_types.arithmetic_types[13] = compiler->default_types.c_long;
-
- compiler->default_types.i8->is_signed = bool_true;
- compiler->default_types.u8->is_signed = bool_false;
- compiler->default_types.i16->is_signed = bool_true;
- compiler->default_types.u16->is_signed = bool_false;
- compiler->default_types.i32->is_signed = bool_true;
- compiler->default_types.u32->is_signed = bool_false;
- compiler->default_types.i64->is_signed = bool_true;
- compiler->default_types.u64->is_signed = bool_false;
- compiler->default_types.isize->is_signed = bool_true;
- compiler->default_types.usize->is_signed = bool_false;
- compiler->default_types.f32->is_signed = bool_true;
- compiler->default_types.f64->is_signed = bool_true;
- compiler->default_types.bool->is_signed = bool_false;
- compiler->default_types.str->is_signed = bool_false;
-
- compiler->default_types.c_char->is_signed = bool_true;
- compiler->default_types.c_short->is_signed = bool_true;
- compiler->default_types.c_int->is_signed = bool_true;
- compiler->default_types.c_long->is_signed = bool_true;
- compiler->default_types.c_void->is_signed = bool_false;
- compiler->default_types.c_varargs->is_signed = bool_false;
return 0;
}
@@ -135,6 +119,11 @@ bool is_arithmetic_type(LhsExpr *expr, amal_compiler *compiler) {
return bool_false;
}
+bool amal_default_type_is_signed(amal_default_type *self) {
+ assert(self->lhs_expr.rhs_expr && self->lhs_expr.rhs_expr->type == AST_STRUCT_DECL);
+ return self->lhs_expr.rhs_expr->value.struct_decl->is_signed;
+}
+
void amal_compiler_options_init(amal_compiler_options *self) {
self->error_callback = NULL;
self->error_callback_userdata = NULL;