Symbol* sym = symbol_new(p, 0, name, SYM_VAR, export);
expect(p, ':');
sym->type = type(p);
+ codegen_symbol(p, sym);
}
while (matches(p, IDENT));
EXIT_RULE();
sym = symbol_new(p, 0, name, SYM_TYPE, export);
expect(p, '=');
sym->type = type(p);
+ codegen_symbol(p, sym);
}
while (matches(p, IDENT));
Type* proctype = symbol_newtype(p);
proctype->form = FORM_PROC;
proc->type = proctype;
+ codegen_symbol(p, proc);
/* start scope and parse argument list */
size_t scope = symbol_openscope(p);
ssa_return(p, retval);
}
expect(p, END);
- ssa_print_graph(p, block);
+ codegen_block(p, block);
EXIT_RULE();
}
ssa_join(p);
/* debug dump the result */
- ssa_print_graph(p, block);
- extern void ssa_print_asm(Parser* p, SsaBlock* block);
- ssa_print_asm(p, block);
+// ssa_print_asm(p, block);
}
if (!matches(p, END_FILE))
static size_t phi_add(Parser* p, SsaVar var)
{
Symbol* sym = symbol_getbyid(p, var.symid);
- printf("phi_add()\n");
-
- printf(" %s.%lu\n", sym->name, sym->version);
-
/* first, append the phi function to the list */
SsaPhi** phis = &(p->curr_join->phis);
for (; *phis; phis = &((*phis)->next))
}
if (!*phis)
{
- puts("new phi()");
*phis = calloc(1, sizeof(SsaPhi));
(*phis)->symid = var.symid;
(*phis)->backup_ver = sym->version;
else if ((*phis)->latest_ver > sym->version)
{
sym->version = (*phis)->latest_ver;
- printf(" setting to latest: %s.%lu\n", sym->name, sym->version);
}
/* now add or update the variable entry */
{
*vars = calloc(1, sizeof(SsaPhiVar));
(*vars)->block = p->curr_block->id;
- printf(" new var %s from block %lu\n", sym->name, p->curr_block->id);
}
sym->version++;
(*vars)->version = sym->version;
(*phis)->latest_ver = (*vars)->version;
- printf(" %s.%lu\n", sym->name, sym->version);
-
return sym->version;
}
void ssa_reset_vars(Parser* p)
{
- puts("ssa_reset_vars");
for (SsaPhi* phi = p->curr_join->phis; phi; phi = phi->next)
{
Symbol* s = symbol_getbyid(p, phi->symid);
void ssa_join(Parser* p)
{
- puts("ssa_join");
ssa_reset_vars(p);
/* pop the join node off the list since we're done with it */
Symbol* s = symbol_getbyid(p, phi->symid);
s->version = phi->latest_ver;
phi->latest_ver++;
- printf("block %lu: %s.%lu\n", block->id, s->name, s->version);
if (p->curr_join)
{
.symver = s->version
});
}
-
- printf("block %lu: %s.%lu\n", block->id, s->name, s->version);
}
}
static SsaNode* const_binop(int op, SsaNode* a, SsaNode* b)
{
- printf("binop: %d %d\n", op, a->type->form);
if (a->type->form == FORM_INT || a->type->form == FORM_BOOL)
{
switch (op)
}
}
-void ssa_print_block(Parser* p, Bitset* set, SsaBlock* block)
-{
- /* print the phis */
- printf("L%lu:\n", block->id);
- for (SsaPhi* phi = block->phis; phi; phi = phi->next)
- {
- Symbol* s = symbol_getbyid(p, phi->symid);
- printf(" %s.%lu = phi(", s->name, s->version);
- for (SsaPhiVar* var = phi->vars; var; var = var->next)
- {
- printf("%s.%lu", s->name, var->version);
- if (var->next)
- {
- printf(", ");
- }
- }
- puts(")");
- }
- /* print the instructions */
- for (SsaNode* node = block->head; node; node = node->next)
- {
- printf(" ");
- print_dest(p, node);
- ssa_print(p, node);
- puts("");
- }
- /* print the next node */
- if (block->links[0])
- {
- ssa_print_block(p, set, block->links[0]);
- }
- if (block->links[1])
- {
- ssa_print_block(p, set, block->links[1]);
- }
-}
-
static void topsort(Bitset* set, SsaBlock** sorted, SsaBlock* block)
{
if (block && !bitset_has(set, block->id))
}
}
-void ssa_print_graph(Parser* p, SsaBlock* block)
-{
-// /* perform a topological sort of the nodes */
-// SsaBlock* sorted = NULL;
-// Bitset* set = bitset_new(p->blockid);
-// topsort(set, &sorted, block);
-//
-//
-// /* now let's print the plantuml representation */
-// printf("@startuml\n");
-// printf("[*] --> block%lu\n", block->id);
-// for (SsaBlock* curr = sorted; curr; curr = curr->next)
-// {
-// /* print the phis */
-// for (SsaPhi* phi = curr->phis; phi; phi = phi->next)
-// {
-// Symbol* s = symbol_getbyid(p, phi->symid);
-// printf("block%lu: %s.%lu = phi(", curr->id, s->name, s->version);
-// for (SsaPhiVar* var = phi->vars; var; var = var->next)
-// {
-// printf("%s.%lu", s->name, var->version);
-// if (var->next)
-// {
-// printf(", ");
-// }
-// }
-// puts(")");
-// }
-//
-// /* print the instructions */
-// for (SsaNode* node = curr->head; node; node = node->next)
-// {
-// printf("block%lu : ", curr->id);
-// print_dest(p, node);
-// ssa_print(p, node);
-// puts("");
-// }
-//
-// /* print the links */
-// if (curr->links[1])
-// {
-// printf("block%lu --> block%lu\n", curr->id, curr->links[1]->id);
-// }
-// if (curr->links[0])
-// {
-// printf("block%lu --> block%lu\n", curr->id, curr->links[0]->id);
-// }
-//
-// puts("");
-// }
-// printf("@enduml\n\n");
-}
-
-
void ssa_print_asm(Parser* p, SsaBlock* block)
{
/* perform a topological sort of the nodes */