diff options
| author | gingerBill <bill@gingerbill.org> | 2022-03-19 13:40:29 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-03-19 13:40:29 +0000 |
| commit | 921601766d46c5c05b19ad12e5483bb0a5ae60d1 (patch) | |
| tree | 06fd39d3a9317bfea043dc11896a75b4fb8bd613 /src/middle_end.cpp | |
| parent | 246bd8ca6acf33002cf7d86fd6837c1a85b5a036 (diff) | |
Begin mocking out `me_build_stmt`middle-end
Diffstat (limited to 'src/middle_end.cpp')
| -rw-r--r-- | src/middle_end.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/middle_end.cpp b/src/middle_end.cpp index 7de7691f3..63f2c958d 100644 --- a/src/middle_end.cpp +++ b/src/middle_end.cpp @@ -1,5 +1,7 @@ #include "middle_end.hpp" #include "middle_end_core.cpp" +#include "middle_end_stmt.cpp" +#include "middle_end_expr.cpp" void me_module_init(meModule *m, Checker *c) { @@ -250,6 +252,46 @@ void me_procedure_body_end(meProcedure *p) { } +void me_build_nested_proc(meProcedure *p, AstProcLit *pd, Entity *e) { + GB_ASSERT(pd->body != nullptr); + meModule *m = p->module; + auto *min_dep_set = &m->info->minimum_dependency_set; + + if (ptr_set_exists(min_dep_set, e) == false) { + // NOTE(bill): Nothing depends upon it so doesn't need to be built + return; + } + + // NOTE(bill): Generate a new name + // parent.name-guid + String original_name = e->token.string; + String pd_name = original_name; + if (e->Procedure.link_name.len > 0) { + pd_name = e->Procedure.link_name; + } + + + isize name_len = p->name.len + 1 + pd_name.len + 1 + 10 + 1; + char *name_text = gb_alloc_array(permanent_allocator(), char, name_len); + + i32 guid = cast(i32)p->children.count; + name_len = gb_snprintf(name_text, name_len, "%.*s.%.*s-%d", LIT(p->name), LIT(pd_name), guid); + String name = make_string(cast(u8 *)name_text, name_len-1); + + e->Procedure.link_name = name; + + meProcedure *nested_proc = me_procedure_create(p->module, e); + e->me_procedure = nested_proc; + + meValue value = me_value(nested_proc); + + me_add_entity(m, e, value); + array_add(&p->children, nested_proc); + array_add(&m->procedures_to_generate, nested_proc); +} + + + void me_generate_procedure(meModule *m, meProcedure *p) { if (p->is_done) { return; |