X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fir%2Firdump.c;h=a2cde19bf31a3f15ffb5b0b5edef8ada7c93b765;hb=3c3425a50a1d721b74a015c6812257e32feeac85;hp=3e2e63854cbb83cc31bf2291f6ba76d9dbfe71d5;hpb=8294af81ea394a04f4469035d8d15943467022bc;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index 3e2e63854..a2cde19bf 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -50,7 +50,6 @@ #include "irdom.h" #include "irloop_t.h" #include "callgraph.h" -#include "irextbb_t.h" #include "irhooks.h" #include "dbginfo_t.h" #include "irtools.h" @@ -415,24 +414,6 @@ static void print_node_ent_edge(FILE *F, const ir_node *irn, const ir_entity *en va_end(ap); } -/** - * Prints the edge from an entity ent to a node irn with additional info fmt, ... - * to the file F. - */ -static void print_ent_node_edge(FILE *F, const ir_entity *ent, const ir_node *irn, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - fprintf(F, "edge: { sourcename: "); - print_entityid(F, ent); - fprintf(F, "\" targetname: "); - print_nodeid(F, irn); - ir_vfprintf(F, fmt, ap); - fprintf(F,"}\n"); - va_end(ap); -} - /** * Prints the edge from a type tp to an enumeration item item with additional info fmt, ... * to the file F. @@ -488,13 +469,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); } /** @@ -512,13 +490,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); } /** @@ -649,44 +624,6 @@ static ir_node **construct_block_lists(ir_graph *irg) return (ir_node**)ird_get_irg_link(irg); } -typedef struct list_tuple { - ir_node **blk_list; - ir_extblk **extbb_list; -} list_tuple; - -/** Construct lists to walk IR extended block-wise. - * Free the lists in the tuple with DEL_ARR_F(). Sets the irg link field to - * NULL in all graphs not visited. - */ -static list_tuple *construct_extblock_lists(ir_graph *irg) -{ - ir_node **blk_list = construct_block_lists(irg); - size_t i, n; - list_tuple *lists = XMALLOC(list_tuple); - - lists->blk_list = NEW_ARR_F(ir_node *, 0); - lists->extbb_list = NEW_ARR_F(ir_extblk *, 0); - - inc_irg_block_visited(irg); - for (i = 0, n = ARR_LEN(blk_list); i < n; ++i) { - ir_extblk *ext; - - if (is_Block(blk_list[i])) { - ext = get_Block_extbb(blk_list[i]); - - if (extbb_not_visited(ext)) { - ARR_APP1(ir_extblk *, lists->extbb_list, ext); - mark_extbb_visited(ext); - } - } else - ARR_APP1(ir_node *, lists->blk_list, blk_list[i]); - } - DEL_ARR_F(blk_list); - - ird_set_irg_link(irg, lists); - return lists; -} - void dump_node_opcode(FILE *F, const ir_node *n) { const ir_op_ops *ops = get_op_ops(get_irn_op(n)); @@ -1202,7 +1139,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); @@ -1214,7 +1151,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); @@ -1325,9 +1262,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); @@ -1463,7 +1399,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); } @@ -1478,39 +1414,38 @@ 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_IMPLICIT_BITFIELD_MASKING)) - fprintf(F, " implicit_bitfield_masking"); - 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"); - if (is_irg_state(irg, IR_GRAPH_STATE_VALID_EXTENDED_BLOCKS)) - fprintf(F, " valid_exended_blocks"); fprintf(F, "\"\n"); } @@ -1677,7 +1612,6 @@ static void dump_type_info(type_or_ent tore, void *env) switch (get_kind(tore.ent)) { case k_entity: { ir_entity *ent = tore.ent; - ir_node *value; /* The node */ dump_entity_node(F, ent); /* The Edges */ @@ -1694,21 +1628,6 @@ static void dump_type_info(type_or_ent tore, void *env) if (ent->initializer != NULL) { /* new style initializers */ dump_entity_initializer(F, ent); - } else if (entity_has_compound_ent_values(ent)) { - /* old style compound entity values */ - for (i = get_compound_ent_n_values(ent); i > 0;) { - value = get_compound_ent_value(ent, --i); - if (value) { - print_ent_node_edge(F, ent, value, ENT_VALUE_EDGE_ATTR, i); - dump_const_expression(F, value); - print_ent_ent_edge(F, ent, get_compound_ent_value_member(ent, i), 0, ird_color_none, ENT_CORR_EDGE_ATTR, i); - /* - fprintf(F, "edge: { sourcename: \"%p\" targetname: \"%p\" " - ENT_CORR_EDGE_ATTR "}\n", GET_ENTID(ent), - get_compound_ent_value_member(ent, i), i); - */ - } - } } } break; @@ -2048,106 +1967,13 @@ static void dump_blocks_as_subgraphs(FILE *out, ir_graph *irg) } } -/** dumps a graph extended block-wise. Expects all blockless nodes in arr in irgs link. - * The outermost nodes: blocks and nodes not op_pin_state_pinned, Bad, Unknown. */ -static void dump_extblock_graph(FILE *F, ir_graph *irg) -{ - size_t i, arr_len; - ir_extblk **arr = (ir_extblk**)ird_get_irg_link(irg); - - for (i = 0, arr_len = ARR_LEN(arr); i < arr_len; ++i) { - ir_extblk *extbb = arr[i]; - ir_node *leader = get_extbb_leader(extbb); - size_t j, n_blks; - - fprintf(F, "graph: { title: \""); - fprintf(F, "x%ld", get_irn_node_nr(leader)); - fprintf(F, "\" label: \"ExtBB %ld\" status:clustered color:lightgreen\n", - get_irn_node_nr(leader)); - - for (j = 0, n_blks = ARR_LEN(extbb->blks); j < n_blks; ++j) { - ir_node *node = extbb->blks[j]; - if (is_Block(node)) { - /* Dumps the block and all the nodes in the block, which are to - be found in Block->link. */ - dump_whole_block(F, node); - } else { - /* Nodes that are not in a Block. */ - dump_node(F, node); - if (is_Bad(get_nodes_block(node)) && !node_floats(node)) { - dump_const_block_local(F, node); - } - dump_ir_data_edges(F, node); - } - } - fprintf(F, "}\n"); - } - - if ((flags & ir_dump_flag_loops) - && (is_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_LOOPINFO))) - dump_loop_nodes_into_graph(F, irg); - - free_extbb(irg); -} - -static void dump_blocks_extbb_grouped(FILE *F, ir_graph *irg) -{ - size_t i; - ir_entity *ent = get_irg_entity(irg); - - if (!is_irg_state(irg, IR_GRAPH_STATE_VALID_EXTENDED_BLOCKS)) - compute_extbb(irg); - - construct_extblock_lists(irg); - - fprintf(F, "graph: { title: "); - print_irgid(F, irg); - fprintf(F, " label: \"%s\" status:clustered color: white\n", - get_ent_dump_name(ent)); - - dump_graph_info(F, irg); - print_dbg_info(F, get_entity_dbg_info(ent)); - - for (i = get_irp_n_irgs(); i > 0;) { - ir_graph *other_irg = get_irp_irg(--i); - list_tuple *lists = (list_tuple*)ird_get_irg_link(other_irg); - - if (lists) { - /* dump the extended blocks first */ - if (ARR_LEN(lists->extbb_list)) { - ird_set_irg_link(other_irg, lists->extbb_list); - dump_extblock_graph(F, other_irg); - } - - /* we may have blocks without extended blocks, bad for instance */ - if (ARR_LEN(lists->blk_list)) { - ird_set_irg_link(other_irg, lists->blk_list); - dump_block_graph(F, other_irg); - } - - DEL_ARR_F(lists->extbb_list); - DEL_ARR_F(lists->blk_list); - xfree(lists); - } - } - - /* Close the vcg information for the irg */ - fprintf(F, "}\n\n"); - - free_extbb(irg); -} - void dump_ir_graph_file(FILE *out, ir_graph *irg) { dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL); /* dump nodes */ if (flags & ir_dump_flag_blocks_as_subgraphs) { - if (flags & ir_dump_flag_group_extbb) { - dump_blocks_extbb_grouped(out, irg); - } else { - dump_blocks_as_subgraphs(out, irg); - } + dump_blocks_as_subgraphs(out, irg); } else { /* dump_node_with_edges must be called in post visiting predecessors */ ird_walk_graph(irg, NULL, dump_node_with_edges, out); @@ -2168,7 +1994,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); } @@ -2224,7 +2050,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); @@ -2232,7 +2058,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); @@ -2458,7 +2284,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)); @@ -2469,28 +2294,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); @@ -2503,7 +2328,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); @@ -2517,7 +2342,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); @@ -2527,7 +2352,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);