From bbc9739f5c1f6fa4dc8ad36aed7bcb1cba2eadea Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Mon, 19 Sep 2016 11:51:21 +0100 Subject: Core library and Better name mangling for files --- src/codegen/ssa.cpp | 81 ++++++++++++++++++++++------------------------------- 1 file changed, 33 insertions(+), 48 deletions(-) (limited to 'src/codegen/ssa.cpp') diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp index a2ff2a50a..630c702ab 100644 --- a/src/codegen/ssa.cpp +++ b/src/codegen/ssa.cpp @@ -57,6 +57,7 @@ struct ssaModule { Map values; // Key: Entity * Map members; // Key: String + Map type_names; // Key: Type * Map debug_info; // Key: Unique pointer i32 global_string_index; }; @@ -330,7 +331,6 @@ struct ssaAddr { ssaValue *addr; AstNode *expr; // NOTE(bill): Just for testing - probably remove later - // HACK(bill): Fix how lvalues for vectors work b32 is_vector; ssaValue *index; }; @@ -371,6 +371,7 @@ void ssa_init_module(ssaModule *m, Checker *c) { map_init(&m->values, gb_heap_allocator()); map_init(&m->members, gb_heap_allocator()); map_init(&m->debug_info, gb_heap_allocator()); + map_init(&m->type_names, gb_heap_allocator()); // Default states m->stmt_state_flags = 0; @@ -439,6 +440,7 @@ void ssa_init_module(ssaModule *m, Checker *c) { void ssa_destroy_module(ssaModule *m) { map_destroy(&m->values); map_destroy(&m->members); + map_destroy(&m->type_names); map_destroy(&m->debug_info); gb_arena_free(&m->arena); } @@ -962,7 +964,7 @@ void ssa_emit_jump(ssaProcedure *proc, ssaBlock *block); void ssa_build_defer_stmt(ssaProcedure *proc, ssaDefer d) { ssaBlock *b = ssa__make_block(proc, NULL, make_string("defer")); - // HACK(bill): The prev block may defer injection before it's terminator + // NOTE(bill): The prev block may defer injection before it's terminator ssaInstr *last_instr = ssa_get_last_instr(proc->curr_block); if (last_instr == NULL || !ssa_is_instr_terminating(last_instr)) { ssa_emit_jump(proc, b); @@ -1031,17 +1033,14 @@ void ssa_emit_no_op(ssaProcedure *proc) { ssaValue *ssa_lvalue_store(ssaProcedure *proc, ssaAddr lval, ssaValue *value) { if (lval.addr != NULL) { if (lval.is_vector) { - // HACK(bill): Fix how lvalues for vectors work ssaValue *v = ssa_emit_load(proc, lval.addr); Type *elem_type = get_base_type(ssa_type(v))->Vector.elem; ssaValue *elem = ssa_emit_conv(proc, value, elem_type); ssaValue *out = ssa_emit(proc, ssa_make_instr_insert_element(proc, v, elem, lval.index)); return ssa_emit_store(proc, lval.addr, out); } else { - // gb_printf_err("%s <- %s\n", type_to_string(ssa_addr_type(lval)), type_to_string(ssa_type(value))); - // gb_printf_err("%.*s - %s\n", LIT(ast_node_strings[lval.expr->kind]), expr_to_string(lval.expr)); - value = ssa_emit_conv(proc, value, ssa_addr_type(lval)); - return ssa_emit_store(proc, lval.addr, value); + ssaValue *v = ssa_emit_conv(proc, value, ssa_addr_type(lval)); + return ssa_emit_store(proc, lval.addr, v); } } return NULL; @@ -1049,11 +1048,10 @@ ssaValue *ssa_lvalue_store(ssaProcedure *proc, ssaAddr lval, ssaValue *value) { ssaValue *ssa_lvalue_load(ssaProcedure *proc, ssaAddr lval) { if (lval.addr != NULL) { if (lval.is_vector) { - // HACK(bill): Fix how lvalues for vectors work ssaValue *v = ssa_emit_load(proc, lval.addr); return ssa_emit(proc, ssa_make_instr_extract_element(proc, v, lval.index)); } - // HACK(bill): Imported procedures don't require a load + // NOTE(bill): Imported procedures don't require a load as they are pointers Type *t = get_base_type(ssa_type(lval.addr)); if (t->kind == Type_Proc) { return lval.addr; @@ -2239,8 +2237,8 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue err_len += 20; err_len += gb_string_length(expr); err_len += 2; - // HACK(bill): memory leaks - u8 *err_str = gb_alloc_array(gb_heap_allocator(), u8, err_len); + + u8 *err_str = gb_alloc_array(proc->module->allocator, u8, err_len); err_len = gb_snprintf(cast(char *)err_str, err_len, "%.*s(%td:%td) Runtime assertion: %s\n", LIT(pos.file), pos.line, pos.column, expr); @@ -2718,7 +2716,6 @@ ssaAddr ssa_build_addr(ssaProcedure *proc, AstNode *expr) { switch (be->op.kind) { case Token_as: { ssa_emit_comment(proc, make_string("Cast - as")); - // HACK(bill): Do have to make new variable to do this? // NOTE(bill): Needed for dereference of pointer conversion Type *type = type_of_expr(proc->module->info, expr); ssaValue *v = ssa_add_local_generated(proc, type); @@ -2727,7 +2724,6 @@ ssaAddr ssa_build_addr(ssaProcedure *proc, AstNode *expr) { } case Token_transmute: { ssa_emit_comment(proc, make_string("Cast - transmute")); - // HACK(bill): Do have to make new variable to do this? // NOTE(bill): Needed for dereference of pointer conversion Type *type = type_of_expr(proc->module->info, expr); ssaValue *v = ssa_add_local_generated(proc, type); @@ -2747,7 +2743,6 @@ ssaAddr ssa_build_addr(ssaProcedure *proc, AstNode *expr) { switch (t->kind) { case Type_Vector: { - // HACK(bill): Fix how lvalues for vectors work ssaValue *vector = ssa_build_addr(proc, ie->expr).addr; ssaValue *index = ssa_emit_conv(proc, ssa_build_expr(proc, ie->index), t_int); ssaValue *len = ssa_make_const_int(a, t->Vector.count); @@ -2961,6 +2956,27 @@ void ssa_build_cond(ssaProcedure *proc, AstNode *cond, ssaBlock *true_block, ssa ssa_emit_if(proc, expr, true_block, false_block); } +void ssa_gen_global_type_name(ssaModule *m, Entity *e, String name); +void ssa_mangle_sub_type_name(ssaModule *m, Entity *field, String parent) { + if (field->kind != Entity_TypeName) { + return; + } + auto *tn = &field->type->Named; + String cn = field->token.string; + + isize len = parent.len + 1 + cn.len; + String child = {NULL, len}; + child.text = gb_alloc_array(m->allocator, u8, len); + + isize i = 0; + gb_memcopy(child.text+i, parent.text, parent.len); + i += parent.len; + child.text[i++] = '.'; + gb_memcopy(child.text+i, cn.text, cn.len); + + map_set(&m->type_names, hash_pointer(field->type), child); + ssa_gen_global_type_name(m, field, child); +} void ssa_gen_global_type_name(ssaModule *m, Entity *e, String name) { ssaValue *t = ssa_make_value_type_name(m->allocator, name, e->type); @@ -2971,22 +2987,7 @@ void ssa_gen_global_type_name(ssaModule *m, Entity *e, String name) { if (bt->kind == Type_Record) { auto *s = &bt->Record; for (isize j = 0; j < s->other_field_count; j++) { - Entity *field = s->other_fields[j]; - if (field->kind == Entity_TypeName) { - // HACK(bill): Override name of type so printer prints it correctly - auto *tn = &field->type->Named; - String cn = field->token.string; - isize len = name.len + 1 + cn.len; - String child = {NULL, len}; - child.text = gb_alloc_array(m->allocator, u8, len); - isize i = 0; - gb_memcopy(child.text+i, name.text, name.len); - i += name.len; - child.text[i++] = '.'; - gb_memcopy(child.text+i, cn.text, cn.len); - tn->name = child; - ssa_gen_global_type_name(m, field, tn->name); - } + ssa_mangle_sub_type_name(m, s->other_fields[j], name); } } @@ -2994,22 +2995,7 @@ void ssa_gen_global_type_name(ssaModule *m, Entity *e, String name) { auto *s = &bt->Record; // NOTE(bill): Zeroth entry is null (for `match type` stmts) for (isize j = 1; j < s->field_count; j++) { - Entity *field = s->fields[j]; - if (field->kind == Entity_TypeName) { - // HACK(bill): Override name of type so printer prints it correctly - auto *tn = &field->type->Named; - String cn = field->token.string; - isize len = name.len + 1 + cn.len; - String child = {NULL, len}; - child.text = gb_alloc_array(m->allocator, u8, len); - isize i = 0; - gb_memcopy(child.text+i, name.text, name.len); - i += name.len; - child.text[i++] = '.'; - gb_memcopy(child.text+i, cn.text, cn.len); - tn->name = child; - ssa_gen_global_type_name(m, field, tn->name); - } + ssa_mangle_sub_type_name(m, s->fields[j], name); } } } @@ -3199,8 +3185,7 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { Entity *e = *found; ssaValue *value = ssa_make_value_type_name(proc->module->allocator, name, e->type); - // HACK(bill): Override name of type so printer prints it correctly - e->type->Named.name = name; + map_set(&proc->module->type_names, hash_pointer(e->type), name); ssa_gen_global_type_name(proc->module, e, name); case_end; -- cgit v1.2.3