diff options
Diffstat (limited to 'src/compiler.c')
-rw-r--r-- | src/compiler.c | 87 |
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; |