X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=4c0af7b5b7b681e048dfaf735dfe4953813afdaf;hb=e1c33a238578342a072e1c95ff12eefe6d0acd37;hp=ee522391718af4ecae7b2f614bd7adb3f97fce27;hpb=d382d46d40faa79f071cf3eebd74fc47ad22b196;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index ee5223917..4c0af7b5b 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -23,6 +23,8 @@ #include "firm_common_t.h" +#include "list.h" + #include "irnode.h" #include "irgraph.h" #include "irprog_t.h" @@ -40,12 +42,13 @@ #include "irloop_t.h" #include "callgraph.h" #include "irextbb_t.h" +#include "irhooks.h" #include "dbginfo_t.h" #include "irtools.h" #include "irvrfy.h" -#include "panic.h" +#include "error.h" #include "array.h" #include "pmap.h" #include "eset.h" @@ -81,11 +84,14 @@ static int dump_keepalive = 0; /** An option to dump ld_names instead of names. */ static int dump_ld_name = 1; /** Compiler options to dump analysis information in dump_ir_graph */ -int dump_out_edge_flag = 0; +static int dump_out_edge_flag = 0; +static int dump_loop_information_flag = 0; +static int dump_backedge_information_flag = 1; +static int dump_const_local = 0; +/** An option to dump all graph anchors */ +static int dump_anchors = 0; + int dump_dominator_information_flag = 0; -int dump_loop_information_flag = 0; -int dump_backedge_information_flag = 1; -int dump_const_local = 0; int opt_dump_analysed_type_info = 1; int opt_dump_pointer_values_to_info = 0; /* default off: for test compares!! */ @@ -105,6 +111,19 @@ DUMP_NODE_EDGE_FUNC get_dump_node_edge_hook(void) } +static DUMP_NODE_EDGE_FUNC dump_block_edge_hook = NULL; + +void set_dump_block_edge_hook(DUMP_NODE_EDGE_FUNC func) +{ + dump_block_edge_hook = func; +} + +DUMP_NODE_EDGE_FUNC get_dump_block_edge_hook(void) +{ + return dump_node_edge_hook; +} + + /** The vcg node attribute hook. */ static DUMP_IR_GRAPH_FUNC dump_ir_graph_hook = NULL; /** The vcg node attribute hook. */ @@ -125,7 +144,7 @@ void set_dump_edge_vcgattr_hook(DUMP_EDGE_VCGATTR_FUNC hook) { dump_edge_vcgattr_hook = hook; } -INLINE int get_opt_dump_const_local(void) { +int get_opt_dump_const_local(void) { if (!dump_out_edge_flag && !dump_loop_information_flag) return dump_const_local; else @@ -201,6 +220,10 @@ void dump_ld_names(int flag) { dump_ld_name = flag; } +void dump_all_anchors(int flag) { + dump_anchors = flag; +} + /* -------------- some extended helper functions ----------------- */ /** @@ -219,7 +242,7 @@ const char *get_mode_name_ex(ir_mode *mode, int *bad) * returns the name of a type or if mode is NOT a mode object. * in the later case, sets bad */ -const char *get_type_name_ex(type *tp, int *bad) +const char *get_type_name_ex(ir_type *tp, int *bad) { if (is_type(tp)) return get_type_name(tp); @@ -250,7 +273,7 @@ static void print_vcg_color(FILE *F, dumper_colors color) { * prints the edge from a type S to a type T with additional info fmt, ... * to the file F */ -static void print_type_type_edge(FILE *F, type *S, type *T, const char *fmt, ...) +static void print_type_type_edge(FILE *F, ir_type *S, ir_type *T, const char *fmt, ...) { va_list ap; @@ -266,7 +289,7 @@ static void print_type_type_edge(FILE *F, type *S, type *T, const char *fmt, ... * prints the edge from a type T to an entity E with additional info fmt, ... * to the file F */ -static void print_type_ent_edge(FILE *F, type *T, entity *E, const char *fmt, ...) +static void print_type_ent_edge(FILE *F, ir_type *T, entity *E, const char *fmt, ...) { va_list ap; @@ -302,7 +325,7 @@ static void print_ent_ent_edge(FILE *F, entity *E, entity *T, int backedge, cons * prints the edge from an entity E to a type T with additional info fmt, ... * to the file F */ -static void print_ent_type_edge(FILE *F, entity *E, type *T, const char *fmt, ...) +static void print_ent_type_edge(FILE *F, entity *E, ir_type *T, const char *fmt, ...) { va_list ap; @@ -318,7 +341,7 @@ static void print_ent_type_edge(FILE *F, entity *E, type *T, const char *fmt, .. * prints the edge from a node N to a type T with additional info fmt, ... * to the file F */ -static void print_node_type_edge(FILE *F, const ir_node *N, type *T, const char *fmt, ...) +static void print_node_type_edge(FILE *F, const ir_node *N, ir_type *T, const char *fmt, ...) { va_list ap; @@ -367,7 +390,7 @@ static void print_ent_node_edge(FILE *F, entity *E, const ir_node *N, const char * prints the edge from a type E to an enumeration item item with additional info fmt, ... * to the file F */ -static void print_enum_item_edge(FILE *F, type *E, int item, const char *fmt, ...) +static void print_enum_item_edge(FILE *F, ir_type *E, int item, const char *fmt, ...) { va_list ap; @@ -494,6 +517,27 @@ static int node_floats(ir_node *n) { (get_irg_pinned(current_ir_graph) == op_pin_state_floats)); } +/** + * Walker that visits the anchors + */ +static void ird_walk_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *post, void *env) { + irg_walk_graph(irg, pre, post, env); + + if (dump_anchors) { + int i; + + for (i = anchor_max - 1; i >= 0; --i) { + ir_node *n = irg->anchors[i]; + + if (n) { + /* reset the visit flag: will be increase in the walker */ + set_irg_visited(irg, get_irg_visited(irg) - 1); + irg_walk(n, pre, post, env); + } + } + } +} + /** * Walker, allocates an array for all blocks and puts it's nodes non-floating nodes into this array. */ @@ -537,10 +581,10 @@ static ir_node **construct_block_lists(ir_graph *irg) { ir_graph *rem = current_ir_graph; current_ir_graph = irg; - for (i = 0; i < get_irp_n_irgs(); i++) + for (i = get_irp_n_irgs() - 1; i >= 0; --i) ird_set_irg_link(get_irp_irg(i), NULL); - irg_walk_graph(current_ir_graph, clear_link, collect_node, current_ir_graph); + ird_walk_graph(current_ir_graph, clear_link, collect_node, current_ir_graph); /* Collect also EndReg and EndExcept. We do not want to change the walker. */ set_interprocedural_view(0); @@ -561,8 +605,10 @@ typedef struct _list_tuple { ir_extblk **extbb_list; } list_tuple; -/** Construct lists to walk ir extended block-wise. +/** 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); @@ -575,6 +621,7 @@ static list_tuple *construct_extblock_lists(ir_graph *irg) { 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 = ARR_LEN(blk_list) - 1; i >= 0; --i) { ir_extblk *ext; @@ -589,9 +636,9 @@ static list_tuple *construct_extblock_lists(ir_graph *irg) { else ARR_APP1(ir_node *, lists->blk_list, blk_list[i]); } + DEL_ARR_F(blk_list); current_ir_graph = rem; - DEL_ARR_F(blk_list); ird_set_irg_link(irg, lists); return lists; } @@ -742,7 +789,7 @@ static int dump_node_typeinfo(FILE *F, ir_node *n) { if (opt_dump_analysed_type_info) { if (get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_consistent || get_irg_typeinfo_state(current_ir_graph) == ir_typeinfo_inconsistent) { - type *tp = get_irn_typeinfo_type(n); + ir_type *tp = get_irn_typeinfo_type(n); if (tp != firm_none_type) fprintf(F, "[%s] ", get_type_name_ex(tp, &bad)); else @@ -858,6 +905,41 @@ static const pns_lookup_t alloc_lut[] = { #undef X }; +/** the lookup table for Proj(CopyB) names */ +static const pns_lookup_t copyb_lut[] = { +#define X(a) { pn_CopyB_##a, #a } + X(M), + X(X_except), + X(M_except) +#undef X +}; + +/** the lookup table for Proj(InstOf) names */ +static const pns_lookup_t instof_lut[] = { +#define X(a) { pn_InstOf_##a, #a } + X(M), + X(X_except), + X(res), + X(M_except), +#undef X +}; + +/** the lookup table for Proj(Raise) names */ +static const pns_lookup_t raise_lut[] = { +#define X(a) { pn_Raise_##a, #a } + X(M), + X(X), +#undef X +}; + +/** the lookup table for Proj(Bound) names */ +static const pns_lookup_t bound_lut[] = { +#define X(a) { pn_Bound_##a, #a } + X(M), + X(X_except), + X(res), +#undef X +}; /** the Proj lookup table */ static const proj_lookup_t proj_lut[] = { @@ -871,7 +953,11 @@ static const proj_lookup_t proj_lut[] = { { iro_Mod, E(mod_lut) }, { iro_Load, E(load_lut) }, { iro_Store, E(store_lut) }, - { iro_Alloc, E(alloc_lut) } + { iro_Alloc, E(alloc_lut) }, + { iro_CopyB, E(copyb_lut) }, + { iro_InstOf, E(instof_lut) }, + { iro_Raise, E(raise_lut) }, + { iro_Bound, E(bound_lut) } #undef E }; @@ -908,6 +994,8 @@ handle_lut: fprintf (F, "%s ", get_pnc_string(get_Proj_proj(n))); else 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 { unsigned i, j, f = 0; @@ -1035,6 +1123,10 @@ static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad) case iro_Phi: print_vcg_color(F, ird_color_green); break; + case iro_Mux: + case iro_Psi: + print_vcg_color(F, ird_color_gold); + break; case iro_Const: case iro_Proj: case iro_Filter: @@ -1046,6 +1138,25 @@ static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad) } } +/* Adds a new node info dumper callback. */ +void *dump_add_node_info_callback(dump_node_info_cb_t *cb, void *data) +{ + hook_entry_t *info = xmalloc(sizeof(*info)); + + info->hook._hook_node_info = cb; + info->context = data; + register_hook(hook_node_info, info); + + return info; +} + +/* Remove a previously added info dumper callback. */ +void dump_remv_node_info_callback(void *handle) +{ + hook_entry_t *info = handle; + unregister_hook(hook_node_info, info); + xfree(info); +} /** * Dump the node information of a node n to a file F. @@ -1060,6 +1171,9 @@ static INLINE int dump_node_info(FILE *F, ir_node *n) /* call the dump_node operation if available */ if (ops->dump_node) bad = ops->dump_node(n, F, dump_node_info_txt); + + /* allow additional info to be added */ + hook_node_info(F, n); fprintf(F, "\"\n"); return bad; @@ -1280,7 +1394,7 @@ print_edge_vcgattr(FILE *F, ir_node *from, int to) { case iro_Block: fprintf (F, CF_EDGE_ATTR); break; - case iro_Start: break; + case iro_Start: break; case iro_End: if (to >= 0) { if (get_irn_mode(get_End_keepalive(from, to)) == mode_BB) @@ -1289,108 +1403,21 @@ print_edge_vcgattr(FILE *F, ir_node *from, int to) { fprintf (F, INTER_MEM_EDGE_ATTR); } break; - case iro_EndReg: - case iro_EndExcept: - case iro_Jmp: - case iro_Break: - case iro_Cond: - print_data_edge_vcgattr(F, from, to); - break; - case iro_Return: - case iro_Raise: - if (to == 0) - print_mem_edge_vcgattr(F, from, to); - else - print_data_edge_vcgattr(F, from, to); - break; - case iro_Const: - case iro_SymConst: - print_data_edge_vcgattr(F, from, to); - break; - case iro_Sel: - case iro_Call: - if (to == 0) - print_mem_edge_vcgattr(F, from, to); - else - print_data_edge_vcgattr(F, from, to); - break; - case iro_CallBegin: - case iro_Add: - case iro_Sub: - case iro_Minus: - case iro_Mul: - print_data_edge_vcgattr(F, from, to); - break; - case iro_Quot: - case iro_DivMod: - case iro_Div: - case iro_Mod: - if (to == 0) - print_mem_edge_vcgattr(F, from, to); - else - print_data_edge_vcgattr(F, from, to); - break; - case iro_Abs: - case iro_And: - case iro_Or: - case iro_Eor: - case iro_Shl: - case iro_Shr: - case iro_Shrs: - case iro_Rot: - case iro_Cmp: - case iro_Conv: - print_data_edge_vcgattr(F, from, to); - break; - case iro_Phi: - if (get_irn_modecode(from) == irm_M) - fprintf (F, INTER_MEM_EDGE_ATTR); - else - print_data_edge_vcgattr(F, from, to); - break; - case iro_Load: - case iro_Store: - case iro_Alloc: - case iro_Free: - if (to == 0) - print_mem_edge_vcgattr(F, from, to); - else - print_data_edge_vcgattr(F, from, to); - break; - case iro_Sync: - print_mem_edge_vcgattr(F, from, to); - break; - case iro_Tuple: break; - case iro_Proj: - case iro_Filter: - switch (get_irn_modecode(from)) { - case irm_X: - fprintf (F, CF_EDGE_ATTR); - break; - case irm_M: - fprintf (F, INTER_MEM_EDGE_ATTR); - break; - default: - print_data_edge_vcgattr(F, from, to); - break; + default: + if (is_Proj(from)) { + if (get_irn_mode(from) == mode_M) + print_mem_edge_vcgattr(F, from, to); + else if (get_irn_mode(from) == mode_X) + fprintf(F, CF_EDGE_ATTR); + else + print_data_edge_vcgattr(F, from, to); } - break; - case iro_Bad: break; - case iro_Unknown: break; - case iro_Id: - switch (get_irn_modecode(from)) { - case irm_M: - fprintf (F, INTRA_MEM_EDGE_ATTR); - break; - case irm_X: + else if (get_irn_mode(get_irn_n(from, to)) == mode_M) + print_mem_edge_vcgattr(F, from, to); + else if (get_irn_mode(get_irn_n(from, to)) == mode_X) fprintf (F, CF_EDGE_ATTR); - break; - default: + else print_data_edge_vcgattr(F, from, to); - break; - } break; - default: - ; } } @@ -1509,6 +1536,9 @@ dump_whole_block(FILE *F, ir_node *block) { /* dump the blocks edges */ dump_ir_data_edges(F, block); + if (dump_block_edge_hook) + dump_block_edge_hook(F, block); + /* dump the nodes that go into the block */ for (node = ird_get_irn_link(block); node; node = ird_get_irn_link(node)) { dump_node(F, node); @@ -1594,7 +1624,6 @@ dump_extblock_graph(FILE *F, ir_graph *irg) { ir_extblk **arr = ird_get_irg_link(irg); current_ir_graph = irg; - compute_extbb(irg); for (i = ARR_LEN(arr) - 1; i >= 0; --i) { ir_extblk *extbb = arr[i]; ir_node *leader = get_extbb_leader(extbb); @@ -1646,11 +1675,8 @@ static void dump_node2type_edges(ir_node *n, void *env) /* @@@ some consts have an entity */ break; case iro_SymConst: - if ( (get_SymConst_kind(n) ==symconst_type_tag) - || (get_SymConst_kind(n) ==symconst_size)) - { - print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR); - } + if (SYMCONST_HAS_TYPE(get_SymConst_kind(n))) + print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR); break; case iro_Sel: { print_node_ent_edge(F,n,get_Sel_entity(n),NODE2TYPE_EDGE_ATTR); @@ -1673,7 +1699,7 @@ static void dump_node2type_edges(ir_node *n, void *env) } #if 0 -static int print_type_info(FILE *F, type *tp) { +static int print_type_info(FILE *F, ir_type *tp) { int bad = 0; if (get_type_state(tp) == layout_undefined) { @@ -1688,7 +1714,7 @@ static int print_type_info(FILE *F, type *tp) { return bad; } -static void print_typespecific_info(FILE *F, type *tp) { +static void print_typespecific_info(FILE *F, ir_type *tp) { switch (get_type_tpop_code(tp)) { case tpo_class: { @@ -1723,7 +1749,7 @@ static void print_typespecific_info(FILE *F, type *tp) { } #endif -static void print_typespecific_vcgattr(FILE *F, type *tp) { +static void print_typespecific_vcgattr(FILE *F, ir_type *tp) { switch (get_type_tpop_code(tp)) { case tpo_class: { @@ -1759,7 +1785,7 @@ static void print_typespecific_vcgattr(FILE *F, type *tp) { } -int dump_type_node(FILE *F, type *tp) +int dump_type_node(FILE *F, ir_type *tp) { int bad = 0; @@ -1804,7 +1830,7 @@ void dump_entity_node(FILE *F, entity *ent, int color) } #undef X -static void dump_enum_item(FILE *F, type *tp, int pos) +static void dump_enum_item(FILE *F, ir_type *tp, int pos) { char buf[1024]; ident *id = get_enumeration_nameid(tp, pos); @@ -1872,7 +1898,7 @@ dump_type_info(type_or_ent *tore, void *env) { } break; case k_type: { - type *tp = (type *)tore; + ir_type *tp = (ir_type *)tore; dump_type_node(F, tp); /* and now the edges */ switch (get_type_tpop_code(tp)) { @@ -1971,7 +1997,7 @@ dump_class_hierarchy_node (type_or_ent *tore, void *ctx) { } break; /* case k_entity */ case k_type: { - type *tp = (type *)tore; + ir_type *tp = (ir_type *)tore; if (tp == get_glob_type()) break; switch (get_type_tpop_code(tp)) { case tpo_class: { @@ -2114,13 +2140,7 @@ void dump_vcg_header(FILE *F, const char *name, const char *orientation) { "port_sharing: no\n" "orientation: %s\n" "classname 1: \"intrablock Data\"\n" - "classname 16: \"interblock Data\"\n" "classname 2: \"Block\"\n" - "classname 13: \"Control Flow\"\n" - "classname 18: \"Exception Control Flow for Interval Analysis\"\n" - "classname 14: \"intrablock Memory\"\n" - "classname 17: \"interblock Memory\"\n" - "classname 15: \"Dominators\"\n" "classname 3: \"Entity type\"\n" "classname 4: \"Entity owner\"\n" "classname 5: \"Method Param\"\n" @@ -2131,6 +2151,13 @@ void dump_vcg_header(FILE *F, const char *name, const char *orientation) { "classname 10: \"Array Element Type\"\n" "classname 11: \"Overwrites\"\n" "classname 12: \"Member\"\n" + "classname 13: \"Control Flow\"\n" + "classname 14: \"intrablock Memory\"\n" + "classname 15: \"Dominators\"\n" + "classname 16: \"interblock Data\"\n" + "classname 17: \"interblock Memory\"\n" + "classname 18: \"Exception Control Flow for Interval Analysis\"\n" + "classname 19: \"Postdominators\"\n" "infoname 1: \"Attribute\"\n" "infoname 2: \"Verification errors\"\n" "infoname 3: \"Debug info\"\n", @@ -2310,7 +2337,7 @@ dump_ir_graph (ir_graph *irg, const char *suffix ) /* walk over the graph */ /* dump_whole_node must be called in post visiting predecessors */ - irg_walk(get_irg_end(irg), NULL, dump_whole_node, f); + ird_walk_graph(irg, NULL, dump_whole_node, f); /* dump the out edges in a separate walk */ if ((dump_out_edge_flag) && (get_irg_outs_state(irg) != outs_none)) { @@ -2344,7 +2371,7 @@ void dump_ir_block_graph (ir_graph *irg, const char *suffix) * only the requested irg but also all irgs that can be reached * from irg. */ - for (i = 0; i < get_irp_n_irgs(); i++) { + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { ir_node **arr = ird_get_irg_link(get_irp_irg(i)); if (arr) { dump_graph_from_list(f, get_irp_irg(i)); @@ -2366,7 +2393,8 @@ void dump_ir_extblock_graph (ir_graph *irg, const char *suffix) if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg)))) return; - compute_extbb(irg); + if (get_irg_extblk_state(irg) != extblk_valid) + compute_extbb(irg); if (get_interprocedural_view()) suffix1 = "-ip"; else suffix1 = ""; @@ -2386,7 +2414,7 @@ void dump_ir_extblock_graph (ir_graph *irg, const char *suffix) dump_graph_info(F, irg); print_dbg_info(F, get_entity_dbg_info(ent)); - for (i = 0; i < get_irp_n_irgs(); i++) { + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { ir_graph *irg = get_irp_irg(i); list_tuple *lists = ird_get_irg_link(irg); @@ -2477,7 +2505,7 @@ dump_ir_block_graph_w_types (ir_graph *irg, const char *suffix) /* dump common blocked ir graph */ construct_block_lists(irg); - for (i = 0; i < get_irp_n_irgs(); i++) { + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { ir_node **arr = ird_get_irg_link(get_irp_irg(i)); if (arr) { dump_graph_from_list(f, get_irp_irg(i)); @@ -2522,27 +2550,6 @@ dump_block_to_cfg(ir_node *block, void *env) { fprintf (F, "\" "); fprintf(F, "info1:\""); -#if 0 - if (dump_dominator_information_flag) { - fprintf(F, "dom depth %d\n", get_Block_dom_depth(block)); - fprintf(F, "tree pre num %d\n", get_Block_dom_tree_pre_num(block)); - fprintf(F, "max subtree pre num %d\n", get_Block_dom_max_subtree_pre_num(block)); - } - - /* show arity and possible Bad predecessors of the block */ - fprintf(F, "arity: %d\n", get_Block_n_cfgpreds(block)); - for (fl = i = 0; i < get_Block_n_cfgpreds(block); ++i) { - ir_node *pred = get_Block_cfgpred(block, i); - if (is_Bad(pred)) { - if (! fl) - fprintf(F, "Bad pred at pos: "); - fprintf(F, "%d ", i); - fl = 1; - } - } - if (fl) - fprintf(F, "\n"); -#else /* the generic version. */ dump_irnode_to_file(F, block); @@ -2550,7 +2557,6 @@ dump_block_to_cfg(ir_node *block, void *env) { for (i = 0; i < get_Block_n_cfgpreds(block); ++i) if ((fl = is_Bad(get_Block_cfgpred(block, i)))) break; -#endif fprintf (F, "\""); /* closing quote of info */ @@ -2572,14 +2578,24 @@ dump_block_to_cfg(ir_node *block, void *env) { fprintf (F, "\"}\n"); } - /* Dump dominator edge */ - if (dump_dominator_information_flag && get_Block_idom(block)) { - pred = get_Block_idom(block); - fprintf (F, "edge: { sourcename: \""); - PRINT_NODEID(block); - fprintf (F, "\" targetname: \""); - PRINT_NODEID(pred); - fprintf (F, "\" " DOMINATOR_EDGE_ATTR "}\n"); + /* Dump dominator/postdominator edge */ + if (dump_dominator_information_flag) { + if (get_irg_dom_state(current_ir_graph) == dom_consistent && get_Block_idom(block)) { + pred = get_Block_idom(block); + fprintf (F, "edge: { sourcename: \""); + PRINT_NODEID(block); + fprintf (F, "\" targetname: \""); + PRINT_NODEID(pred); + fprintf (F, "\" " DOMINATOR_EDGE_ATTR "}\n"); + } + if (get_irg_postdom_state(current_ir_graph) == dom_consistent && get_Block_ipostdom(block)) { + pred = get_Block_ipostdom(block); + fprintf (F, "edge: { sourcename: \""); + PRINT_NODEID(block); + fprintf (F, "\" targetname: \""); + PRINT_NODEID(pred); + fprintf (F, "\" " POSTDOMINATOR_EDGE_ATTR "}\n"); + } } } } @@ -2589,7 +2605,6 @@ dump_cfg (ir_graph *irg, const char *suffix) { FILE *f; ir_graph *rem = current_ir_graph; - int ddif = dump_dominator_information_flag; int ipv = get_interprocedural_view(); /* if a filter is set, dump only the irg's that match the filter */ @@ -2606,14 +2621,10 @@ dump_cfg (ir_graph *irg, const char *suffix) set_interprocedural_view(0); } - if (get_irg_dom_state(irg) != dom_consistent) - dump_dominator_information_flag = 0; - /* walk over the blocks in the graph */ irg_block_walk(get_irg_end(irg), dump_block_to_cfg, NULL, f); dump_node(f, get_irg_bad(irg)); - dump_dominator_information_flag = ddif; set_interprocedural_view(ipv); vcg_close(f); current_ir_graph = rem; @@ -2696,7 +2707,7 @@ static int get_entity_color(entity *ent) { void dump_callgraph(const char *suffix) { FILE *F; - int i, n_irgs = get_irp_n_irgs(); + int i; int rem = edge_label; edge_label = 1; //ident *prefix = new_id_from_str("java/"); @@ -2704,7 +2715,7 @@ void dump_callgraph(const char *suffix) { F = vcg_open_name("Callgraph", suffix); dump_vcg_header(F, "Callgraph", NULL); - for (i = 0; i < n_irgs; ++i) { + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { ir_graph *irg = get_irp_irg(i); entity *ent = get_irg_entity(irg); int j, n_callees = get_irg_n_callees(irg); @@ -2740,13 +2751,13 @@ void dump_all_cg_block_graph(const char *suffix) { dump_vcg_header(f, "All_graphs", NULL); /* collect nodes in all irgs reachable in call graph*/ - for (i = 0; i < get_irp_n_irgs(); i++) + for (i = get_irp_n_irgs() - 1; i >= 0; --i) ird_set_irg_link(get_irp_irg(i), NULL); cg_walk(clear_link, collect_node, NULL); /* dump all graphs */ - for (i = 0; i < get_irp_n_irgs(); i++) { + for (i = get_irp_n_irgs() - 1; i >= 0; --i) { current_ir_graph = get_irp_irg(i); assert(ird_get_irg_link(current_ir_graph)); dump_graph_from_list(f, current_ir_graph); @@ -2822,9 +2833,8 @@ dump_class_hierarchy (int entities, const char *suffix) void dump_all_ir_graphs(dump_graph_func *dmp_grph, const char *suffix) { int i; - for (i = get_irp_n_irgs() - 1; i >= 0; --i) { + for (i = get_irp_n_irgs() - 1; i >= 0; --i) dmp_grph(get_irp_irg(i), suffix); - } }