aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/codegen.cpp1
-rw-r--r--src/codegen/print_llvm.cpp81
-rw-r--r--src/codegen/ssa.cpp24
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);