aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp96
1 files changed, 66 insertions, 30 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 673cb5a54..0fe5f544e 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -20,10 +20,12 @@ struct irModule {
// String triple;
PtrSet<Entity *> min_dep_set;
- Map<irValue *> values; // Key: Entity *
- Map<irValue *> members; // Key: String
- Map<String> entity_names; // Key: Entity * of the typename
- Map<irDebugInfo *> debug_info; // Key: Unique pointer
+ Map<irValue *> values; // Key: Entity *
+ Map<irValue *> members; // Key: String
+ Map<String> entity_names; // Key: Entity * of the typename
+ Map<irDebugInfo *> debug_info; // Key: Unique pointer
+ Map<irValue *> anonymous_proc_lits; // Key: AstNode *
+
i32 global_string_index;
i32 global_array_index; // For ConstantSlice
i32 global_generated_index;
@@ -3720,6 +3722,38 @@ void ir_pop_target_list(irProcedure *proc) {
}
+
+irValue *ir_gen_anonymous_proc_lit(irModule *m, String prefix_name, AstNode *expr, irProcedure *proc = nullptr) {
+ ast_node(pl, ProcLit, expr);
+
+ // NOTE(bill): Generate a new name
+ // parent$count
+ isize name_len = prefix_name.len + 1 + 8 + 1;
+ u8 *name_text = gb_alloc_array(m->allocator, u8, name_len);
+ i32 name_id = cast(i32)m->anonymous_proc_lits.entries.count;
+
+ name_len = gb_snprintf(cast(char *)name_text, name_len, "%.*s$anon-%d", LIT(prefix_name), name_id);
+ String name = make_string(name_text, name_len-1);
+
+ Type *type = type_of_expr(m->info, expr);
+ irValue *value = ir_value_procedure(m->allocator,
+ m, nullptr, type, pl->type, pl->body, name);
+
+ value->Proc.tags = pl->tags;
+ value->Proc.parent = proc;
+
+ array_add(&m->procs_to_generate, value);
+ if (proc != nullptr) {
+ array_add(&proc->children, &value->Proc);
+ } else {
+ map_set(&m->members, hash_string(name), value);
+ }
+
+ map_set(&m->anonymous_proc_lits, hash_pointer(expr), value);
+
+ return value;
+}
+
void ir_gen_global_type_name(irModule *m, Entity *e, String name) {
if (e->type == nullptr) return;
@@ -3759,13 +3793,29 @@ void ir_gen_global_type_name(irModule *m, Entity *e, String name) {
}
#endif
+ // if (bt->kind == Type_Struct) {
+ // Scope *s = bt->Struct.scope;
+ // if (s != nullptr) {
+ // for_array(i, s->elements.entries) {
+ // Entity *e = s->elements.entries[i].value;
+ // if (e->kind == Entity_TypeName) {
+ // ir_mangle_add_sub_type_name(m, e, name);
+ // }
+ // }
+ // }
+ // }
+
if (bt->kind == Type_Struct) {
- Scope *s = bt->Struct.scope;
- if (s != nullptr) {
- for_array(i, s->elements.entries) {
- Entity *e = s->elements.entries[i].value;
- if (e->kind == Entity_TypeName) {
- ir_mangle_add_sub_type_name(m, e, name);
+ if (bt->Struct.has_proc_default_values) {
+ for_array(i, bt->Struct.fields) {
+ Entity *f = bt->Struct.fields[i];
+ if (f->kind == Entity_Variable) {
+ if (f->Variable.default_value.kind == ExactValue_Procedure) {
+ AstNode *expr = f->Variable.default_value.value_procedure;
+ GB_ASSERT(expr != nullptr);
+ GB_ASSERT(expr->kind == AstNode_ProcLit);
+ ir_gen_anonymous_proc_lit(m, e->token.string, expr);
+ }
}
}
}
@@ -4563,7 +4613,6 @@ irValue *ir_build_builtin_proc(irProcedure *proc, AstNode *expr, TypeAndValue tv
return nullptr;
}
-
irValue *ir_build_expr(irProcedure *proc, AstNode *expr) {
expr = unparen_expr(expr);
@@ -4832,24 +4881,7 @@ irValue *ir_build_expr(irProcedure *proc, AstNode *expr) {
case_end;
case_ast_node(pl, ProcLit, expr);
- // NOTE(bill): Generate a new name
- // parent$count
- isize name_len = proc->name.len + 1 + 8 + 1;
- u8 *name_text = gb_alloc_array(proc->module->allocator, u8, name_len);
- name_len = gb_snprintf(cast(char *)name_text, name_len, "%.*s$%d", LIT(proc->name), cast(i32)proc->children.count);
- String name = make_string(name_text, name_len-1);
-
- Type *type = type_of_expr(proc->module->info, expr);
- irValue *value = ir_value_procedure(proc->module->allocator,
- proc->module, nullptr, type, pl->type, pl->body, name);
-
- value->Proc.tags = pl->tags;
- value->Proc.parent = proc;
-
- array_add(&proc->children, &value->Proc);
- array_add(&proc->module->procs_to_generate, value);
-
- return value;
+ return ir_gen_anonymous_proc_lit(proc->module, proc->name, expr, proc);
case_end;
@@ -7424,6 +7456,7 @@ void ir_init_module(irModule *m, Checker *c) {
map_init(&m->members, heap_allocator());
map_init(&m->debug_info, heap_allocator());
map_init(&m->entity_names, heap_allocator());
+ map_init(&m->anonymous_proc_lits, heap_allocator());
array_init(&m->procs, heap_allocator());
array_init(&m->procs_to_generate, heap_allocator());
array_init(&m->foreign_library_paths, heap_allocator());
@@ -7532,6 +7565,7 @@ void ir_destroy_module(irModule *m) {
map_destroy(&m->values);
map_destroy(&m->members);
map_destroy(&m->entity_names);
+ map_destroy(&m->anonymous_proc_lits);
map_destroy(&m->debug_info);
map_destroy(&m->const_strings);
array_free(&m->procs);
@@ -8535,7 +8569,9 @@ void ir_gen_tree(irGen *s) {
for_array(i, m->procs_to_generate) {
- ir_build_proc(m->procs_to_generate[i], m->procs_to_generate[i]->Proc.parent);
+ irValue *p = m->procs_to_generate[i];
+ gb_printf_err("%.*s\n", LIT(p->Proc.name));
+ ir_build_proc(p, p->Proc.parent);
}
// Number debug info