diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-09-14 19:35:13 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-09-14 19:35:13 +0100 |
| commit | 79f575ae8e7dda58a842dda3690b691e942ea86e (patch) | |
| tree | ae339da6303711c3dad8815ef3ba0ea18ae31e2f /src/codegen | |
| parent | bb109b47d6b43547481a695ed9401aca95cbdf0e (diff) | |
#import "" as namespace
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/codegen.cpp | 1 | ||||
| -rw-r--r-- | src/codegen/print_llvm.cpp | 81 | ||||
| -rw-r--r-- | src/codegen/ssa.cpp | 24 |
3 files changed, 68 insertions, 38 deletions
diff --git a/src/codegen/codegen.cpp b/src/codegen/codegen.cpp index 43f894fb4..f45c852c8 100644 --- a/src/codegen/codegen.cpp +++ b/src/codegen/codegen.cpp @@ -84,6 +84,7 @@ void ssa_gen_tree(ssaGen *s) { if (str[i] == '\\') { str[i] = '/'; } + } char const *base = gb_path_base_name(str); char const *ext = gb_path_extension(base); diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp index 7ec3b369d..1015207c4 100644 --- a/src/codegen/print_llvm.cpp +++ b/src/codegen/print_llvm.cpp @@ -744,7 +744,7 @@ void ssa_print_instr(ssaFileBuffer *f, ssaModule *m, ssaValue *value) { void ssa_print_proc(ssaFileBuffer *f, ssaModule *m, ssaProcedure *proc) { if (proc->body == NULL) { - ssa_fprintf(f, "\ndeclare "); + ssa_fprintf(f, "declare "); } else { ssa_fprintf(f, "\ndefine "); } @@ -844,47 +844,64 @@ void ssa_print_llvm_ir(ssaFileBuffer *f, ssaModule *m) { gb_for_array(member_index, m->members.entries) { auto *entry = &m->members.entries[member_index]; ssaValue *v = entry->value; - switch (v->kind) { - case ssaValue_TypeName: - ssa_print_type_name(f, m, v); - break; + if (v->kind != ssaValue_TypeName) { + continue; } + ssa_print_type_name(f, m, v); } gb_for_array(member_index, m->members.entries) { auto *entry = &m->members.entries[member_index]; ssaValue *v = entry->value; - switch (v->kind) { - case ssaValue_Global: { - auto *g = &v->Global; - ssa_print_encoded_global(f, g->entity->token.string); - ssa_fprintf(f, " = "); - if (g->is_thread_local) { - ssa_fprintf(f, "thread_local "); - } - if (g->is_constant) { - if (g->is_private) { - ssa_fprintf(f, "private "); - } - ssa_fprintf(f, "constant "); - } else { - ssa_fprintf(f, "global "); - } + if (v->kind != ssaValue_Proc) { + continue; + } + if (v->Proc.body == NULL) { + ssa_print_proc(f, m, &v->Proc); + } + } + gb_for_array(member_index, m->members.entries) { + auto *entry = &m->members.entries[member_index]; + ssaValue *v = entry->value; + if (v->kind != ssaValue_Proc) { + continue; + } + if (v->Proc.body != NULL) { + ssa_print_proc(f, m, &v->Proc); + } + } - ssa_print_type(f, m->sizes, g->entity->type); - ssa_fprintf(f, " "); - if (g->value != NULL) { - ssa_print_value(f, m, g->value, g->entity->type); - } else { - ssa_fprintf(f, "zeroinitializer"); + + gb_for_array(member_index, m->members.entries) { + auto *entry = &m->members.entries[member_index]; + ssaValue *v = entry->value; + if (v->kind != ssaValue_Global) { + continue; + } + auto *g = &v->Global; + ssa_print_encoded_global(f, g->entity->token.string); + ssa_fprintf(f, " = "); + if (g->is_thread_local) { + ssa_fprintf(f, "thread_local "); + } + if (g->is_constant) { + if (g->is_private) { + ssa_fprintf(f, "private "); } - ssa_fprintf(f, "\n"); - } break; + ssa_fprintf(f, "constant "); + } else { + ssa_fprintf(f, "global "); + } - case ssaValue_Proc: { - ssa_print_proc(f, m, &v->Proc); - } break; + + ssa_print_type(f, m->sizes, g->entity->type); + ssa_fprintf(f, " "); + if (g->value != NULL) { + ssa_print_value(f, m, g->value, g->entity->type); + } else { + ssa_fprintf(f, "zeroinitializer"); } + ssa_fprintf(f, "\n"); } } 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); |