# include "pmap.h"
# include "eset.h"
-/* #undef HEAPANAL */
-#undef HEAPANAL
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
void dump_chi_term(FILE *FL, ir_node *n);
void dump_state(FILE *FL, ir_node *n);
int get_opt_dump_abstvals(void);
#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 "
#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 "<ERROR>";
+}
+
static const char *get_type_name_ex(type *tp, int *bad)
{
if (is_type(tp))
* 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;
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);
}
} 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");
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))));
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:
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) {
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())
ir_loop *loop = get_irn_loop(n);
assert(loop);
fprintf(F, " in loop %d with depth %d\n",
- get_loop_loop_nr(loop), get_loop_depth(loop));
+ get_loop_loop_nr(loop), get_loop_depth(loop));
}
*/
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);
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);
dump_node_vcgattr(n, bad);
fprintf(F, "}\n");
dump_const_node_local(n);
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
dump_chi_term(F, n);
dump_state(F, n);
#endif
}
}
-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))
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:
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:
;
}
fprintf(F, "\" label: \"");
dump_node_opcode(F, block);
fprintf (F, " %ld", get_irn_node_nr(block));
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
if (get_opt_dump_abstvals())
fprintf (F, " seqno: %d", (int)get_Block_seqno(block));
#endif
/* Close the vcg information for the block */
fprintf(F, "}\n");
dump_const_node_local(block);
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
dump_chi_term(F, block);
#endif
fprintf(F, "\n");
/* @@@ 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);
}
}
-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) {
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);
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)); }
"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);
/** open file for vcg graph */
fname = malloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5);
- //strncpy (fname, nm, len); /* copy the filename */
+ /* strncpy (fname, nm, len); */ /* copy the filename */
j = 0;
for (i = 0; i < len; ++i) { /* replase '/' in the name: escape by @. */
if (nm[i] == '/') {
/** open file for vcg graph */
fname = malloc (len * 2 + 5 + strlen(suffix));
- //strcpy (fname, name); /* copy the filename */
+ /* strcpy (fname, name);*/ /* copy the filename */
j = 0;
for (i = 0; i < len; ++i) { /* replase '/' in the name: escape by @. */
if (name[i] == '/') {
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";
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 = "";
/* Dump the loop elements. */
- if (get_kind(son) == k_ir_loop)
+ for(i = 0; i < get_loop_n_elements(loop); i++)
{
- /* We are a loop son -> Recurse */
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. */
/* 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 */
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));
}
}
int el_rem = edge_label;
edge_label = 1;
+ /* @@@ AS: What does that do? */
if(strncmp(get_irg_dump_name(irg),dump_file_filter,strlen(dump_file_filter))!=0) return;
current_ir_graph = irg;