void ssa_print(Parser* p, SsaNode* expr);
void ssa_print_block(Parser* p, SsaBlock* block);
+void ssa_print_graph(Parser* p, SsaBlock* block);
/* Backend Code Generation and Base Type Definitions
*****************************************************************************/
if (!matches(p, END))
{
- block->links[0] = statement_seq(p);
+ SsaBlock* seqblock = statement_seq(p);
+ block->links[0] = seqblock;
+ seqblock->links[0] = p->curr_join;
}
expect(p, END);
- ssa_print_block(p, block);
+// ssa_print_block(p, block);
+ ssa_print_graph(p, block);
//proc_end();
}
void ssa_print_block(Parser* p, SsaBlock* block)
{
+ /* print the phis */
printf("L%lu:\n", block->id);
for (SsaPhi* phi = block->phis; phi; phi = phi->next)
{
}
puts(")");
}
-
-
+ /* print the instructions */
for (SsaNode* node = block->head; node; node = node->next)
{
printf(" ");
ssa_print(p, node);
puts("");
}
+ /* print the next node */
+ if (block->links[0])
+ {
+ ssa_print_block(p, block->links[0]);
+ }
+ if (block->links[1])
+ {
+ ssa_print_block(p, block->links[1]);
+ }
+}
+
+static void print_block_graph(Parser* p, SsaBlock* block)
+{
+ /* print the phis */
+ for (SsaPhi* phi = block->phis; phi; phi = phi->next)
+ {
+ Symbol* s = symbol_getbyid(p, phi->symid);
+ s->version++;
+ printf("block%lu: %s.%lu = phi(", block->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 = block->head; node; node = node->next)
+ {
+ printf("block%lu : ", block->id);
+ print_dest(p, node);
+ ssa_print(p, node);
+ puts("");
+ }
+ /* print the next node */
+ if (block->links[0])
+ {
+ printf("block%lu --> block%lu\n", block->id, block->links[0]->id);
+ print_block_graph(p, block->links[0]);
+ }
+ if (block->links[1])
+ {
+ printf("block%lu --> block%lu\n", block->id, block->links[1]->id);
+ print_block_graph(p, block->links[1]);
+ }
+}
+
+void ssa_print_graph(Parser* p, SsaBlock* block)
+{
+ printf("@startuml\n");
+ printf("[*] --> block%lu\n", block->id);
+ print_block_graph(p, block);
+ printf("@enduml\n");
}