X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=ac03cea9f2d05867592e14a59e86c81525b9a065;hb=b59e22a229aa1227ef992c184c79fdafe34908cf;hp=25e011c1eb3c3aad4d357c2f22a34114f45a1794;hpb=dd6793ed8b75dd86637857ce795f07607a6d77ec;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index 25e011c1e..ac03cea9f 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -64,6 +64,109 @@ #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 ""; } @@ -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"); @@ -1406,7 +1489,7 @@ static void dump_block_graph(FILE *F, ir_graph *irg) } if ((flags & ir_dump_flag_loops) - && is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_LOOPINFO)) + && irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO)) dump_loop_nodes_into_graph(F, irg); } @@ -1421,34 +1504,37 @@ static void dump_graph_info(FILE *F, ir_graph *irg) fprintf(F, "\n"); /* dump graph state */ - fprintf(F, "state:"); - if (is_irg_state(irg, IR_GRAPH_STATE_ARCH_DEP)) + fprintf(F, "constraints:"); + if (irg_is_constrained(irg, IR_GRAPH_CONSTRAINT_ARCH_DEP)) fprintf(F, " arch_dep"); - if (is_irg_state(irg, IR_GRAPH_STATE_MODEB_LOWERED)) + if (irg_is_constrained(irg, IR_GRAPH_CONSTRAINT_MODEB_LOWERED)) fprintf(F, " modeb_lowered"); - if (is_irg_state(irg, IR_GRAPH_STATE_NORMALISATION2)) + if (irg_is_constrained(irg, IR_GRAPH_CONSTRAINT_NORMALISATION2)) fprintf(F, " normalisation2"); - if (is_irg_state(irg, IR_GRAPH_STATE_OPTIMIZE_UNREACHABLE_CODE)) + if (irg_is_constrained(irg, IR_GRAPH_CONSTRAINT_OPTIMIZE_UNREACHABLE_CODE)) fprintf(F, " optimize_unreachable_code"); - if (is_irg_state(irg, IR_GRAPH_STATE_NO_CRITICAL_EDGES)) + fprintf(F, "\n"); + + fprintf(F, "properties:"); + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_NO_CRITICAL_EDGES)) fprintf(F, " no_critical_edges"); - if (is_irg_state(irg, IR_GRAPH_STATE_NO_BADS)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_NO_BADS)) fprintf(F, " no_bads"); - if (is_irg_state(irg, IR_GRAPH_STATE_NO_UNREACHABLE_CODE)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_NO_UNREACHABLE_CODE)) fprintf(F, " no_unreachable_code"); - if (is_irg_state(irg, IR_GRAPH_STATE_ONE_RETURN)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_ONE_RETURN)) fprintf(F, " one_return"); - if (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_DOMINANCE)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE)) fprintf(F, " consistent_dominance"); - if (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_POSTDOMINANCE)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_POSTDOMINANCE)) fprintf(F, " consistent_postdominance"); - if (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_OUT_EDGES)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES)) fprintf(F, " consistent_out_edges"); - if (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_OUTS)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUTS)) fprintf(F, " consistent_outs"); - if (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_LOOPINFO)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_LOOPINFO)) fprintf(F, " consistent_loopinfo"); - if (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_ENTITY_USAGE)) + if (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_ENTITY_USAGE)) fprintf(F, " consistent_entity_usage"); fprintf(F, "\"\n"); } @@ -1504,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; } @@ -1998,7 +2081,7 @@ void dump_ir_graph_file(FILE *out, ir_graph *irg) /* dump the out edges in a separate walk */ if ((flags & ir_dump_flag_out_edges) - && (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_OUTS))) { + && (irg_has_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUTS))) { irg_out_walk(get_irg_start(irg), dump_out_edge, NULL, out); } @@ -2054,7 +2137,7 @@ static void dump_block_to_cfg(ir_node *block, void *env) /* Dump dominator/postdominator edge */ if (ir_get_dump_flags() & ir_dump_flag_dominance) { - if (is_irg_state(get_irn_irg(block), IR_GRAPH_STATE_CONSISTENT_DOMINANCE) && get_Block_idom(block)) { + if (irg_has_properties(get_irn_irg(block), IR_GRAPH_PROPERTY_CONSISTENT_DOMINANCE) && get_Block_idom(block)) { ir_node *pred = get_Block_idom(block); fprintf(F, "edge: { sourcename: "); print_nodeid(F, block); @@ -2062,7 +2145,7 @@ static void dump_block_to_cfg(ir_node *block, void *env) print_nodeid(F, pred); fprintf(F, " " DOMINATOR_EDGE_ATTR "}\n"); } - if (is_irg_state(get_irn_irg(block), IR_GRAPH_STATE_CONSISTENT_POSTDOMINANCE) && get_Block_ipostdom(block)) { + if (irg_has_properties(get_irn_irg(block), IR_GRAPH_PROPERTY_CONSISTENT_POSTDOMINANCE) && get_Block_ipostdom(block)) { ir_node *pred = get_Block_ipostdom(block); fprintf(F, "edge: { sourcename: "); print_nodeid(F, block); @@ -2205,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; } } @@ -2288,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)); @@ -2299,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); @@ -2333,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); @@ -2347,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); @@ -2357,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);