]> git.mdlowis.com Git - proto/obnc.git/commitdiff
added proper module init sequencing
authorMichael D. Lowis <mike@mdlowis.com>
Fri, 9 Dec 2022 01:42:01 +0000 (20:42 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Fri, 9 Dec 2022 01:42:01 +0000 (20:42 -0500)
cerise/backend/ssa/codegen.c
cerise/inc/cerise.h
cerise/src/grammar.c
cerise/src/sym.c
cerise/tests/A.m
cerise/tests/B.m
cerise/tests/C.m [new file with mode: 0644]
cerise/tests/D.m [new file with mode: 0644]

index c002c179a0e7e0199b299ac516dafabcde8c92c2..b76b4419523572c6f4a1fa6f04eaf459a330657a 100644 (file)
@@ -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");
index 25338cc998355b95ba2306b6a6fbec09301e0d66..5d6c3f9e6a2422ae3a1e3d4f539b702dee307344 100644 (file)
@@ -236,6 +236,10 @@ typedef struct {
     size_t ntypes;
     Type** types;
 
+    size_t mmods;
+    size_t nmods;
+    char** mods;
+
     bool genmain;
 } Parser;
 
index 79fff62e1497419cffeeb6072daaf6cfa23f77d7..00d149701ac83a83b83d54d716d2d3b70031b3ca 100644 (file)
@@ -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);
+        }
     }
 }
 
index 72dd6fef03e969ed5b2aa2cab98629e972c38f2b..8375faef0a7b5238b80e6cb1571c778c7d7087e9 100644 (file)
@@ -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))
     {
index 63f8a515af1f9ea6230f7a478a32377f81e9125f..7ff8336ffff1c14c3f2b6de5c837c7fb8e189607 100644 (file)
@@ -1,4 +1,4 @@
-import B
+import B C
 
 const
   FOO* = B.BAR
index 477cdbfe9943dbcaf6c2e5a0a0b3616837854787..0655b0623d26a9ad2ac01f70b3db643b0699dd9b 100644 (file)
@@ -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 (file)
index 0000000..21cb9bb
--- /dev/null
@@ -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 (file)
index 0000000..006ad10
--- /dev/null
@@ -0,0 +1,3 @@
+import C
+
+const FOO = 242