diff options
Diffstat (limited to 'src/codegen/ssa.cpp')
| -rw-r--r-- | src/codegen/ssa.cpp | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp index 89443a1dd..268778493 100644 --- a/src/codegen/ssa.cpp +++ b/src/codegen/ssa.cpp @@ -927,6 +927,11 @@ ssaValue *ssa_lvalue_load(ssaProcedure *proc, ssaAddr lval) { 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 + Type *t = get_base_type(ssa_type(lval.addr)); + if (t->kind == Type_Proc) { + return lval.addr; + } return ssa_emit_load(proc, lval.addr); } GB_PANIC("Illegal lvalue load"); @@ -2519,13 +2524,20 @@ ssaAddr ssa_build_addr(ssaProcedure *proc, AstNode *expr) { case_ast_node(se, SelectorExpr, expr); ssa_emit_comment(proc, make_string("SelectorExpr")); Type *type = get_base_type(type_of_expr(proc->module->info, se->expr)); + String selector = unparen_expr(se->selector)->Ident.string; + if (type == t_invalid) { + Entity *imp = entity_of_ident(proc->module->info, se->expr); + GB_ASSERT(imp->kind == Entity_ImportName); + // Entity *e = scope_lookup_entity(e->ImportName.scope, selector); + return ssa_build_addr(proc, unparen_expr(se->selector)); + } else { + Selection sel = lookup_field(type, selector, false); + GB_ASSERT(sel.entity != NULL); - Selection sel = lookup_field(type, unparen_expr(se->selector)->Ident.string, false); - GB_ASSERT(sel.entity != NULL); - - ssaValue *e = ssa_build_addr(proc, se->expr).addr; - e = ssa_emit_deep_field_gep(proc, type, e, sel); - return ssa_make_addr(e, expr); + ssaValue *e = ssa_build_addr(proc, se->expr).addr; + e = ssa_emit_deep_field_gep(proc, type, e, sel); + return ssa_make_addr(e, expr); + } case_end; case_ast_node(ue, UnaryExpr, expr); |