shithub: mc

Download patch

ref: 8f38494ab79c5fa806b9860c3b0a47f9e5ecaf34
parent: 26d8da9a31adeabfa59d3a2ed06ad13206c94356
author: Ori Bernstein <[email protected]>
date: Wed Jun 13 20:35:04 EDT 2012

Print out the assembly CFG.

--- a/8/isel.c
+++ b/8/isel.c
@@ -689,9 +689,12 @@
     if (fn->isglobl)
         fprintf(fd, ".globl %s\n", fn->name);
     fprintf(fd, "%s:\n", fn->name);
-    for (j = 0; j < s->cfg->nbb; j++)
+    for (j = 0; j < s->cfg->nbb; j++) {
+        for (i = 0; i < s->bb[j]->nlbls; i++)
+            fprintf(fd, "%s:\n", s->bb[j]->lbls[i]);
         for (i = 0; i < s->bb[j]->ni; i++)
             iprintf(fd, s->bb[j]->il[i]);
+    }
 }
 
 static Asmbb *mkasmbb(Bb *bb)
@@ -726,7 +729,7 @@
     is.curbb = is.bb[0];
     prologue(&is, fn->stksz);
     for (j = 0; j < fn->cfg->nbb; j++) {
-        is.curbb = is.bb[j + 1];
+        is.curbb = is.bb[j];
         for (i = 0; i < fn->cfg->bb[j]->nnl; i++) {
             isel(&is, fn->cfg->bb[j]->nl[i]);
         }
--- a/8/ra.c
+++ b/8/ra.c
@@ -161,7 +161,55 @@
     }
 }
 
+void asmdump(Asmbb **bbs, size_t nbb, FILE *fd)
+{
+    size_t i, j;
+    Asmbb *bb;
+    char *sep;
+
+    fprintf(fd, "ASM -------- \n");
+    for (j = 0; j < nbb; j++) {
+        bb = bbs[j];
+        fprintf(fd, "\n");
+        fprintf(fd, "Bb: %d labels=(", bb->id);
+        sep = "";
+        for (i = 0; i < bb->nlbls; i++) {;
+            fprintf(fd, "%s%s", bb->lbls[i], sep);
+            sep = ",";
+        }
+        fprintf(fd, ")\n");
+
+        /* in edges */
+        fprintf(fd, "In:  ");
+        sep = "";
+        for (i = 0; i < bsmax(bb->pred); i++) {
+            if (bshas(bb->pred, i)) {
+                fprintf(fd, "%s%zd", sep, i);
+                sep = ",";
+            }
+        }
+        fprintf(fd, "\n");
+
+        /* out edges */
+        fprintf(fd, "Out: ");
+        sep = "";
+        for (i = 0; i < bsmax(bb->succ); i++) {
+             if (bshas(bb->succ, i)) {
+                fprintf(fd, "%s%zd", sep, i);
+                sep = ",";
+             }
+        }
+        fprintf(fd, "\n");
+
+        for (i = 0; i < bb->ni; i++)
+            iprintf(fd, bb->il[i]);
+    }
+    fprintf(fd, "ENDASM -------- \n");
+}
+
 void regalloc(Isel *s)
 {
     liveness(s);
+    if (debug)
+	asmdump(s->bb, s->nbb, stdout);
 }
--- a/opt/cfg.c
+++ b/opt/cfg.c
@@ -86,8 +86,8 @@
     post = mkbb(cfg);
     bsput(pre->succ, cfg->bb[1]->id);
     bsput(cfg->bb[1]->pred, pre->id);
-    bsput(post->succ, cfg->bb[cfg->nbb - 2]->id);
-    bsput(cfg->bb[cfg->nbb - 2]->pred, post->id);
+    bsput(cfg->bb[cfg->nbb - 2]->succ, post->id);
+    bsput(post->pred, cfg->bb[cfg->nbb - 2]->id);
     for (i = 0; i < cfg->nfixjmp; i++) {
         bb = cfg->fixblk[i];
         switch (exprop(cfg->fixjmp[i])) {
@@ -120,6 +120,7 @@
     }
     return cfg;
 }
+
 void dumpcfg(Cfg *cfg, FILE *fd)
 {
     size_t i, j;