aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/print_llvm.cpp9
-rw-r--r--src/codegen/ssa.cpp53
2 files changed, 20 insertions, 42 deletions
diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp
index 301bfd924..313299552 100644
--- a/src/codegen/print_llvm.cpp
+++ b/src/codegen/print_llvm.cpp
@@ -396,18 +396,11 @@ void ssa_print_instr(ssaFileBuffer *f, ssaModule *m, ssaValue *value) {
ssa_fprintf(f, "%%%d = alloca ", value->id);
ssa_print_type(f, m, type);
ssa_fprintf(f, ", align %lld\n", type_align_of(m->sizes, m->allocator, type));
- // if (instr->Local.zero_initialized) {
- // ssa_fprintf(f, "\tstore ");
- // ssa_print_type(f, m, type);
- // ssa_fprintf(f, " zeroinitializer, ");
- // ssa_print_type(f, m, type);
- // ssa_fprintf(f, "* %%%d\n", value->id);
- // }
} break;
case ssaInstr_ZeroInit: {
Type *type = type_deref(ssa_type(instr->ZeroInit.address));
- ssa_fprintf(f, "\tstore ");
+ ssa_fprintf(f, "store ");
ssa_print_type(f, m, type);
ssa_fprintf(f, " zeroinitializer, ");
ssa_print_type(f, m, type);
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp
index d04938f26..9342e5931 100644
--- a/src/codegen/ssa.cpp
+++ b/src/codegen/ssa.cpp
@@ -385,12 +385,8 @@ void ssa_init_module(ssaModule *m, Checker *c) {
// Add type info data
{
String name = make_string(SSA_TYPE_INFO_DATA_NAME);
- Token token = {Token_Identifier};
- token.string = name;
-
-
isize count = gb_array_count(c->info.type_info_map.entries);
- Entity *e = make_entity_variable(m->allocator, NULL, token, make_type_array(m->allocator, t_type_info, count));
+ Entity *e = make_entity_variable(m->allocator, NULL, make_token_ident(name), make_type_array(m->allocator, t_type_info, count));
ssaValue *g = ssa_make_value_global(m->allocator, e, NULL);
g->Global.is_private = true;
ssa_module_add_value(m, e, g);
@@ -421,10 +417,7 @@ void ssa_init_module(ssaModule *m, Checker *c) {
}
String name = make_string(SSA_TYPE_INFO_DATA_MEMBER_NAME);
- Token token = {Token_Identifier};
- token.string = name;
-
- Entity *e = make_entity_variable(m->allocator, NULL, token,
+ Entity *e = make_entity_variable(m->allocator, NULL, make_token_ident(name),
make_type_array(m->allocator, t_type_info_member, count));
ssaValue *g = ssa_make_value_global(m->allocator, e, NULL);
ssa_module_add_value(m, e, g);
@@ -1095,6 +1088,10 @@ void ssa_end_procedure_body(ssaProcedure *proc) {
ssa_emit_ret(proc, NULL);
}
+ if (gb_array_count(proc->curr_block->instrs) == 0) {
+ ssa_emit_unreachable(proc);
+ }
+
proc->curr_block = proc->decl_block;
ssa_emit_jump(proc, proc->entry_block);
@@ -1560,14 +1557,10 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t, b32 is_arg
Type *src = get_enum_base_type(get_base_type(src_type));
Type *dst = get_enum_base_type(get_base_type(t));
- if (are_types_identical(src, dst)) {
- return value;
- }
if (value->kind == ssaValue_Constant) {
if (is_type_any(dst)) {
- Type *dt = default_type(get_base_type(src_type));
- ssaValue *default_value = ssa_add_local_generated(proc, dt);
+ ssaValue *default_value = ssa_add_local_generated(proc, default_type(src_type));
ssa_emit_store(proc, default_value, value);
return ssa_emit_conv(proc, ssa_emit_load(proc, default_value), t_any, is_argument);
} else if (dst->kind == Type_Basic) {
@@ -1587,6 +1580,10 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t, b32 is_arg
}
}
+ if (are_types_identical(src, dst)) {
+ return value;
+ }
+
// integer -> integer
if (is_type_integer(src) && is_type_integer(dst)) {
GB_ASSERT(src->kind == Type_Basic &&
@@ -1684,7 +1681,7 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t, b32 is_arg
// gb_printf("field_name: %.*s\n", LIT(field_name));
if (field_name.len > 0) {
// NOTE(bill): It can be casted
- Selection sel = lookup_field(sb, field_name, false);
+ Selection sel = lookup_field(proc->module->allocator, sb, field_name, false);
if (sel.entity != NULL) {
ssa_emit_comment(proc, make_string("cast - polymorphism"));
if (src_is_ptr) {
@@ -1821,7 +1818,7 @@ ssaValue *ssa_emit_down_cast(ssaProcedure *proc, ssaValue *value, Type *t) {
String field_name = check_down_cast_name(t, type_deref(ssa_type(value)));
GB_ASSERT(field_name.len > 0);
- Selection sel = lookup_field(t, field_name, false);
+ Selection sel = lookup_field(proc->module->allocator, t, field_name, false);
Type *t_u8_ptr = make_type_pointer(allocator, t_u8);
ssaValue *bytes = ssa_emit_conv(proc, value, t_u8_ptr);
@@ -2088,11 +2085,11 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
if (elem->kind == AstNode_FieldValue) {
ast_node(kv, FieldValue, elem);
- Selection sel = lookup_field(base_type, kv->field->Ident.string, false);
+ Selection sel = lookup_field(proc->module->allocator, base_type, kv->field->Ident.string, false);
index = sel.index[0];
field_expr = ssa_build_expr(proc, kv->value);
} else {
- Selection sel = lookup_field(base_type, st->fields_in_src_order[field_index]->token.string, false);
+ Selection sel = lookup_field(proc->module->allocator, base_type, st->fields_in_src_order[field_index]->token.string, false);
index = sel.index[0];
field_expr = ssa_build_expr(proc, elem);
}
@@ -2158,7 +2155,6 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
Entity *e = *found;
switch (e->Builtin.id) {
case BuiltinProc_type_info: {
- ssaValue *x = ssa_build_expr(proc, ce->args[0]);
Type *t = default_type(type_of_expr(proc->module->info, ce->args[0]));
return ssa_type_info(proc, t);
} break;
@@ -2629,7 +2625,7 @@ ssaValue *ssa_add_using_variable(ssaProcedure *proc, Entity *e) {
p = ssa_add_using_variable(proc, parent);
}
- Selection sel = lookup_field(parent->type, name, false);
+ Selection sel = lookup_field(proc->module->allocator, parent->type, name, false);
GB_ASSERT(sel.entity != NULL);
ssaValue **pv = map_get(&proc->module->values, hash_pointer(parent));
ssaValue *v = NULL;
@@ -2694,25 +2690,14 @@ ssaAddr ssa_build_addr(ssaProcedure *proc, AstNode *expr) {
Type *type = get_base_type(type_of_expr(proc->module->info, se->expr));
if (type == t_invalid) {
- // Imports
+ // NOTE(bill): Imports
Entity *imp = entity_of_ident(proc->module->info, se->expr);
if (imp != NULL) {
GB_ASSERT(imp->kind == Entity_ImportName);
}
return ssa_build_addr(proc, unparen_expr(se->selector));
- } /* else if (type == t_string) {
- Selection sel = lookup_field(type, selector, false);
- GB_ASSERT(sel.entity != NULL);
-
- // NOTE(bill): This could a constant and the only non constant
- // selector is the `.data`, so build the expression instead
- ssaValue *e = ssa_build_expr(proc, se->expr);
- ssaValue *a = ssa_build_addr(proc, se->expr).addr;
-
- a = ssa_emit_deep_field_gep(proc, type, a, sel);
- return ssa_make_addr(a, expr);
- } */else {
- Selection sel = lookup_field(type, selector, false);
+ } else {
+ Selection sel = lookup_field(proc->module->allocator, type, selector, false);
GB_ASSERT(sel.entity != NULL);
ssaValue *a = ssa_build_addr(proc, se->expr).addr;