From 6d68d0defbb9bde9def98ee2e333ef7f01eca0e5 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 26 Jul 2021 23:36:10 -0400 Subject: [PATCH] started adding logic to print graphs --- cerise/inc/cerise.h | 1 + cerise/src/grammar.c | 7 ++++-- cerise/src/ssa.c | 60 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index e9b5c12..586a61e 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -269,6 +269,7 @@ void ssa_call_add(SsaBlock* call, SsaNode* arg); 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 *****************************************************************************/ diff --git a/cerise/src/grammar.c b/cerise/src/grammar.c index 17b2921..ff97f30 100644 --- a/cerise/src/grammar.c +++ b/cerise/src/grammar.c @@ -633,11 +633,14 @@ static void module(Parser* p) 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(); } diff --git a/cerise/src/ssa.c b/cerise/src/ssa.c index 232c025..69ec144 100644 --- a/cerise/src/ssa.c +++ b/cerise/src/ssa.c @@ -473,6 +473,7 @@ void ssa_print(Parser* p, SsaNode* expr) 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) { @@ -489,8 +490,7 @@ void ssa_print_block(Parser* p, SsaBlock* block) } puts(")"); } - - + /* print the instructions */ for (SsaNode* node = block->head; node; node = node->next) { printf(" "); @@ -498,4 +498,60 @@ void ssa_print_block(Parser* p, SsaBlock* block) 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"); } -- 2.49.0