]> git.mdlowis.com Git - proto/obnc.git/commitdiff
started adding logic to print graphs
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 27 Jul 2021 03:36:10 +0000 (23:36 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 27 Jul 2021 03:36:10 +0000 (23:36 -0400)
cerise/inc/cerise.h
cerise/src/grammar.c
cerise/src/ssa.c

index e9b5c1281dd91f63c15cc91ff5c2f193fc8ed9e5..586a61e3dac31371ea6ac886b8ad290529c688ad 100644 (file)
@@ -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
  *****************************************************************************/
index 17b2921c7c3e32232784c8b3abd1969e78afc7be..ff97f30e22afb15b0c17780f68689b0c3273895c 100644 (file)
@@ -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();
     }
 
index 232c0254614a6f99cd635df2fad74ad4fb8b9867..69ec14462eacbc8a75dabe2b6914a53181380d0d 100644 (file)
@@ -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");
 }