From ca84eb318328b3bd580c7ce2591745f83c6605e0 Mon Sep 17 00:00:00 2001 From: Sebastian Hack Date: Wed, 11 Jul 2007 22:14:43 +0000 Subject: [PATCH] Made a nicer dumper [r15059] --- ir/ana/dfs.c | 97 ++++++++++++++++++++++++++++++++++---------------- ir/ana/dfs_t.h | 1 + 2 files changed, 67 insertions(+), 31 deletions(-) diff --git a/ir/ana/dfs.c b/ir/ana/dfs.c index c80d57866..d8596c12b 100644 --- a/ir/ana/dfs.c +++ b/ir/ana/dfs.c @@ -30,9 +30,12 @@ #include #endif +#include + #include #include "irtools.h" #include "irprintf.h" +#include "irdom.h" #include "set.h" #include "dfs_t.h" @@ -68,7 +71,7 @@ static dfs_edge_t *get_edge(const dfs_t *self, void *src, void *tgt) return set_insert(self->edges, &templ, sizeof(templ), hash); } -static void dfs_perform(dfs_t *dfs, void *n, void *anc) +static void dfs_perform(dfs_t *dfs, void *n, void *anc, int level) { dfs_node_t *node = get_node(dfs, n); void **succs, **iter; @@ -80,6 +83,7 @@ static void dfs_perform(dfs_t *dfs, void *n, void *anc) node->ancestor = anc; node->pre_num = dfs->pre_num++; node->max_pre_num = node->pre_num; + node->level = level; dfs->graph_impl->grow_succs(dfs->graph, n, &dfs->obst); obstack_ptr_grow(&dfs->obst, NULL); @@ -97,7 +101,7 @@ static void dfs_perform(dfs_t *dfs, void *n, void *anc) edge->t = child; if (!child->visited) - dfs_perform(dfs, p, node); + dfs_perform(dfs, p, node, level + 1); /* get the maximum pre num of the subtree. needed for ancestor determination. */ node->max_pre_num = MAX(node->max_pre_num, child->max_pre_num); @@ -152,7 +156,7 @@ dfs_t *dfs_new(const absgraph_t *graph_impl, void *graph_self) obstack_init(&res->obst); - dfs_perform(res, graph_impl->get_root(graph_self), NULL); + dfs_perform(res, graph_impl->get_root(graph_self), NULL, 0); classify_edges(res); res->pre_order = xmalloc(res->pre_num * sizeof(res->pre_order)); @@ -174,46 +178,77 @@ void dfs_free(dfs_t *dfs) xfree(dfs); } +static void dfs_dump_edge(const dfs_edge_t *edge, FILE *file) +{ + dfs_node_t *src = edge->s; + dfs_node_t *tgt = edge->t; + const char *s, *style; + int weight; + +#define XXX(e) case DFS_EDGE_ ## e: s = #e; break + switch (edge->kind) { + XXX(FWD); + XXX(CROSS); + default: + s = ""; + } +#undef XXX + + weight = edge->kind == DFS_EDGE_BACK ? 1 : 1000; + style = edge->kind == DFS_EDGE_BACK ? "dashed" : "solid"; + + ir_fprintf(file, "\tn%d -> n%d [label=\"%s\",style=\"%s\",weight=\"%d\"];\n", src->pre_num, tgt->pre_num, s, style, weight); +} + +static int node_level_cmp(const void *a, const void *b) +{ + const dfs_node_t *p = *(const dfs_node_t **) a; + const dfs_node_t *q = *(const dfs_node_t **) b; + + if (p->level == q->level) + return p->pre_num - q->pre_num; + return p->level - q->level; +} + void dfs_dump(const dfs_t *dfs, FILE *file) { + dfs_node_t **nodes = xmalloc(dfs->pre_num * sizeof(nodes[0])); dfs_node_t *node; dfs_edge_t *edge; + int i, n = 0; - ir_fprintf(file, "digraph G {\n"); + ir_fprintf(file, "digraph G {\nranksep=0.5\n"); foreach_set (dfs->nodes, node) { - ir_fprintf(file, "\tn%d [shape=box,label=\"%+F\\l%d/%d %d\"];\n", - node->pre_num, node->node, node->pre_num, node->post_num, node->max_pre_num); - + nodes[n++] = node; } - foreach_set (dfs->edges, edge) { - dfs_node_t *src = edge->s; - dfs_node_t *tgt = edge->t; - const char *s, *color; + qsort(nodes, n, sizeof(nodes[0]), node_level_cmp); -#define XXX(e) case DFS_EDGE_ ## e: s = #e; break - switch (edge->kind) { - XXX(BACK); - XXX(FWD); - XXX(CROSS); - XXX(ANC); - default: - s = "?"; - } -#undef XXX + i = 0; + while (i < n) { + int level = nodes[i]->level; -#define XXX(e) case DFS_EDGE_ ## e - switch (edge->kind) { - XXX(ANC): color = "black"; break; - XXX(FWD): color = "blue"; break; - XXX(CROSS): color = "red"; break; - XXX(BACK): color = "darkviolet"; break; - default: color = "?"; - } -#undef XXX + ir_fprintf(file, "\t{ rank = same; "); + for (; i < n && nodes[i]->level == level; ++i) + ir_fprintf(file, "n%d;", nodes[i]->pre_num); + ir_fprintf(file, "}\n"); + + + } - ir_fprintf(file, "\tn%d -> n%d [label=\"%s\",color=\"%s\"];\n", src->pre_num, tgt->pre_num, s, color); + for (i = 0; i < n; ++i) { + dfs_node_t *node = nodes[i]; + ir_fprintf(file, "\tn%d [label=\"%d\"]\n", node->pre_num, get_Block_dom_tree_pre_num(node->node)); +#if 0 + ir_fprintf(file, "\tn%d [shape=box,label=\"%+F\\l%d %d/%d %d\"];\n", + node->pre_num, node->node, get_Block_dom_tree_pre_num(node->node), + node->pre_num, node->post_num, node->max_pre_num); +#endif } + foreach_set (dfs->edges, edge) + dfs_dump_edge(edge, file); + ir_fprintf(file, "}\n"); + xfree(nodes); } diff --git a/ir/ana/dfs_t.h b/ir/ana/dfs_t.h index bcb169011..9fb26bf97 100644 --- a/ir/ana/dfs_t.h +++ b/ir/ana/dfs_t.h @@ -42,6 +42,7 @@ struct _dfs_node_t { int pre_num; int max_pre_num; int post_num; + int level; }; struct _dfs_edge_t { -- 2.20.1