From 59b0cf61efdccc44efafda24ff59399dde6afc4d Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Mon, 19 Sep 2016 23:59:26 +0100 Subject: fmt improvement; Minor refactoring --- src/codegen/print_llvm.cpp | 9 +------- src/codegen/ssa.cpp | 53 +++++++++++++++++----------------------------- 2 files changed, 20 insertions(+), 42 deletions(-) (limited to 'src/codegen') 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; -- cgit v1.2.3