}
else if (sym->class == SYM_PROC)
{
- printf("define ");
+ char* modname = (sym->module == 0
+ ? p->name : symbol_getbyid(p, sym->module)->name);
+ if (sym->forward)
+ {
+ printf("declare ");
+ }
+ else
+ {
+ printf("define ");
+ }
emit_type(sym->type->base);
- printf(" @%s(", sym->name);
+ printf(" @%s_%s(", modname, sym->name);
for (Field* f = sym->type->fields; f; f = f->next)
{
emit_type(f->type);
}
printf(")\n");
}
+ else if (sym->class == SYM_MODULE)
+ {
+ if (sym->module == 0)
+ {
+ printf("define ");
+ }
+ else
+ {
+ printf("declare ");
+ }
+ printf(" void @%s(", sym->name);
+ printf(")\n");
+ }
}
static void topsort(Bitset* set, SsaBlock** sorted, SsaBlock* block)
printf("}\n");
puts("");
}
+
+void codegen_main(Parser* p)
+{
+ if (!p->codegen) return; // Bail if just importing symbols
+ printf("define i32 @main(i32 %%0, i8* %%1)\n{\n");
+ for (size_t i = 0; i < p->nsyms; i++)
+ {
+ if (p->syms[i].class == SYM_MODULE)
+ {
+ printf(" call void @%s()\n", p->syms[i].name);
+ }
+ }
+ printf(" ret i32 0\n");
+ printf("}\n");
+}
\ No newline at end of file
{
expect(p, '.');
char* name = expect_text(p, IDENT);
- size_t qsymid = symbol_getid(p, symid, name, -1);
- printf("%ld.%ld\n", symid, qsymid);
- symid=qsymid;
+ symid = symbol_getid(p, symid, name, -1);
}
/* make the identifier with the final index */
if (proc->forward)
{
- // check the type here
- proc->forward = 0;
+ // TODO: check the type here
+ proc->defined = 1;
}
codegen_symbol(p, proc);
return proc;
var_decl(p);
}
- if (accept(p, FORWARD))
+ if (accept(p, FORWARD) || accept(p, EXTERN))
{
proc->forward = 1;
}
- else if (!accept(p, EXTERN))
+ else // if (!accept(p, EXTERN))
{
proc_body(p, proc->type);
}
}
/* now let's define the module init function */
- Symbol* sym = symbol_new(p, 0, p->name, SYM_PROC, 0);
+ Symbol* sym = symbol_new(p, 0, p->name, SYM_MODULE, 0);
Type* proctype = symbol_newtype(p);
proctype->form = FORM_PROC;
proctype->base = &VoidType;
if (!matches(p, END))
{
block->links[0] = statement_seq(p);
+ ssa_return(p, NULL);
}
else
{
-// block->links[0] = ssa_block(p);
-// ssa_return(p, NULL);
+ block->links[0] = ssa_block(p);
+ block->links[0]->links[0] = p->curr_join;
+ p->curr_block = block->links[0];
+ ssa_return(p, NULL);
}
expect(p, END);
}
else
{
+ block->links[0] = ssa_block(p);
+ block->links[0]->links[0] = p->curr_join;
+ p->curr_block = block->links[0];
+ ssa_return(p, NULL);
}
ssa_join(p);
codegen_block(p, block);
{
error(p, "expected end of file");
}
+ codegen_main(p);
+
EXIT_RULE();
}
/* 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];
- printf("%lu\n", modid);
for (size_t i = 0; i < p.nsyms; i++)
{
if (p.syms[i].export)
Symbol* sym = symbol_new(curr, 0, p.syms[i].name, p.syms[i].class, 0);
*sym = p.syms[i];
sym->module = modid;
+ sym->forward = 1;
+ codegen_symbol(curr, sym);
}
}
}
{
Parser p = {0};
init_parser(&p, path);
-// codegen_init(&p);
+ codegen_init(&p);
module(&p);
}