From d25d95615332fdec44aa69aa518b0232505c1323 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Thu, 8 Dec 2022 20:42:01 -0500 Subject: [PATCH] added proper module init sequencing --- cerise/backend/ssa/codegen.c | 12 +++++++----- cerise/inc/cerise.h | 4 ++++ cerise/src/grammar.c | 29 ++++++++++++++++++++++++++++- cerise/src/sym.c | 2 +- cerise/tests/A.m | 2 +- cerise/tests/B.m | 1 + cerise/tests/C.m | 1 + cerise/tests/D.m | 3 +++ 8 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 cerise/tests/C.m create mode 100644 cerise/tests/D.m diff --git a/cerise/backend/ssa/codegen.c b/cerise/backend/ssa/codegen.c index c002c17..b76b441 100644 --- a/cerise/backend/ssa/codegen.c +++ b/cerise/backend/ssa/codegen.c @@ -531,13 +531,15 @@ void codegen_block(Parser* p, SsaBlock* block) void codegen_main(Parser* p) { if (!p->genmain) return; // Bail if no main required + for (size_t i = 0; i < p->nmods; i++) + { + fout(p, "declare void @%s()\n", p->mods[i]); + } + fout(p, "define i32 @main(i32 %%0, i8* %%1)\n{\n"); - for (size_t i = 0; i < p->nsyms; i++) + for (size_t i = 0; i < p->nmods; i++) { - if (p->syms[i].class == SYM_MODULE) - { - fout(p, " call void @%s()\n", p->syms[i].name); - } + fout(p, " call void @%s()\n", p->mods[i]); } fout(p, " ret i32 0\n"); fout(p, "}\n"); diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index 25338cc..5d6c3f9 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -236,6 +236,10 @@ typedef struct { size_t ntypes; Type** types; + size_t mmods; + size_t nmods; + char** mods; + bool genmain; } Parser; diff --git a/cerise/src/grammar.c b/cerise/src/grammar.c index 79fff62..00d1497 100644 --- a/cerise/src/grammar.c +++ b/cerise/src/grammar.c @@ -798,6 +798,24 @@ static void compile_module(Parser* p, char* path, bool genmain) } } +void add_module(Parser* p, char* modname) +{ + bool found = false; + for (size_t i = 0; !found && i < p->nmods; i++) + { + found = !strcmp(p->mods[i], modname); + } + + if (!found) + { + if (p->nmods == p->mmods) + { + p->mmods = (p->mmods ? (p->mmods << 1) : 8u); + p->mods = realloc(p->mods, p->mmods * sizeof(char*)); + } + p->mods[p->nmods++] = modname; + } +} static void import(Parser* curr, char* modname, char* alias) { @@ -813,10 +831,15 @@ static void import(Parser* curr, char* modname, char* alias) compile_module(&p, path, false); (void)alias; + /* copy module references over */ + for (size_t i = 0; i < p.nmods; i++) + { + add_module(curr, p.mods[i]); + } + /* copy exported symbols to our symbol table */ Symbol* sym = symbol_new(curr, 0, modname, SYM_MODULE, 0); sym->forward = 1; - codegen_symbol(curr, sym); size_t modid = sym - &curr->syms[0]; for (size_t i = 0; i < p.nsyms; i++) { @@ -828,6 +851,10 @@ static void import(Parser* curr, char* modname, char* alias) sym->forward = 1; codegen_symbol(curr, sym); } + else if (p.syms[i].class == SYM_MODULE) + { + add_module(curr, p.syms[i].name); + } } } diff --git a/cerise/src/sym.c b/cerise/src/sym.c index 72dd6fe..8375fae 100644 --- a/cerise/src/sym.c +++ b/cerise/src/sym.c @@ -129,7 +129,7 @@ size_t symbol_getid(Parser* p, size_t module, char* name, int class) error(p, "unknown symbol '%s'", name); } - /* if symbol is a module, we must access something in it */ + /* if symbol is an aliased module, get the real definition */ Symbol* sym = symbol_getbyid(p, index); if ((sym->class == SYM_MODULE) && (sym->module > 0)) { diff --git a/cerise/tests/A.m b/cerise/tests/A.m index 63f8a51..7ff8336 100644 --- a/cerise/tests/A.m +++ b/cerise/tests/A.m @@ -1,4 +1,4 @@ -import B +import B C const FOO* = B.BAR diff --git a/cerise/tests/B.m b/cerise/tests/B.m index 477cdbf..0655b06 100644 --- a/cerise/tests/B.m +++ b/cerise/tests/B.m @@ -1,2 +1,3 @@ +import C const BAR* = 42 diff --git a/cerise/tests/C.m b/cerise/tests/C.m new file mode 100644 index 0000000..21cb9bb --- /dev/null +++ b/cerise/tests/C.m @@ -0,0 +1 @@ +const FOO = 24 \ No newline at end of file diff --git a/cerise/tests/D.m b/cerise/tests/D.m new file mode 100644 index 0000000..006ad10 --- /dev/null +++ b/cerise/tests/D.m @@ -0,0 +1,3 @@ +import C + +const FOO = 242 -- 2.49.0