From c4fe2ace0595ae51f620aaada1807295e41cd6b5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 17 Aug 2016 12:04:17 +0100 Subject: Fix Scoping of proc type decls --- src/codegen/print_llvm.cpp | 7 ++++++- src/codegen/ssa.cpp | 13 ++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) (limited to 'src/codegen') diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp index 366405c3b..d2394f202 100644 --- a/src/codegen/print_llvm.cpp +++ b/src/codegen/print_llvm.cpp @@ -144,7 +144,12 @@ void ssa_print_type(gbFile *f, BaseTypeSizes s, Type *t) { if (i > 0) { ssa_fprintf(f, ", "); } - ssa_print_type(f, s, t->structure.fields[i]->type); + Type *ft = t->structure.fields[i]->type; + Type *bft = get_base_type(ft); + if (bft->kind != Type_Structure) { + ft = bft; + } + ssa_print_type(f, s, ft); } ssa_fprintf(f, "}"); if (t->structure.is_packed) { diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp index 777809043..fbf1f8d7f 100644 --- a/src/codegen/ssa.cpp +++ b/src/codegen/ssa.cpp @@ -1824,7 +1824,8 @@ ssaValue *ssa_build_expr(ssaProcedure *proc, AstNode *expr) { ssaValue *value = NULL; if (tv->mode == Addressing_Variable) { - value = ssa_lvalue_load(proc, ssa_build_addr(proc, expr)); + ssaLvalue addr = ssa_build_addr(proc, expr); + value = ssa_lvalue_load(proc, addr); } else { value = ssa_build_single_expr(proc, expr, tv); } @@ -1844,7 +1845,11 @@ ssaLvalue ssa_build_addr(ssaProcedure *proc, AstNode *expr) { Entity *e = entity_of_ident(proc->module->info, expr); ssaValue *v = NULL; ssaValue **found = map_get(&proc->module->values, hash_pointer(e)); - if (found) v = *found; + if (found) { + v = *found; + } else { + GB_PANIC("Unknown value: %s, entity: %p\n", expr_to_string(expr), e); + } return ssa_make_lvalue(v, expr); case_end; @@ -1860,17 +1865,15 @@ ssaLvalue ssa_build_addr(ssaProcedure *proc, AstNode *expr) { GB_ASSERT(entity != NULL); ssaValue *e = ssa_build_addr(proc, se->expr).address; - Type *gep_type = entity->type; if (is_type_pointer(type)) { // NOTE(bill): Allow x^.y and x.y to be the same - gep_type = type_deref(gep_type); e = ssa_emit_load(proc, e); e = ssa_emit_ptr_offset(proc, e, v_zero); ssa_value_set_type(e, type_deref(type)); } - ssaValue *v = ssa_emit_struct_gep(proc, e, field_index, gep_type); + ssaValue *v = ssa_emit_struct_gep(proc, e, field_index, entity->type); return ssa_make_lvalue(v, expr); case_end; -- cgit v1.2.3