instrument: Remove stale start loop test.
[libfirm] / ir / ir / irdump.c
index 5702a84..ac03cea 100644 (file)
 #include "pset.h"
 #include "util.h"
 
+/**
+ * Symbolic names for the different dumping colors.
+ */
+typedef enum ird_color_t {
+       ird_color_none = -1,
+       ird_color_prog_background,
+       ird_color_block_background,
+       ird_color_dead_block_background,
+       ird_color_block_inout,
+       ird_color_default_node,
+       ird_color_phi,
+       ird_color_memory,
+       ird_color_controlflow,
+       ird_color_const,
+       ird_color_anchor,
+       ird_color_proj,
+       ird_color_uses_memory,
+       ird_color_error,
+       ird_color_entity,
+       ird_color_count
+} ird_color_t;
+
+/**
+ * Edge kinds.
+ */
+typedef enum {
+       data_edge           = 0x01,   /**< A data edge between two basic blocks. */
+       block_edge          = 0x02,   /**< An edge from a node to its basic block. */
+       cf_edge             = 0x03,   /**< A regularly control flow edge. */
+       exc_cf_edge         = 0x04,   /**< An exceptional control flow edge. */
+       mem_edge            = 0x05,   /**< A memory edge. */
+       dominator_edge      = 0x06,   /**< A dominator edge from a block to its immediate dominator. */
+       node2type_edge      = 0x07,   /**< An edge from an IR node to a type. */
+
+       ent_type_edge       = 0x11,   /**< An edge from an entity to its type. */
+       ent_own_edge        = 0x12,   /**< An edge from an entity to its owner type. */
+       ent_overwrites_edge = 0x13,   /**< An edge from an entity to the entity it overwrites. */
+       ent_value_edge      = 0x14,   /**< An edge from an entity to its value entity. */
+       ent_corr_edge       = 0x15,   /**< An edge from an entity to the member entity its initializes. */
+
+       meth_par_edge       = 0x21,   /**< An edge from a method type to one of its parameter types. */
+       meth_res_edge       = 0x22,   /**< An edge from a method type to one of its result types. */
+       type_super_edge     = 0x23,   /**< An edge from a class type to its super/basis type. */
+       union_edge          = 0x24,   /**< An edge from a union type to its member types. */
+       ptr_pts_to_edge     = 0x25,   /**< An edge from a pointer type to its points-to type. */
+       arr_elt_type_edge   = 0x26,   /**< An edge from an array type to its element type. */
+       arr_ent_edge        = 0x27,   /**< An edge from a array type to its element entity. */
+       type_member_edge    = 0x28,   /**< An edge from a compound type to its member entities. */
+
+       /* additional flags */
+       intra_edge          = 0,      /**< Intra edge flag: edge do not cross basic block boundaries */
+       inter_edge          = 0x40,   /**< Inter edge flag: edge cross basic block boundaries */
+       back_edge           = 0x80    /**< Backwards edge flag. */
+} edge_kind;
+
+/* Attributes of nodes */
+#define PRINT_DEFAULT_NODE_ATTR
+#define DEFAULT_NODE_ATTR " "
+#define DEFAULT_TYPE_ATTRIBUTE " "
+#define DEFAULT_ENUM_ITEM_ATTRIBUTE " "
+
+/* Attributes of edges between Firm nodes */
+#define INTRA_DATA_EDGE_ATTR     "class:1  priority:50"
+#define INTER_DATA_EDGE_ATTR     "class:16 priority:10"
+#define BLOCK_EDGE_ATTR          "class:2  priority:50 linestyle:dotted"
+#define CF_EDGE_ATTR             "class:13 priority:60 color:red"
+#define EXC_CF_EDGE_ATTR         "class:18 priority:60 color:blue"
+#define INTRA_MEM_EDGE_ATTR      "class:14 priority:50 color:blue"
+#define INTER_MEM_EDGE_ATTR      "class:17 priority:10 color:blue"
+#define DOMINATOR_EDGE_ATTR      "class:15 color:red"
+#define POSTDOMINATOR_EDGE_ATTR  "class:19 color:red linestyle:dotted"
+#define KEEP_ALIVE_EDGE_ATTR     "class:20 priority:10 color:purple"
+#define KEEP_ALIVE_CF_EDGE_ATTR  "class:20 priority:60 color:purple"
+#define KEEP_ALIVE_DF_EDGE_ATTR  "class:20 priority:10 color:purple"
+#define ANCHOR_EDGE_ATTR         "class:20 priority:60 color:purple linestyle:dotted"
+#define OUT_EDGE_ATTR            "class:21 priority:10 color:gold linestyle:dashed"
+
+#define BACK_EDGE_ATTR "linestyle:dashed "
+
+/* Attributes of edges between Firm nodes and type/entity nodes */
+#define NODE2TYPE_EDGE_ATTR "class:2 priority:2 linestyle:dotted"
+
+/* Attributes of edges in type/entity graphs. */
+#define TYPE_METH_NODE_ATTR      "color: lightyellow"
+#define TYPE_CLASS_NODE_ATTR     "color: green"
+#define TYPE_DESCRIPTION_NODE_ATTR "color: lightgreen"
+#define ENTITY_NODE_ATTR         "color: yellow"
+#define ENUM_ITEM_NODE_ATTR      "color: green"
+#define ENT_TYPE_EDGE_ATTR       "class: 3 label: \"type\" color: red"
+#define ENT_OWN_EDGE_ATTR        "class: 4 label: \"owner\" color: black"
+#define METH_PAR_EDGE_ATTR       "class: 5 label: \"param %zu\" color: green"
+#define METH_RES_EDGE_ATTR       "class: 6 label: \"res %zu\" color: green"
+#define TYPE_SUPER_EDGE_ATTR     "class: 7 label: \"supertype\" color: red"
+#define UNION_EDGE_ATTR          "class: 8 label: \"component\" color: blue"
+#define PTR_PTS_TO_EDGE_ATTR     "class: 9 label: \"points to\" color:green"
+#define ARR_ELT_TYPE_EDGE_ATTR   "class: 10 label: \"arr elt tp\" color:green"
+#define ARR_ENT_EDGE_ATTR        "class: 10 label: \"arr ent\" color: green"
+#define ENT_OVERWRITES_EDGE_ATTR "class: 11 label: \"overwrites\" color:red"
+#define ENT_VALUE_EDGE_ATTR      "label: \"value %d\""
+#define ENT_CORR_EDGE_ATTR       "label: \"value %zu corresponds to \" "
+#define TYPE_MEMBER_EDGE_ATTR    "class: 12 label: \"member\" color:blue"
+/* #define CALLGRAPH_EDGE_ATTR      "calls" */
+
 typedef struct pns_lookup {
        long       nr;      /**< the proj number */
        const char *name;   /**< the name of the Proj */
@@ -192,12 +295,10 @@ int ir_should_dump(const char *name)
 
 /* -------------- some extended helper functions ----------------- */
 
-const char *get_mode_name_ex(const ir_mode *mode, int *bad)
+char const *get_mode_name_ex(ir_mode const *const mode)
 {
        if (is_mode(mode))
                return get_mode_name(mode);
-       if (bad != NULL)
-               *bad |= 1;
        return "<ERROR>";
 }
 
@@ -469,13 +570,10 @@ static void init_irdump(void)
  */
 static void *ird_get_irn_link(const ir_node *n)
 {
-       void *res = NULL;
        if (irdump_link_map == NULL)
                return NULL;
 
-       if (pmap_contains(irdump_link_map, n))
-               res = pmap_get(irdump_link_map, n);
-       return res;
+       return pmap_get(void, irdump_link_map, n);
 }
 
 /**
@@ -493,13 +591,10 @@ static void ird_set_irn_link(const ir_node *n, void *x)
  */
 static void *ird_get_irg_link(const ir_graph *irg)
 {
-       void *res = NULL;
        if (irdump_link_map == NULL)
                return NULL;
 
-       if (pmap_contains(irdump_link_map, irg))
-               res = pmap_get(irdump_link_map, irg);
-       return res;
+       return pmap_get(void, irdump_link_map, irg);
 }
 
 /**
@@ -665,7 +760,7 @@ void dump_node_opcode(FILE *F, const ir_node *n)
        case iro_Load:
                if (get_Load_unaligned(n) == align_non_aligned)
                        fprintf(F, "ua");
-               fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Load_mode(n), NULL));
+               fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Load_mode(n)));
                break;
        case iro_Store:
                if (get_Store_unaligned(n) == align_non_aligned)
@@ -680,19 +775,14 @@ void dump_node_opcode(FILE *F, const ir_node *n)
                fprintf(F, "%s%s", get_irn_opname(n),
                        (flags & ir_dump_flag_show_marks) ? (get_Block_mark(n) ? "*" : "") : "");
                break;
-       case iro_Conv:
-               if (get_Conv_strict(n))
-                       fprintf(F, "strict");
-               fprintf(F, "%s", get_irn_opname(n));
-               break;
        case iro_Div:
                fprintf(F, "%s", get_irn_opname(n));
                if (get_Div_no_remainder(n))
                        fprintf(F, "RL");
-               fprintf(F, "[%s]", get_mode_name_ex(get_Div_resmode(n), NULL));
+               fprintf(F, "[%s]", get_mode_name_ex(get_Div_resmode(n)));
                break;
        case iro_Mod:
-               fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Mod_resmode(n), NULL));
+               fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Mod_resmode(n)));
                break;
        case iro_Builtin:
                fprintf(F, "%s[%s]", get_irn_opname(n), get_builtin_kind_name(get_Builtin_kind(n)));
@@ -736,7 +826,7 @@ static void dump_node_mode(FILE *F, const ir_node *n)
 
                if (mode != NULL && mode != mode_BB && mode != mode_ANY && mode != mode_BAD &&
                        (mode != mode_T || iro == iro_Proj))
-                       fprintf(F, "%s", get_mode_name_ex(mode, NULL));
+                       fprintf(F, "%s", get_mode_name_ex(mode));
        }
 }
 
@@ -788,11 +878,9 @@ static void dump_node_nodeattr(FILE *F, const ir_node *n)
                proj_nr = get_Proj_proj(n);
                code    = get_irn_opcode(pred);
 
-               if (code == iro_Proj && get_irn_opcode(get_Proj_pred(pred)) == iro_Start)
+               if (code == iro_Proj && get_irn_opcode(get_Proj_pred(pred)) == iro_Start) {
                        fprintf(F, "Arg %ld ", proj_nr);
-               else if (code == iro_Cond && get_irn_mode(get_Cond_selector(pred)) != mode_b)
-                       fprintf(F, "%ld ", proj_nr);
-               else {
+               } else {
                        unsigned i, j, f = 0;
 
                        for (i = 0; i < ARRAY_SIZE(proj_lut); ++i) {
@@ -820,9 +908,6 @@ static void dump_node_nodeattr(FILE *F, const ir_node *n)
        case iro_Sel:
                fprintf(F, "%s ", get_ent_dump_name(get_Sel_entity(n)));
                break;
-       case iro_Cast:
-               ir_fprintf(F, "(%+F)", get_Cast_type(n));
-               break;
        case iro_Cmp:
                fprintf(F, "%s ", get_relation_string(get_Cmp_relation(n)));
                break;
@@ -1145,7 +1230,7 @@ static void print_data_edge_vcgattr(FILE *F, const ir_node *from, int to)
         * do not use get_nodes_block() here, will fail
         * if the irg is not pinned.
         */
-       if (get_irn_n(from, -1) == get_irn_n(get_irn_n(from, to), -1))
+       if (get_nodes_block(from) == get_nodes_block(get_irn_n(from, to)))
                fprintf(F, INTRA_DATA_EDGE_ATTR);
        else
                fprintf(F, INTER_DATA_EDGE_ATTR);
@@ -1157,7 +1242,7 @@ static void print_mem_edge_vcgattr(FILE *F, const ir_node *from, int to)
         * do not use get_nodes_block() here, will fail
         * if the irg is not pinned.
         */
-       if (get_irn_n(from, -1) == get_irn_n(get_irn_n(from, to), -1))
+       if (get_nodes_block(from) == get_nodes_block(get_irn_n(from, to)))
                fprintf(F, INTRA_MEM_EDGE_ATTR);
        else
                fprintf(F, INTER_MEM_EDGE_ATTR);
@@ -1268,9 +1353,8 @@ static void dump_ir_data_edges(FILE *F, const ir_node *n)
  */
 static void dump_ir_edges(ir_node *node, void *env)
 {
-       int              i = 0;
-       FILE            *F = (FILE*)env;
-       const ir_edge_t *edge;
+       int   i = 0;
+       FILE *F = (FILE*)env;
 
        foreach_out_edge(node, edge) {
                ir_node *succ = get_edge_src_irn(edge);
@@ -1341,7 +1425,6 @@ static void dump_const_expression(FILE *F, ir_node *value)
 static void dump_whole_block(FILE *F, const ir_node *block)
 {
        ir_node *node;
-       ird_color_t color = ird_color_block_background;
 
        assert(is_Block(block));
 
@@ -1350,11 +1433,11 @@ static void dump_whole_block(FILE *F, const ir_node *block)
        fprintf(F, " label: \"");
        dump_node_label(F, block);
 
-       /* colorize blocks */
-       if (! get_Block_matured(block))
-               color = ird_color_block_background;
-
        fprintf(F, "\" status:clustered ");
+       /* colorize blocks */
+       ird_color_t const color =
+               !get_Block_matured(block) ? ird_color_error :
+               ird_color_block_background;
        print_vcg_color(F, color);
        fprintf(F, "\n");
 
@@ -1507,9 +1590,6 @@ static void dump_node2type_edges(ir_node *n, void *env)
        case iro_Free:
                print_node_type_edge(F,n,get_Free_type(n),NODE2TYPE_EDGE_ATTR);
                break;
-       case iro_Cast:
-               print_node_type_edge(F,n,get_Cast_type(n),NODE2TYPE_EDGE_ATTR);
-               break;
        default:
                break;
        }
@@ -2208,7 +2288,6 @@ static void dump_loops_standalone(FILE *F, ir_loop *loop)
                        (unsigned long) first,
                        (unsigned long) first,
                        (unsigned long) i-1);
-               loop_node_started = false;
        }
 }
 
@@ -2291,7 +2370,6 @@ void dump_loop(FILE *F, ir_loop *l)
 {
        pset *loopnodes = pset_new_ptr_default();
        pset *extnodes  = pset_new_ptr_default();
-       ir_node *n, *b;
        char name[50];
 
        snprintf(name, sizeof(name), "loop_%ld", get_loop_loop_nr(l));
@@ -2302,28 +2380,28 @@ void dump_loop(FILE *F, ir_loop *l)
        collect_nodeloop_external_nodes(l, loopnodes, extnodes);
 
        /* build block lists */
-       foreach_pset(loopnodes, ir_node*, n) {
+       foreach_pset(loopnodes, ir_node, n) {
                set_irn_link(n, NULL);
        }
-       foreach_pset(extnodes, ir_node*, n) {
+       foreach_pset(extnodes, ir_node, n) {
                set_irn_link(n, NULL);
        }
-       foreach_pset(loopnodes, ir_node*, n) {
+       foreach_pset(loopnodes, ir_node, n) {
                if (!is_Block(n)) {
-                       b = get_nodes_block(n);
+                       ir_node *const b = get_nodes_block(n);
                        set_irn_link(n, get_irn_link(b));
                        set_irn_link(b, n);
                }
        }
-       foreach_pset(extnodes, ir_node*, n) {
+       foreach_pset(extnodes, ir_node, n) {
                if (!is_Block(n)) {
-                       b = get_nodes_block(n);
+                       ir_node *const b = get_nodes_block(n);
                        set_irn_link(n, get_irn_link(b));
                        set_irn_link(b, n);
                }
        }
 
-       foreach_pset(loopnodes, ir_node*, b) {
+       foreach_pset(loopnodes, ir_node, b) {
                if (is_Block(b)) {
                        fprintf(F, "graph: { title: ");
                        print_nodeid(F, b);
@@ -2336,7 +2414,7 @@ void dump_loop(FILE *F, ir_loop *l)
                        dump_ir_data_edges(F, b);
 
                        /* dump the nodes that go into the block */
-                       for (n = (ir_node*)get_irn_link(b); n; n = (ir_node*)get_irn_link(n)) {
+                       for (ir_node *n = (ir_node*)get_irn_link(b); n; n = (ir_node*)get_irn_link(n)) {
                                if (pset_find_ptr(extnodes, n))
                                        overrule_nodecolor = ird_color_block_inout;
                                dump_node(F, n);
@@ -2350,7 +2428,7 @@ void dump_loop(FILE *F, ir_loop *l)
                        fprintf(F, "\n");
                }
        }
-       foreach_pset(extnodes, ir_node*, b) {
+       foreach_pset(extnodes, ir_node, b) {
                if (is_Block(b)) {
                        fprintf(F, "graph: { title: ");
                        print_nodeid(F, b);
@@ -2360,7 +2438,7 @@ void dump_loop(FILE *F, ir_loop *l)
                        fprintf(F, "\" status:clustered color:lightblue\n");
 
                        /* dump the nodes that go into the block */
-                       for (n = (ir_node*)get_irn_link(b); n; n = (ir_node*)get_irn_link(n)) {
+                       for (ir_node *n = (ir_node*)get_irn_link(b); n; n = (ir_node*)get_irn_link(n)) {
                                if (!pset_find_ptr(loopnodes, n))
                                        overrule_nodecolor = ird_color_block_inout;
                                dump_node(F, n);