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");
}
}
+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)
{
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++)
{
sym->forward = 1;
codegen_symbol(curr, sym);
}
+ else if (p.syms[i].class == SYM_MODULE)
+ {
+ add_module(curr, p.syms[i].name);
+ }
}
}
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))
{