summaryrefslogtreecommitdiff
path: root/opt
diff options
context:
space:
mode:
authorOri Bernstein <orib@google.com>2012-06-11 16:24:06 -0400
committerOri Bernstein <orib@google.com>2012-06-11 16:24:06 -0400
commit357b2411f4cb3d37ff54e8a7a13ae36d387a1bb8 (patch)
treecf128b21a820d9da00b76aac2d9736c06395498c /opt
parentd4652ead0e6be99b889228f76caa4bb1c3ba62d8 (diff)
downloadmc-357b2411f4cb3d37ff54e8a7a13ae36d387a1bb8.tar.gz
Split cfg and dataflow.
Diffstat (limited to 'opt')
-rw-r--r--opt/Makefile3
-rw-r--r--opt/cfg.c160
-rw-r--r--opt/df.c146
3 files changed, 164 insertions, 145 deletions
diff --git a/opt/Makefile b/opt/Makefile
index 5092981..7e6654c 100644
--- a/opt/Makefile
+++ b/opt/Makefile
@@ -1,5 +1,6 @@
LIB=libopt.a
-OBJ=df.o \
+OBJ=cfg.o \
+ df.o \
CFLAGS+=-I../parse
LDFLAGS+=-L../parse -lparse
diff --git a/opt/cfg.c b/opt/cfg.c
new file mode 100644
index 0000000..04ab335
--- /dev/null
+++ b/opt/cfg.c
@@ -0,0 +1,160 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "parse.h"
+#include "opt.h"
+
+
+Bb *mkbb(Cfg *cfg)
+{
+ static int nextbbid = 0;
+ Bb *bb;
+
+ bb = zalloc(sizeof(Bb));
+ bb->id = nextbbid++;
+ bb->in = mkbs();
+ bb->out = mkbs();
+ lappend(&cfg->bb, &cfg->nbb, bb);
+ return bb;
+}
+
+void label(Cfg *cfg, Node *lbl, Bb *bb)
+{
+ htput(cfg->lblmap, lbl->lbl.name, bb);
+ lappend(&bb->lbls, &bb->nlbls, lbl->lbl.name);
+}
+
+int addnode(Cfg *cfg, Bb *bb, Node *n)
+{
+ switch (exprop(n)) {
+ case Ojmp:
+ case Ocjmp:
+ lappend(&bb->nl, &bb->nnl, n);
+ lappend(&cfg->fixjmp, &cfg->nfixjmp, n);
+ lappend(&cfg->fixblk, &cfg->nfixblk, bb);
+ return 1;
+ break;
+ default:
+ lappend(&bb->nl, &bb->nnl, n);
+ break;
+ }
+ return 0;
+}
+
+Cfg *mkcfg(Node **nl, int nn)
+{
+ Cfg *cfg;
+ Bb *bb, *targ;
+ Node *a, *b;
+ int i;
+
+ cfg = zalloc(sizeof(Cfg));
+ cfg->lblmap = mkht(strhash, streq);
+ bb = mkbb(cfg);
+ for (i = 0; i < nn; i++) {
+ switch (nl[i]->type) {
+ case Nlbl:
+ /* if the current block assumes fall-through, insert an explicit jump */
+ if (i > 0 && nl[i - 1]->type == Nexpr) {
+ if (exprop(nl[i - 1]) != Ocjmp && exprop(nl[i - 1]) != Ojmp)
+ addnode(cfg, bb, mkexpr(-1, Ojmp, mklbl(-1, nl[i]->lbl.name), NULL));
+ }
+ if (bb->nnl)
+ bb = mkbb(cfg);
+ label(cfg, nl[i], bb);
+ break;
+ case Nexpr:
+ if (addnode(cfg, bb, nl[i]))
+ bb = mkbb(cfg);
+ break;
+ case Ndecl:
+ break;
+ default:
+ die("Invalid node type %s in mkcfg", nodestr(nl[i]->type));
+ }
+ }
+ for (i = 0; i < cfg->nfixjmp; i++) {
+ bb = cfg->fixblk[i];
+ switch (exprop(cfg->fixjmp[i])) {
+ case Ojmp:
+ a = cfg->fixjmp[i]->expr.args[0];
+ b = NULL;
+ break;
+ case Ocjmp:
+ a = cfg->fixjmp[i]->expr.args[1];
+ b = cfg->fixjmp[i]->expr.args[2];
+ break;
+ default:
+ die("Bad jump fix thingy");
+ break;
+ }
+ if (a) {
+ targ = htget(cfg->lblmap, a->lbl.name);
+ if (!targ)
+ die("No bb with label %s", a->lbl.name);
+ bsput(bb->out, targ->id);
+ bsput(targ->in, bb->id);
+ }
+ if (b) {
+ targ = htget(cfg->lblmap, b->lbl.name);
+ if (!targ)
+ die("No bb with label %s", b->lbl.name);
+ bsput(bb->out, targ->id);
+ bsput(targ->in, bb->id);
+ }
+ }
+ return cfg;
+}
+void dumpcfg(Cfg *cfg, FILE *fd)
+{
+ int i, j;
+ Bb *bb;
+ char *sep;
+
+ for (j = 0; j < cfg->nbb; j++) {
+ bb = cfg->bb[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->in); i++) {
+ if (bshas(bb->in, i)) {
+ fprintf(fd, "%s%d", sep, i);
+ sep = ",";
+ }
+ }
+ fprintf(fd, "\n");
+
+ /* out edges */
+ fprintf(fd, "Out: ");
+ sep = "";
+ for (i = 0; i < bsmax(bb->out); i++) {
+ if (bshas(bb->out, i)) {
+ fprintf(fd, "%s%d", sep, i);
+ sep = ",";
+ }
+ }
+ fprintf(fd, "\n");
+
+ for (i = 0; i < bb->nnl; i++)
+ dump(bb->nl[i], fd);
+ fprintf(fd, "\n");
+ }
+}
diff --git a/opt/df.c b/opt/df.c
index be3d2a1..9a3177a 100644
--- a/opt/df.c
+++ b/opt/df.c
@@ -13,149 +13,7 @@
#include "parse.h"
#include "opt.h"
-
-Bb *mkbb(Cfg *cfg)
-{
- static int nextbbid = 0;
- Bb *bb;
-
- bb = zalloc(sizeof(Bb));
- bb->id = nextbbid++;
- bb->in = mkbs();
- bb->out = mkbs();
- lappend(&cfg->bb, &cfg->nbb, bb);
- return bb;
-}
-
-void label(Cfg *cfg, Node *lbl, Bb *bb)
-{
- htput(cfg->lblmap, lbl->lbl.name, bb);
- lappend(&bb->lbls, &bb->nlbls, lbl->lbl.name);
-}
-
-int addnode(Cfg *cfg, Bb *bb, Node *n)
-{
- switch (exprop(n)) {
- case Ojmp:
- case Ocjmp:
- lappend(&bb->nl, &bb->nnl, n);
- lappend(&cfg->fixjmp, &cfg->nfixjmp, n);
- lappend(&cfg->fixblk, &cfg->nfixblk, bb);
- return 1;
- break;
- default:
- lappend(&bb->nl, &bb->nnl, n);
- break;
- }
- return 0;
-}
-
-Cfg *mkcfg(Node **nl, int nn)
-{
- Cfg *cfg;
- Bb *bb, *targ;
- Node *a, *b;
- int i;
-
- cfg = zalloc(sizeof(Cfg));
- cfg->lblmap = mkht(strhash, streq);
- bb = mkbb(cfg);
- for (i = 0; i < nn; i++) {
- switch (nl[i]->type) {
- case Nlbl:
- /* if the current block assumes fall-through, insert an explicit
- * jump */
- if (i > 0 && nl[i - 1]->type == Nexpr) {
- if (exprop(nl[i - 1]) != Ocjmp && exprop(nl[i - 1]) != Ojmp)
- addnode(cfg, bb, mkexpr(-1, Ojmp, mklbl(-1, nl[i]->lbl.name), NULL));
- }
- if (bb->nnl)
- bb = mkbb(cfg);
- label(cfg, nl[i], bb);
- break;
- case Nexpr:
- if (addnode(cfg, bb, nl[i]))
- bb = mkbb(cfg);
- break;
- case Ndecl:
- break;
- default:
- die("Invalid node type %s in mkcfg", nodestr(nl[i]->type));
- }
- }
- for (i = 0; i < cfg->nfixjmp; i++) {
- bb = cfg->fixblk[i];
- switch (exprop(cfg->fixjmp[i])) {
- case Ojmp:
- a = cfg->fixjmp[i]->expr.args[0];
- b = NULL;
- break;
- case Ocjmp:
- a = cfg->fixjmp[i]->expr.args[1];
- b = cfg->fixjmp[i]->expr.args[2];
- break;
- default:
- die("Bad jump fix thingy");
- break;
- }
- if (a) {
- targ = htget(cfg->lblmap, a->lbl.name);
- if (!targ)
- die("No bb with label %s", a->lbl.name);
- bsput(bb->out, targ->id);
- bsput(targ->in, bb->id);
- }
- if (b) {
- targ = htget(cfg->lblmap, b->lbl.name);
- if (!targ)
- die("No bb with label %s", b->lbl.name);
- bsput(bb->out, targ->id);
- bsput(targ->in, bb->id);
- }
- }
- return cfg;
-}
-void dumpcfg(Cfg *cfg, FILE *fd)
+void flow(Cfg *cfg)
{
- int i, j;
- Bb *bb;
- char *sep;
-
- for (j = 0; j < cfg->nbb; j++) {
- bb = cfg->bb[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->in); i++) {
- if (bshas(bb->in, i)) {
- fprintf(fd, "%s%d", sep, i);
- sep = ",";
- }
- }
- fprintf(fd, "\n");
-
- /* out edges */
- fprintf(fd, "Out: ");
- sep = "";
- for (i = 0; i < bsmax(bb->out); i++) {
- if (bshas(bb->out, i)) {
- fprintf(fd, "%s%d", sep, i);
- sep = ",";
- }
- }
- fprintf(fd, "\n");
-
- for (i = 0; i < bb->nnl; i++)
- dump(bb->nl[i], fd);
- fprintf(fd, "\n");
- }
+ die("Flow analysis not implemented");
}