X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=d3da52ca044eaf53936fd1ccd9980cfb8e509ac6;hb=44d8e42d6bc1a5545cf0825e365fec2c389f3752;hp=b87fb4c288a1a50eba7d00a68455a26f295e29f7;hpb=5af4cb6fd26054ef16c8da79d534abacb2a32c6e;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index b87fb4c28..d3da52ca0 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -58,6 +58,7 @@ #include "irhooks.h" #include "dbginfo_t.h" #include "irtools.h" +#include "irprintf.h" #include "irvrfy.h" @@ -106,6 +107,8 @@ static int dump_node_idx_labels = 0; static int dump_anchors = 0; /** An option to dump the macro block edges. */ static int dump_macro_block_edges = 0; +/** An option to dump block marker in the block title */ +static int dump_block_marker = 0; int dump_dominator_information_flag = 0; int opt_dump_analysed_type_info = 1; @@ -254,6 +257,10 @@ void dump_macroblock_edges(int flag) { dump_macro_block_edges = flag; } +void dump_block_marker_in_title(int flag) { + dump_block_marker = flag; +} + /* -------------- some extended helper functions ----------------- */ /** @@ -732,15 +739,11 @@ int dump_node_opcode(FILE *F, ir_node *n) /* implementation for default nodes */ switch (get_irn_opcode(n)) { - case iro_Const: { - int res; - char buf[1024]; - res = tarval_snprintf(buf, sizeof(buf), get_Const_tarval(n)); - assert(res < (int) sizeof(buf) && "buffer to small for tarval_snprintf"); - fprintf(F, buf); - } break; + case iro_Const: + ir_fprintf(F, "%T", get_Const_tarval(n)); + break; - case iro_SymConst: { + case iro_SymConst: switch (get_SymConst_kind(n)) { case symconst_addr_name: /* don't use get_SymConst_ptr_info as it mangles the name. */ @@ -768,14 +771,14 @@ int dump_node_opcode(FILE *F, ir_node *n) fprintf(F, "SymC %lu label", get_SymConst_label(n)); break; } - } break; + break; - case iro_Filter: { + case iro_Filter: if (!get_interprocedural_view()) fprintf(F, "Proj'"); else goto default_case; - } break; + break; case iro_Proj: { ir_node *pred = get_Proj_pred(n); @@ -790,20 +793,20 @@ int dump_node_opcode(FILE *F, ir_node *n) case iro_Start: case iro_End: case iro_EndExcept: - case iro_EndReg: { + case iro_EndReg: if (get_interprocedural_view()) { fprintf(F, "%s %s", get_irn_opname(n), get_ent_dump_name(get_irg_entity(get_irn_irg(n)))); break; } else goto default_case; - } + case iro_CallBegin: { ir_node *addr = get_CallBegin_ptr(n); ir_entity *ent = NULL; if (get_irn_op(addr) == op_Sel) ent = get_Sel_entity(addr); - else if (is_SymConst_addr_ent(addr)) - ent = get_SymConst_entity(addr); + else if (is_Global(addr)) + ent = get_Global_entity(addr); fprintf(F, "%s", get_irn_opname(n)); if (ent) fprintf(F, " %s", get_entity_name(ent)); break; @@ -819,7 +822,9 @@ int dump_node_opcode(FILE *F, ir_node *n) fprintf(F, "%s", get_irn_opname(n)); break; case iro_Block: - fprintf(F, "%s%s", is_Block_dead(n) ? "Dead " : "", get_irn_opname(n)); + fprintf(F, "%s%s%s", + is_Block_dead(n) ? "Dead " : "", get_irn_opname(n), + dump_block_marker ? (get_Block_mark(n) ? "*" : "") : ""); break; case iro_Conv: if (get_Conv_strict(n)) @@ -827,7 +832,10 @@ int dump_node_opcode(FILE *F, ir_node *n) fprintf(F, "%s", get_irn_opname(n)); break; case iro_Div: - fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Div_resmode(n), &bad)); + fprintf(F, "%s", get_irn_opname(n)); + if (is_Div_remainderless(n)) + fprintf(F, "RL"); + fprintf(F, "[%s]", get_mode_name_ex(get_Div_resmode(n), &bad)); break; case iro_Mod: fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Mod_resmode(n), &bad)); @@ -919,7 +927,6 @@ static const pns_lookup_t start_lut[] = { #define X(a) { pn_Start_##a, #a } X(X_initial_exec), X(P_frame_base), - X(P_globals), X(P_tls), X(T_args), X(P_value_arg_base) @@ -2287,25 +2294,21 @@ void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg) { /** * dumps the VCG header */ -void dump_vcg_header(FILE *F, const char *name, const char *orientation) { +void dump_vcg_header(FILE *F, const char *name, const char *layout, const char *orientation) { int i; char *label; init_colors(); - if (edge_label) { - label = "yes"; - } else { - label = "no"; - } - + label = edge_label ? "yes" : "no"; + if (! layout) layout = "Compilergraph"; if (!orientation) orientation = "bottom_to_top"; /* print header */ fprintf(F, "graph: { title: \"ir graph of %s\"\n" "display_edge_labels: %s\n" - "layoutalgorithm: mindepth\n" + "layoutalgorithm: mindepth //$ \"%s\"\n" "manhattan_edges: yes\n" "port_sharing: no\n" "orientation: %s\n" @@ -2334,10 +2337,10 @@ void dump_vcg_header(FILE *F, const char *name, const char *orientation) { "infoname 1: \"Attribute\"\n" "infoname 2: \"Verification errors\"\n" "infoname 3: \"Debug info\"\n", - name, label, orientation); + name, label, layout, orientation); for (i = 0; i < ird_color_count; ++i) { - if(color_rgb[i] != NULL) { + if (color_rgb[i] != NULL) { fprintf(F, "colorentry %s: %s\n", color_names[i], color_rgb[i]); } } @@ -2484,7 +2487,7 @@ void dump_ir_graph_file(ir_graph *irg, FILE *out) construct_backedges(irg); } - dump_vcg_header(out, get_irg_dump_name(irg), NULL); + dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL); /* call the dump graph hook */ if (dump_ir_graph_hook) { @@ -2515,7 +2518,7 @@ void dump_ir_block_graph_file(ir_graph *irg, FILE *out) { int i; - dump_vcg_header(out, get_irg_dump_name(irg), NULL); + dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL); construct_block_lists(irg); @@ -2550,7 +2553,7 @@ void dump_ir_extblock_graph_file(ir_graph *irg, FILE *F) if (get_irg_extblk_state(irg) != extblk_valid) compute_extbb(irg); - dump_vcg_header(F, get_irg_dump_name(irg), NULL); + dump_vcg_header(F, get_irg_dump_name(irg), NULL, NULL); construct_extblock_lists(irg); @@ -2609,7 +2612,7 @@ void dump_ir_graph_w_types_file(ir_graph *irg, FILE *out) /* dumping types does not work with local nodes */ dump_const_local = 0; - dump_vcg_header(out, get_irg_dump_name(irg), NULL); + dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL); /* dump common ir graph */ irg_walk(get_irg_end(irg), NULL, dump_whole_node, out); @@ -2641,7 +2644,7 @@ void dump_ir_block_graph_w_types_file(ir_graph *irg, FILE *out) /* dumping types does not work with local nodes */ dump_const_local = 0; - dump_vcg_header(out, get_irg_dump_name(irg), NULL); + dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL); /* dump common blocked ir graph */ construct_block_lists(irg); @@ -2762,7 +2765,7 @@ void dump_cfg(ir_graph *irg, const char *suffix) #endif current_ir_graph = irg; - dump_vcg_header(f, get_irg_dump_name(irg), NULL); + dump_vcg_header(f, get_irg_dump_name(irg), NULL, NULL); #ifdef INTERPROCEDURAL_VIEW if (ipv) { @@ -2811,7 +2814,7 @@ void dump_subgraph(ir_node *root, int depth, const char *suffix) { F = vcg_open(get_irn_irg(root), suffix, buf); if (F != NULL) { pset *mark_set = pset_new_ptr(1); - dump_vcg_header(F, get_irg_dump_name(get_irn_irg(root)), NULL); + dump_vcg_header(F, get_irg_dump_name(get_irn_irg(root)), NULL, NULL); descend_and_dump(F, root, depth, mark_set); dump_vcg_footer(F); fclose(F); @@ -2908,7 +2911,7 @@ dump_type_graph(ir_graph *irg, const char *suffix) ir_graph *rem = current_ir_graph; current_ir_graph = irg; - dump_vcg_header(f, get_irg_dump_name(irg), NULL); + dump_vcg_header(f, get_irg_dump_name(irg), "Hierarchic", NULL); /* walk over the blocks in the graph */ type_walk_irg(irg, dump_type_info, NULL, f); @@ -2929,7 +2932,7 @@ dump_all_types(const char *suffix) { FILE *f = vcg_open_name("All_types", suffix); if (f) { - dump_vcg_header(f, "All_types", NULL); + dump_vcg_header(f, "All_types", "Hierarchic", NULL); type_walk(dump_type_info, NULL, f); inc_irg_visited(get_const_code_irg()); @@ -2947,7 +2950,7 @@ dump_class_hierarchy(int entities, const char *suffix) h_env_t env; env.f = f; env.dump_ent = entities; - dump_vcg_header(f, "class_hierarchy", NULL); + dump_vcg_header(f, "class_hierarchy", "Hierarchic", NULL); type_walk(dump_class_hierarchy_node, NULL, &env); dump_vcg_footer(f); @@ -2985,15 +2988,14 @@ void dump_loops_standalone(FILE *F, ir_loop *loop) { dump_loop_node(F, loop); /* Dump the loop elements. */ - - for(i = 0; i < get_loop_n_elements(loop); i++) { + for (i = 0; i < get_loop_n_elements(loop); i++) { le = get_loop_element(loop, i); son = le.son; if (get_kind(son) == k_ir_loop) { /* We are a loop son -> Recurse */ - if(loop_node_started) { /* Close the "firm-nodes" node first if we started one. */ + if (loop_node_started) { /* Close the "firm-nodes" node first if we started one. */ fprintf(F, "\" }\n"); fprintf(F, "edge: {sourcename: \""); PRINT_LOOPID(loop); @@ -3028,7 +3030,7 @@ void dump_loops_standalone(FILE *F, ir_loop *loop) { assert(get_kind(son) == k_ir_graph); /* We are a loop node -> Collect firm graphs */ - n = (ir_graph *)le.node; + n = le.irg; if (!loop_node_started) { /* Start a new node which contains all firm nodes of the current loop */ fprintf(F, "node: { title: \""); @@ -3069,9 +3071,10 @@ void dump_loop_tree(ir_graph *irg, const char *suffix) current_ir_graph = irg; edge_label = 1; - dump_vcg_header(f, get_irg_dump_name(irg), "top_to_bottom"); + dump_vcg_header(f, get_irg_dump_name(irg), "Tree", "top_to_bottom"); - if (get_irg_loop(irg)) dump_loops_standalone(f, get_irg_loop(irg)); + if (get_irg_loop(irg)) + dump_loops_standalone(f, get_irg_loop(irg)); dump_vcg_footer(f); fclose(f); @@ -3084,7 +3087,7 @@ void dump_loop_tree(ir_graph *irg, const char *suffix) void dump_callgraph_loop_tree(const char *suffix) { FILE *F; F = vcg_open_name("Callgraph_looptree", suffix); - dump_vcg_header(F, "callgraph looptree", "top_to_bottom"); + dump_vcg_header(F, "callgraph looptree", "Tree", "top_to_bottom"); dump_loops_standalone(F, irp->outermost_cg_loop); dump_vcg_footer(F); fclose(F); @@ -3148,7 +3151,7 @@ void dump_loop(ir_loop *l, const char *suffix) { eset *extnodes = eset_create(); ir_node *n, *b; - dump_vcg_header(F, name, NULL); + dump_vcg_header(F, name, NULL, NULL); /* collect all nodes to dump */ collect_nodeloop(F, l, loopnodes);