X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=337c091a67260c5e4eef05ae2a102dd5d2ffe2c0;hb=30b120caf1fbc6fcb13c6b3bef8f7132ebff72aa;hp=d0855bf1b79477317fcb6971597479f661276edf;hpb=2605ad5bb5788061b629e6835f1ff972db1937e9;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index d0855bf1b..337c091a6 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -57,10 +57,13 @@ SeqNo get_Block_seqno(ir_node *n); #define DEFAULT_ENUM_ITEM_ATTRIBUTE " " /* Attributes of edges between Firm nodes */ -#define BLOCK_EDGE_ATTR "class:2 priority:2 linestyle:dotted" -#define CF_EDGE_ATTR "class:13 color:red" -#define MEM_EDGE_ATTR "class:14 color:blue" -#define DOMINATOR_EDGE_ATTR "class:15 color:red" +#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 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 BACK_EDGE_ATTR "linestyle:dashed " @@ -106,6 +109,14 @@ SeqNo get_Block_seqno(ir_node *n); #define PRINT_ITEMID(X,Y) fprintf(F, "i%pT%d", (void *) (X), (Y)) #endif +static const char *get_mode_name_ex(ir_mode *mode, int *bad) +{ + if (is_mode(mode)) + return get_mode_name(mode); + *bad |= 1; + return ""; +} + static const char *get_type_name_ex(type *tp, int *bad) { if (is_type(tp)) @@ -318,7 +329,7 @@ static void collect_node(ir_node * node, void *env) { * graphs not visited. * Free the list with DEL_ARR_F. */ static ir_node ** construct_block_lists(ir_graph *irg) { - int i; + int i, rem_view = interprocedural_view; ir_graph *rem = current_ir_graph; current_ir_graph = irg; @@ -327,6 +338,14 @@ static ir_node ** construct_block_lists(ir_graph *irg) { irg_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. */ + interprocedural_view = 0; + set_irg_visited(current_ir_graph, get_irg_visited(current_ir_graph)-1); + irg_walk(get_irg_end_reg(current_ir_graph), clear_link, collect_node, current_ir_graph); + set_irg_visited(current_ir_graph, get_irg_visited(current_ir_graph)-1); + irg_walk(get_irg_end_except(current_ir_graph), clear_link, collect_node, current_ir_graph); + interprocedural_view = rem_view; + current_ir_graph = rem; return ird_get_irg_link(irg); } @@ -433,14 +452,18 @@ dump_node_opcode(FILE *F, ir_node *n) } break; case iro_SymConst: { - if (get_SymConst_kind(n) == linkage_ptr_info) { + if (get_SymConst_kind(n) == symconst_addr_name) { /* don't use get_SymConst_ptr_info as it mangles the name. */ - fprintf (F, "SymC %s", get_id_str(get_SymConst_ptrinfo(n))); + fprintf (F, "SymC %s", get_id_str(get_SymConst_name(n))); + } else if (get_SymConst_kind(n) == symconst_addr_ent) { + assert(get_SymConst_entity(n)); + assert(is_entity(get_SymConst_entity(n))); + fprintf (F, "SymC &%s", get_entity_name(get_SymConst_entity(n))); } else { assert(get_kind(get_SymConst_type(n)) == k_type); assert(get_type_ident(get_SymConst_type(n))); fprintf (F, "SymC %s ", get_type_name_ex(get_SymConst_type(n), &bad)); - if (get_SymConst_kind(n) == type_tag) + if (get_SymConst_kind(n) == symconst_type_tag) fprintf (F, "tag"); else fprintf (F, "size"); @@ -452,6 +475,17 @@ dump_node_opcode(FILE *F, ir_node *n) else fprintf(F, "%s", get_irn_opname(n)); } break; + case iro_Proj: { + ir_node *cond = get_Proj_pred(n); + + if (get_irn_opcode(cond) == iro_Cond + && get_Proj_proj(n) == get_Cond_defaultProj(cond) + && get_irn_mode(get_Cond_selector(cond)) != mode_b) + fprintf (F, "defProj"); + else + fprintf (F, "%s", get_irn_opname(n)); + } break; + case iro_Start: { if (interprocedural_view) { fprintf(F, "%s %s", get_irn_opname(n), get_ent_dump_name(get_irg_ent(get_irn_irg(n)))); @@ -467,9 +501,11 @@ dump_node_opcode(FILE *F, ir_node *n) return bad; } -static INLINE void +static INLINE int dump_node_mode (ir_node *n) { + int bad = 0; + switch (get_irn_opcode(n)) { case iro_Phi: case iro_Const: @@ -489,11 +525,12 @@ dump_node_mode (ir_node *n) case iro_Abs: case iro_Cmp: case iro_Confirm: - fprintf (F, "%s", get_mode_name(get_irn_mode(n))); + fprintf (F, "%s", get_mode_name_ex(get_irn_mode(n), &bad)); break; default: ; } + return bad; } static int dump_node_typeinfo(ir_node *n) { @@ -593,6 +630,7 @@ static INLINE int dump_node_info(ir_node *n) fprintf (F, " info1: \""); if (opt_dump_pointer_values_to_info) fprintf (F, "addr: %p \n", (void *)n); + fprintf (F, "mode: %s\n", get_mode_name(get_irn_mode(n))); fprintf (F, "visited: %ld \n", get_irn_visited(n)); irg = get_irn_irg(n); if (irg != get_const_code_irg()) @@ -752,7 +790,7 @@ static void dump_const_node_local(ir_node *n) { fprintf(F, "node: {title: "); PRINT_CONSTID(n, con); fprintf(F, " label: \""); bad |= dump_node_opcode(F, con); - dump_node_mode (con); + bad |= dump_node_mode (con); bad |= dump_node_typeinfo(con); fprintf (F, " "); bad |= dump_node_nodeattr(con); @@ -784,7 +822,7 @@ static void dump_node(ir_node *n) bad = ! irn_vrfy_irg_dump(n, current_ir_graph, &p); bad |= dump_node_opcode(F, n); - dump_node_mode (n); + bad |= dump_node_mode (n); bad |= dump_node_typeinfo(n); fprintf(F, " "); bad |= dump_node_nodeattr(n); @@ -814,7 +852,24 @@ dump_ir_block_edge(ir_node *n) { } } -static void print_edge_vcgattr(ir_node *from, int to) { +static void +print_data_edge_vcgattr(FILE *F, ir_node *from, int to) { + 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); +} + +static void +print_mem_edge_vcgattr(FILE *F, ir_node *from, int to) { + 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); +} + +static void +print_edge_vcgattr(ir_node *from, int to) { assert(from); if (dump_backedge_information_flag && is_backedge(from, to)) @@ -830,56 +885,79 @@ static void print_edge_vcgattr(ir_node *from, int to) { if (get_irn_mode(get_End_keepalive(from, to)) == mode_BB) fprintf (F, CF_EDGE_ATTR); if (get_irn_mode(get_End_keepalive(from, to)) == mode_X) - fprintf (F, MEM_EDGE_ATTR); + fprintf (F, INTER_MEM_EDGE_ATTR); } break; - case iro_EndReg: break; - case iro_EndExcept: break; - case iro_Jmp: break; - case iro_Break: break; - case iro_Cond: 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) fprintf (F, MEM_EDGE_ATTR); + 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_Const: break; - case iro_SymConst:break; case iro_Sel: case iro_Call: - if (to == 0) fprintf (F, MEM_EDGE_ATTR); + 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_CallBegin: break; - case iro_Add: break; - case iro_Sub: break; - case iro_Minus: break; - case iro_Mul: break; case iro_Quot: case iro_DivMod: case iro_Div: case iro_Mod: - if (to == 0) fprintf (F, MEM_EDGE_ATTR); + 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_Abs: break; - case iro_And: break; - case iro_Or: break; - case iro_Eor: break; - case iro_Shl: break; - case iro_Shr: break; - case iro_Shrs: break; - case iro_Rot: break; - case iro_Cmp: break; - case iro_Conv: break; case iro_Phi: - if (get_irn_modecode(from) == irm_M) fprintf (F, MEM_EDGE_ATTR); + 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) fprintf (F, MEM_EDGE_ATTR); + if (to == 0) + print_mem_edge_vcgattr(F, from, to); + else + print_data_edge_vcgattr(F, from, to); break; case iro_Sync: - fprintf (F, MEM_EDGE_ATTR); + print_mem_edge_vcgattr(F, from, to); break; case iro_Tuple: break; case iro_Proj: @@ -889,14 +967,27 @@ static void print_edge_vcgattr(ir_node *from, int to) { fprintf (F, CF_EDGE_ATTR); break; case irm_M: - fprintf (F, MEM_EDGE_ATTR); + fprintf (F, INTER_MEM_EDGE_ATTR); + break; + default: + print_data_edge_vcgattr(F, from, to); break; - default: break; } break; - case iro_Bad: break; + case iro_Bad: break; case iro_Unknown: break; - case iro_Id: break; + case iro_Id: + switch (get_irn_modecode(from)) { + case irm_M: + fprintf (F, INTRA_MEM_EDGE_ATTR); + break; + case irm_X: + fprintf (F, CF_EDGE_ATTR); + break; + default: + print_data_edge_vcgattr(F, from, to); + break; + } break; default: ; } @@ -1073,8 +1164,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) == type_tag) - || (get_SymConst_kind(n) == size)) + 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); } @@ -1100,15 +1191,19 @@ static void dump_node2type_edges (ir_node *n, void *env) } -static void print_type_info(type *tp) { +static int print_type_info(type *tp) { + int bad = 0; + if (get_type_state(tp) == layout_undefined) { fprintf(F, "state: layout_undefined\n"); } else { fprintf(F, "state: layout_fixed,\n"); } if (get_type_mode(tp)) - fprintf(F, "mode: %s,\n", get_mode_name(get_type_mode(tp))); - fprintf(F, "size: %dB,\n", get_type_size(tp)); + fprintf(F, "mode: %s,\n", get_mode_name_ex(get_type_mode(tp), &bad)); + fprintf(F, "size: %db,\n", get_type_size_bits(tp)); + + return bad; } static void print_typespecific_info(type *tp) { @@ -1189,7 +1284,7 @@ static int print_type_node(type *tp) PRINT_TYPEID(tp); fprintf (F, " label: \"%s %s\"", get_type_tpop_name(tp), get_type_name_ex(tp, &bad)); fprintf (F, " info1: \""); - print_type_info(tp); + bad |= print_type_info(tp); print_typespecific_info(tp); fprintf (F, "\""); print_typespecific_vcgattr(tp); @@ -1237,10 +1332,10 @@ void dump_entity_node(entity *ent) X(volatility_is_volatile); } - fprintf(F, "\npeculiarity: %s", get_peculiarity_string(get_entity_peculiarity(ent))); - fprintf(F, "\nname: %s\nld_name: %s", + fprintf(F, "\npeculiarity: %s", get_peculiarity_string(get_entity_peculiarity(ent))); + fprintf(F, "\nname: %s\nld_name: %s", get_entity_name(ent), ent->ld_name ? get_entity_ld_name(ent) : "no yet set"); - fprintf(F, "\noffset: %d", get_entity_offset(ent)); + fprintf(F, "\noffset(bits): %d", get_entity_offset_bits(ent)); if (is_method_type(get_entity_type(ent))) { if (get_entity_irg(ent)) /* can be null */ { fprintf (F, "\nirg = "); PRINT_IRGID(get_entity_irg(ent)); } @@ -1262,7 +1357,7 @@ static void dump_enum_item(type *tp, int pos) PRINT_ITEMID(tp, pos); fprintf(F, "\""); fprintf (F, DEFAULT_ENUM_ITEM_ATTRIBUTE); fprintf (F, "label: "); - fprintf (F, "\"enum item %s\" " ENUM_ITEM_NODE_ATTR, id_to_str(id)); + fprintf (F, "\"enum item %s\" " ENUM_ITEM_NODE_ATTR, get_id_str(id)); fprintf (F, "\n info1: \"value: %s\"}\n", buf); } @@ -1565,22 +1660,24 @@ dump_vcg_header(const char *name, const char *orientation) { "manhattan_edges: yes\n" "port_sharing: no\n" "orientation: %s\n" - "classname 1: \"Data\"\n" - "classname 2: \"Block\"\n" - "classname 13:\"Control Flow\"\n" - "classname 14:\"Memory\"\n" - "classname 15:\"Dominators\"\n" - "classname 3: \"Entity type\"\n" - "classname 4: \"Entity owner\"\n" - "classname 5: \"Method Param\"\n" - "classname 6: \"Method Res\"\n" - "classname 7: \"Super\"\n" - "classname 8: \"Union\"\n" - "classname 9: \"Points-to\"\n" + "classname 1: \"intrablock Data\"\n" + "classname 16: \"interblock Data\"\n" + "classname 2: \"Block\"\n" + "classname 13: \"Control Flow\"\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" + "classname 6: \"Method Res\"\n" + "classname 7: \"Super\"\n" + "classname 8: \"Union\"\n" + "classname 9: \"Points-to\"\n" "classname 10: \"Array Element Type\"\n" "classname 11: \"Overwrites\"\n" "classname 12: \"Member\"\n" - "infoname 1: \"Attribute\"\n" + "infoname 1: \"Attribute\"\n" "infoname 2: \"Verification errors\"\n", name, label, orientation); @@ -1678,9 +1775,7 @@ dump_ir_graph (ir_graph *irg) char *suffix; rem = current_ir_graph; - /* printf("comparing %s %s\n", get_irg_dump_name(irg), dump_file_filter); */ - - if(strncmp(get_irg_dump_name(irg),dump_file_filter,strlen(dump_file_filter))!=0) return; + if(strncmp(get_entity_name(get_irg_ent(irg)),dump_file_filter,strlen(dump_file_filter))!=0) return; current_ir_graph = irg; if (interprocedural_view) suffix = "-pure-ip"; @@ -1709,8 +1804,7 @@ dump_ir_block_graph (ir_graph *irg) int i; char *suffix; - /* printf("comparing %s %s\n", get_irg_dump_name(irg), dump_file_filter); */ - if(strncmp(get_irg_dump_name(irg),dump_file_filter,strlen(dump_file_filter))!=0) return; + if(strncmp(get_entity_name(get_irg_ent(irg)),dump_file_filter,strlen(dump_file_filter))!=0) return; if (interprocedural_view) suffix = "-ip"; else suffix = ""; @@ -2007,6 +2101,7 @@ void dump_loops_standalone (ir_loop *loop) { /* We are a loop node -> Collect firm nodes */ ir_node *n = le.node; + int bad = 0; if (!loop_node_started) { /* Start a new node which contains all firm nodes of the current loop */ @@ -2019,11 +2114,11 @@ void dump_loops_standalone (ir_loop *loop) { else fprintf(F, "\n"); - dump_node_opcode(F, n); - dump_node_mode (n); - dump_node_typeinfo(n); + bad |= dump_node_opcode(F, n); + bad |= dump_node_mode (n); + bad |= dump_node_typeinfo(n); fprintf (F, " "); - dump_node_nodeattr(n); + bad |= dump_node_nodeattr(n); fprintf (F, " %ld", get_irn_node_nr(n)); } }