# include "pmap.h"
# include "eset.h"
+/* #undef HEAPANAL */
#undef HEAPANAL
#ifdef HEAPANAL
void dump_chi_term(FILE *FL, ir_node *n);
#define PRINT_IRGID(X) fprintf(F, "g%p",(void *)(X))
#define PRINT_CONSTID(X,Y) fprintf(F, "\"n%pn%p\"", (void*)(X), (void*)(Y))
#define PRINT_LOOPID(X) fprintf(F, "l%p", (void *)(X))
-#define PRINT_ITEMID(X,Y) fprintf(F, "i%pT%d", (void *) (X), (P))
+#define PRINT_ITEMID(X,Y) fprintf(F, "i%pT%d", (void *) (X), (Y))
#endif
static const char *get_type_name_ex(type *tp, int *bad)
static int node_floats(ir_node *n) {
return ((get_op_pinned(get_irn_op(n)) == floats) &&
- (get_irg_pinned(current_ir_graph) == floats));
+ (get_irg_pinned(current_ir_graph) == floats));
}
static const char *get_ent_dump_name(entity *ent) {
/* Routines to dump information about a single ir node. */
/*******************************************************************/
-static INLINE int
-dump_node_opcode(ir_node *n)
+INLINE int
+dump_node_opcode(FILE *F, ir_node *n)
{
int bad = 0;
if (opt_dump_analysed_type_info) {
if (get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_consistent ||
- get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_inconsistent ) {
+ get_irg_typeinfo_state(current_ir_graph) == irg_typeinfo_inconsistent ) {
type *tp = get_irn_type(n);
if (tp != none_type)
- fprintf(F, " [%s]", get_type_name_ex(tp, &bad));
+ fprintf(F, " [%s]", get_type_name_ex(tp, &bad));
else
- fprintf(F, " []");
+ fprintf(F, " []");
}
}
return bad;
}
fprintf(F, "\n");
+ /* Loop node Someone else please tell me what's wrong ...
+ if (get_irn_loop(n)) {
+ 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));
+ }
+ */
+
/* Source types */
switch (get_irn_opcode(n)) {
case iro_Start: {
if (Call_has_callees(n)) {
fprintf(F, "possible callees: \n");
for (i = 0; i < get_Call_n_callees(n); i++) {
- if (!get_Call_callee(n, i)) {
- fprintf(F, " %d external method\n", i);
- } else {
- fprintf(F, " %d: %s\n", i, get_ent_dump_name(get_Call_callee(n, i)));
- }
+ if (!get_Call_callee(n, i)) {
+ fprintf(F, " %d external method\n", i);
+ } else {
+ fprintf(F, " %d: %s\n", i, get_ent_dump_name(get_Call_callee(n, i)));
+ }
}
}
} break;
if (Call_has_callees(call)) {
fprintf(F, "possible callees: \n");
for (i = 0; i < get_Call_n_callees(call); i++) {
- if (!get_Call_callee(call, i)) {
- fprintf(F, " %d external method\n", i);
- } else {
- fprintf(F, " %d: %s\n", i, get_ent_dump_name(get_Call_callee(call, i)));
- }
+ if (!get_Call_callee(call, i)) {
+ fprintf(F, " %d external method\n", i);
+ } else {
+ fprintf(F, " %d: %s\n", i, get_ent_dump_name(get_Call_callee(call, i)));
+ }
}
}
} break;
type *tp = get_entity_type(get_irg_ent(get_irn_irg(n)));
fprintf(F, "return in method of type %s \n", get_type_name_ex(tp, &bad));
for (i = 0; i < get_method_n_ress(tp); ++i)
- fprintf(F, " res %d type: %s \n", i, get_type_name_ex(get_method_res_type(tp, i), &bad));
+ fprintf(F, " res %d type: %s \n", i, get_type_name_ex(get_method_res_type(tp, i), &bad));
}
} break;
case iro_Const: {
if (interprocedural_view) {
fprintf(F, "intra predecessor nodes:\n");
for (i = 0; i < get_irn_intra_arity(n); i++) {
- ir_node *pred = get_irn_intra_n(n, i);
- fprintf(F, " %s%s %ld\n", get_irn_opname(pred), get_irn_modename(pred), get_irn_node_nr(pred));
+ ir_node *pred = get_irn_intra_n(n, i);
+ fprintf(F, " %s%s %ld\n", get_irn_opname(pred), get_irn_modename(pred), get_irn_node_nr(pred));
}
} else {
fprintf(F, "inter predecessor nodes:\n");
for (i = 0; i < get_irn_inter_arity(n); i++) {
- ir_node *pred = get_irn_inter_n(n, i);
- fprintf(F, " %s%s %ld \tin graph %s\n", get_irn_opname(pred), get_irn_modename(pred),
- get_irn_node_nr(pred), get_ent_dump_name(get_irg_entity(get_irn_irg(pred))));
+ ir_node *pred = get_irn_inter_n(n, i);
+ fprintf(F, " %s%s %ld \tin graph %s\n", get_irn_opname(pred), get_irn_modename(pred),
+ get_irn_node_nr(pred), get_ent_dump_name(get_irg_entity(get_irn_irg(pred))));
}
}
} break;
mark_irn_visited(con);
/* Generate a new name for the node by appending the names of
- n and const. */
+ n and const. */
fprintf(F, "node: {title: "); PRINT_CONSTID(n, con);
fprintf(F, " label: \"");
- bad |= dump_node_opcode(con);
+ bad |= dump_node_opcode(F, con);
dump_node_mode (con);
bad |= dump_node_typeinfo(con);
fprintf (F, " ");
fprintf(F, "node: {title: \""); PRINT_NODEID(n); fprintf(F, "\" label: \"");
bad = ! irn_vrfy_irg_dump(n, current_ir_graph, &p);
- bad |= dump_node_opcode(n);
+ bad |= dump_node_opcode(F, n);
dump_node_mode (n);
bad |= dump_node_typeinfo(n);
fprintf(F, " ");
PRINT_NODEID(n);
fprintf (F, "\" targetname: \"");
PRINT_NODEID(get_nodes_block(n));
- fprintf (F, "\" " BLOCK_EDGE_ATTR "}\n");
+ fprintf (F, "\" " BLOCK_EDGE_ATTR "}\n");
}
}
case iro_End:
if (to >= 0) {
if (get_irn_mode(get_End_keepalive(from, to)) == mode_BB)
- fprintf (F, CF_EDGE_ATTR);
+ fprintf (F, CF_EDGE_ATTR);
if (get_irn_mode(get_End_keepalive(from, to)) == mode_X)
- fprintf (F, MEM_EDGE_ATTR);
+ fprintf (F, MEM_EDGE_ATTR);
}
break;
case iro_EndReg: break;
fprintf(F, "graph: { title: \"");
PRINT_NODEID(block);
fprintf(F, "\" label: \"");
- dump_node_opcode(block);
+ dump_node_opcode(F, block);
fprintf (F, " %ld", get_irn_node_nr(block));
#ifdef HEAPANAL
if (get_opt_dump_abstvals())
fprintf (F, " seqno: %d", (int)get_Block_seqno(block));
#endif
fprintf(F, "\" status:clustered color:%s \n",
- get_Block_matured(block) ? "yellow" : "red");
+ get_Block_matured(block) ? "yellow" : "red");
/* dump the blocks edges */
dump_ir_data_edges(block);
ir_node * node = arr[i];
if (is_Block(node)) {
/* Dumps the block and all the nodes in the block, which are to
- be found in Block->link. */
+ be found in Block->link. */
dump_whole_block(node);
} else {
/* Nodes that are not in a Block. */
fprintf(F, "graph: { title: \"");
PRINT_IRGID(irg);
fprintf(F, "\" label: \"%s\" status:clustered color:white \n",
- get_ent_dump_name(get_irg_ent(irg)));
+ get_ent_dump_name(get_irg_ent(irg)));
dump_block_graph (irg);
break;
case iro_SymConst:
if ( (get_SymConst_kind(n) == type_tag)
- || (get_SymConst_kind(n) == size))
+ || (get_SymConst_kind(n) == size))
{
- print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR);
+ print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR);
}
break;
case iro_Sel: {
case tpo_class:
{
if (peculiarity_existent == get_class_peculiarity(tp))
- fprintf (F, " " TYPE_CLASS_NODE_ATTR);
+ fprintf (F, " " TYPE_CLASS_NODE_ATTR);
else
- fprintf (F, " " TYPE_DESCRIPTION_NODE_ATTR);
+ fprintf (F, " " TYPE_DESCRIPTION_NODE_ATTR);
} break;
case tpo_struct:
{
return bad;
}
-#define X(a) case a: fprintf(F, #a); break
+#define X(a) case a: fprintf(F, #a); break
void dump_entity_node(entity *ent)
{
fprintf (F, "node: {title: \"");
fprintf(F, "\npeculiarity: %s", get_peculiarity_string(get_entity_peculiarity(ent)));
fprintf(F, "\nname: %s\nld_name: %s",
- get_ent_dump_name(ent), ent->ld_name ? get_entity_ld_name(ent) : "no yet set");
+ get_entity_name(ent), ent->ld_name ? get_entity_ld_name(ent) : "no yet set");
fprintf(F, "\noffset: %d", get_entity_offset(ent));
if (is_method_type(get_entity_type(ent))) {
if (get_entity_irg(ent)) /* can be null */
ENT_OWN_EDGE_ATTR "}\n", ent, get_entity_owner(ent));*/
print_ent_type_edge(F,ent, get_entity_type(ent), ENT_TYPE_EDGE_ATTR);
if(is_class_type(get_entity_owner(ent))) {
- for(i = 0; i < get_entity_n_overwrites(ent); i++){
- print_ent_ent_edge(F,ent, get_entity_overwrites(ent, i), ENT_OVERWRITES_EDGE_ATTR);
- }
+ for(i = 0; i < get_entity_n_overwrites(ent); i++){
+ print_ent_ent_edge(F,ent, get_entity_overwrites(ent, i), ENT_OVERWRITES_EDGE_ATTR);
+ }
}
/* attached subgraphs */
if (const_entities && (get_entity_variability(ent) != variability_uninitialized)) {
- if (is_atomic_entity(ent)) {
- value = get_atomic_ent_value(ent);
- if (value) {
+ if (is_atomic_entity(ent)) {
+ value = get_atomic_ent_value(ent);
+ if (value) {
print_ent_node_edge(F,ent, value, ENT_VALUE_EDGE_ATTR, i);
- /* DDMN(value); $$$ */
- dump_const_expression(value);
- }
- }
- if (is_compound_entity(ent)) {
- for (i = 0; i < get_compound_ent_n_values(ent); i++) {
- value = get_compound_ent_value(ent, i);
- if (value) {
+ /* DDMN(value); $$$ */
+ dump_const_expression(value);
+ }
+ }
+ if (is_compound_entity(ent)) {
+ for (i = 0; i < get_compound_ent_n_values(ent); i++) {
+ value = get_compound_ent_value(ent, i);
+ if (value) {
print_ent_node_edge(F,ent,value,ENT_VALUE_EDGE_ATTR,i);
- dump_const_expression(value);
- print_ent_ent_edge(F,ent, get_compound_ent_value_member(ent, i), 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);
- */
- }
- }
- }
+ dump_const_expression(value);
+ print_ent_ent_edge(F,ent, get_compound_ent_value_member(ent, i), 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;
case k_type:
/* and now the edges */
switch (get_type_tpop_code(tp)) {
case tpo_class:
- {
- for (i=0; i < get_class_n_supertypes(tp); i++) {
- print_type_type_edge(F, tp,get_class_supertype(tp, i),TYPE_SUPER_EDGE_ATTR);
- }
-
- for (i=0; i < get_class_n_members(tp); i++) {
- print_type_ent_edge(F,tp,get_class_member(tp, i),TYPE_MEMBER_EDGE_ATTR);
- }
- } break;
+ {
+ for (i=0; i < get_class_n_supertypes(tp); i++) {
+ print_type_type_edge(F, tp,get_class_supertype(tp, i),TYPE_SUPER_EDGE_ATTR);
+ }
+
+ for (i=0; i < get_class_n_members(tp); i++) {
+ print_type_ent_edge(F,tp,get_class_member(tp, i),TYPE_MEMBER_EDGE_ATTR);
+ }
+ } break;
case tpo_struct:
- {
- for (i=0; i < get_struct_n_members(tp); i++) {
- print_type_ent_edge(F,tp,get_struct_member(tp, i),TYPE_MEMBER_EDGE_ATTR);
- }
- } break;
+ {
+ for (i=0; i < get_struct_n_members(tp); i++) {
+ print_type_ent_edge(F,tp,get_struct_member(tp, i),TYPE_MEMBER_EDGE_ATTR);
+ }
+ } break;
case tpo_method:
- {
- for (i = 0; i < get_method_n_params(tp); i++)
- {
+ {
+ for (i = 0; i < get_method_n_params(tp); i++)
+ {
print_type_type_edge(F,tp,get_method_param_type(tp, i),METH_PAR_EDGE_ATTR,i);
- }
- for (i = 0; i < get_method_n_ress(tp); i++)
- {
+ }
+ for (i = 0; i < get_method_n_ress(tp); i++)
+ {
print_type_type_edge(F,tp,get_method_res_type(tp, i),METH_RES_EDGE_ATTR,i);
- }
- } break;
+ }
+ } break;
case tpo_union:
- {
- for (i = 0; i < get_union_n_members(tp); i++)
- {
+ {
+ for (i = 0; i < get_union_n_members(tp); i++)
+ {
print_type_ent_edge(F,tp,get_union_member(tp, i),UNION_EDGE_ATTR);
- }
- } break;
+ }
+ } break;
case tpo_array:
- {
- print_type_type_edge(F,tp,get_array_element_type(tp),ARR_ELT_TYPE_EDGE_ATTR);
- print_type_ent_edge(F,tp,get_array_element_entity(tp),ARR_ENT_EDGE_ATTR);
- for (i = 0; i < get_array_n_dimensions(tp); i++) {
- ir_node *upper = get_array_upper_bound(tp, i);
- ir_node *lower = get_array_lower_bound(tp, i);
- print_node_type_edge(F,upper, tp, "label: \"upper %d\"", get_array_order(tp, i));
- print_node_type_edge(F,lower, tp, "label: \"lower %d\"", get_array_order(tp, i));
- dump_const_expression(upper);
- dump_const_expression(lower);
- }
-
- } break;
+ {
+ print_type_type_edge(F,tp,get_array_element_type(tp),ARR_ELT_TYPE_EDGE_ATTR);
+ print_type_ent_edge(F,tp,get_array_element_entity(tp),ARR_ENT_EDGE_ATTR);
+ for (i = 0; i < get_array_n_dimensions(tp); i++) {
+ ir_node *upper = get_array_upper_bound(tp, i);
+ ir_node *lower = get_array_lower_bound(tp, i);
+ print_node_type_edge(F,upper, tp, "label: \"upper %d\"", get_array_order(tp, i));
+ print_node_type_edge(F,lower, tp, "label: \"lower %d\"", get_array_order(tp, i));
+ dump_const_expression(upper);
+ dump_const_expression(lower);
+ }
+
+ } break;
case tpo_enumeration:
- {
- for (i = 0; i < get_enumeration_n_enums(tp); ++i) {
- dump_enum_item(tp, i);
- print_enum_item_edge(F, tp, i, "label: \"item %d\"", i);
- }
- } break;
+ {
+ for (i = 0; i < get_enumeration_n_enums(tp); ++i) {
+ dump_enum_item(tp, i);
+ print_enum_item_edge(F, tp, i, "label: \"item %d\"", i);
+ }
+ } break;
case tpo_pointer:
- {
+ {
print_type_type_edge(F,tp,get_pointer_points_to_type(tp), PTR_PTS_TO_EDGE_ATTR);
- } break;
+ } break;
case tpo_primitive:
- {
- } break;
+ {
+ } break;
default: break;
} /* switch type */
}
if (tp == get_glob_type()) break;
switch (get_type_tpop_code(tp)) {
case tpo_class: {
- print_type_node(tp);
- /* and now the edges */
- for (i=0; i < get_class_n_supertypes(tp); i++)
- {
- print_type_type_edge(F,tp,get_class_supertype(tp, i),TYPE_SUPER_EDGE_ATTR);
- }
+ print_type_node(tp);
+ /* and now the edges */
+ for (i=0; i < get_class_n_supertypes(tp); i++)
+ {
+ print_type_type_edge(F,tp,get_class_supertype(tp, i),TYPE_SUPER_EDGE_ATTR);
+ }
} break;
default: break;
} /* switch type */
static INLINE void
dump_loop_label(ir_loop *loop) {
fprintf (F, "loop %d, %d sons, %d nodes",
- get_loop_depth(loop), get_loop_n_sons(loop), get_loop_n_nodes(loop));
+ get_loop_depth(loop), get_loop_n_sons(loop), get_loop_n_nodes(loop));
}
static INLINE void dump_loop_info(ir_loop *loop) {
fprintf (F, "\" targetname: \"");
PRINT_LOOPID(get_loop_son(loop, i));
fprintf (F, "\" color: darkgreen label: \"%d\"}\n",
- get_loop_element_pos(loop, get_loop_son(loop, i)));
+ get_loop_element_pos(loop, get_loop_son(loop, i)));
}
static
/* print header */
fprintf (F,
- "graph: { title: \"ir graph of %s\"\n"
- "display_edge_labels: %s\n"
- "layoutalgorithm: mindepth\n"
- "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 10: \"Array Element Type\"\n"
- "classname 11: \"Overwrites\"\n"
- "classname 12: \"Member\"\n"
+ "graph: { title: \"ir graph of %s\"\n"
+ "display_edge_labels: %s\n"
+ "layoutalgorithm: mindepth\n"
+ "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 10: \"Array Element Type\"\n"
+ "classname 11: \"Overwrites\"\n"
+ "classname 12: \"Member\"\n"
"infoname 1: \"Attribute\"\n"
- "infoname 2: \"Verification errors\"\n",
- name, label, orientation);
+ "infoname 2: \"Verification errors\"\n",
+ name, label, orientation);
- fprintf (F, "\n"); /* a separator */
+ fprintf (F, "\n"); /* a separator */
}
static void vcg_open (ir_graph *irg, char * suffix1, char *suffix2) {
const char *nm = get_irg_dump_name(irg);
- int len = strlen(nm);
+ int len = strlen(nm), i, j;
char *fname; /* filename to put the vcg information in */
if (!suffix1) suffix1 = "";
if (!suffix2) suffix2 = "";
/** open file for vcg graph */
- fname = malloc (len + strlen(suffix1) + strlen(suffix2) + 5);
- strncpy (fname, nm, len); /* copy the filename */
- fname[len] = '\0';
+ fname = malloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5);
+
+ //strncpy (fname, nm, len); /* copy the filename */
+ j = 0;
+ for (i = 0; i < len; ++i) { /* replase '/' in the name: escape by @. */
+ if (nm[i] == '/') {
+ fname[j] = '@'; j++; fname[j] = '1'; j++;
+ } else if (nm[i] == '@') {
+ fname[j] = '@'; j++; fname[j] = '2'; j++;
+ } else {
+ fname[j] = nm[i]; j++;
+ }
+ }
+ fname[j] = '\0';
strcat (fname, suffix1); /* append file suffix */
strcat (fname, suffix2); /* append file suffix */
strcat (fname, ".vcg"); /* append the .vcg suffix */
static void vcg_open_name (const char *name, char *suffix) {
char *fname; /* filename to put the vcg information in */
+ int i, j, len = strlen(name);
if (!suffix) suffix = "";
/** open file for vcg graph */
- fname = malloc (strlen(name) + 5 + strlen(suffix));
- strcpy (fname, name); /* copy the filename */
+ fname = malloc (len * 2 + 5 + strlen(suffix));
+ //strcpy (fname, name); /* copy the filename */
+ j = 0;
+ for (i = 0; i < len; ++i) { /* replase '/' in the name: escape by @. */
+ if (name[i] == '/') {
+ fname[j] = '@'; j++; fname[j] = '1'; j++;
+ } else if (name[i] == '@') {
+ fname[j] = '@'; j++; fname[j] = '2'; j++;
+ } else {
+ fname[j] = name[i]; j++;
+ }
+ }
+ fname[j] = '\0';
strcat (fname, suffix);
strcat (fname, ".vcg"); /* append the .vcg suffix */
F = fopen (fname, "w"); /* open file for writing */
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;
current_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 (interprocedural_view) suffix = "-ip";
/* Dump the edges */
for ( i = 0; i < get_Block_n_cfgpreds(block); i++)
if (get_irn_op(skip_Proj(get_Block_cfgpred(block, i))) != op_Bad) {
- pred = get_nodes_block(skip_Proj(get_Block_cfgpred(block, i)));
- fprintf (F, "edge: { sourcename: \"");
- PRINT_NODEID(block);
- fprintf (F, "\" targetname: \"");
- PRINT_NODEID(pred);
- fprintf (F, "\"}\n");
+ pred = get_nodes_block(skip_Proj(get_Block_cfgpred(block, i)));
+ fprintf (F, "edge: { sourcename: \"");
+ PRINT_NODEID(block);
+ fprintf (F, "\" targetname: \"");
+ PRINT_NODEID(pred);
+ fprintf (F, "\"}\n");
}
/* Dump dominator edge */
void dump_loops_standalone (ir_loop *loop) {
- int i, loop_node_started = 0, son_number = 0, first = 0;
+ int i = 0, loop_node_started = 0, son_number = 0, first = 0;
loop_element le;
+ ir_loop *son = NULL;
/* Dump a new loop node. */
dump_loop_node(loop);
/* Dump the loop elements. */
- for(i = 0; i < get_loop_n_elements(loop); i++) {
- ir_loop *son;
- le = get_loop_element(loop, i);
-
- son = le.son;
- if (get_kind(son) == k_ir_loop) {
+ 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. */
- fprintf(F, "\" }\n");
- fprintf (F, "edge: {sourcename: \"");
- PRINT_LOOPID(loop);
- fprintf (F, "\" targetname: \"");
- PRINT_LOOPID(loop);
- fprintf (F, "-%d-nodes\" label:\"%d...%d\"}\n", first, first, i-1);
- loop_node_started = 0;
+ 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. */
+ fprintf(F, "\" }\n");
+ fprintf (F, "edge: {sourcename: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "\" targetname: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "-%d-nodes\" label:\"%d...%d\"}\n", first, first, i-1);
+ loop_node_started = 0;
+ }
+ dump_loop_son_edge(loop, son_number++);
+ dump_loops_standalone(son);
}
- dump_loop_son_edge(loop, son_number++);
- dump_loops_standalone(son);
- }
- else {
- /* We are a loop node -> Collect firm nodes */
-
- ir_node *n = le.node;
-
- if (!loop_node_started) {
- /* Start a new node which contains all firm nodes of the current loop */
- fprintf (F, "node: { title: \"");
- PRINT_LOOPID(loop);
- fprintf (F, "-%d-nodes\" color: lightyellow label: \"", i);
- loop_node_started = 1;
- first = i;
+ else {
+ /* We are a loop node -> Collect firm nodes */
+
+ ir_node *n = le.node;
+
+ if (!loop_node_started) {
+ /* Start a new node which contains all firm nodes of the current loop */
+ fprintf (F, "node: { title: \"");
+ PRINT_LOOPID(loop);
+ fprintf (F, "-%d-nodes\" color: lightyellow label: \"", i);
+ loop_node_started = 1;
+ first = i;
+ }
+ else
+ fprintf(F, "\n");
+
+ dump_node_opcode(F, n);
+ dump_node_mode (n);
+ dump_node_typeinfo(n);
+ fprintf (F, " ");
+ dump_node_nodeattr(n);
+ fprintf (F, " %ld", get_irn_node_nr(n));
}
- else
- fprintf(F, "\n");
-
- dump_node_opcode(n);
- dump_node_mode (n);
- dump_node_typeinfo(n);
- fprintf (F, " ");
- dump_node_nodeattr(n);
- fprintf (F, " %ld", get_irn_node_nr(n));
}
- }
if (loop_node_started) {
fprintf(F, "\" }\n");
} else {
if (is_Block(le.node)) start = 0; else start = -1;
for (j = start; j < get_irn_arity(le.node); j++) {
- ir_node *pred = get_irn_n(le.node, j);
- if (!eset_contains(loopnodes, pred)) {
- eset_insert(extnodes, pred);
- if (!is_Block(pred)) {
- pred = get_nodes_block(pred);
- if (!eset_contains(loopnodes, pred)) eset_insert(extnodes, pred);
+ ir_node *pred = get_irn_n(le.node, j);
+ if (!eset_contains(loopnodes, pred)) {
+ eset_insert(extnodes, pred);
+ if (!is_Block(pred)) {
+ pred = get_nodes_block(pred);
+ if (!eset_contains(loopnodes, pred)) eset_insert(extnodes, pred);
}
- }
+ }
}
}
}
fprintf(F, "graph: { title: \"");
PRINT_NODEID(b);
fprintf(F, "\" label: \"");
- dump_node_opcode(b);
+ dump_node_opcode(F, b);
fprintf (F, " %ld", get_irn_node_nr(b));
fprintf(F, "\" status:clustered color:yellow\n");
/* dump the nodes that go into the block */
for (n = get_irn_link(b); n; n = get_irn_link(n)) {
- if (eset_contains(extnodes, n)) overrule_nodecolor = "lightblue";
- dump_node(n);
- overrule_nodecolor = NULL;
- if (!eset_contains(extnodes, n)) dump_ir_data_edges(n);
+ if (eset_contains(extnodes, n)) overrule_nodecolor = "lightblue";
+ dump_node(n);
+ overrule_nodecolor = NULL;
+ if (!eset_contains(extnodes, n)) dump_ir_data_edges(n);
}
/* Close the vcg information for the block */
fprintf(F, "graph: { title: \"");
PRINT_NODEID(b);
fprintf(F, "\" label: \"");
- dump_node_opcode(b);
+ dump_node_opcode(F, b);
fprintf (F, " %ld", get_irn_node_nr(b));
fprintf(F, "\" status:clustered color:lightblue\n");
/* dump the nodes that go into the block */
for (n = get_irn_link(b); n; n = get_irn_link(n)) {
- if (!eset_contains(loopnodes, n)) overrule_nodecolor = "lightblue";
- dump_node(n);
- overrule_nodecolor = NULL;
- if (eset_contains(loopnodes, n)) dump_ir_data_edges(n);
+ if (!eset_contains(loopnodes, n)) overrule_nodecolor = "lightblue";
+ dump_node(n);
+ overrule_nodecolor = NULL;
+ if (eset_contains(loopnodes, n)) dump_ir_data_edges(n);
}
/* Close the vcg information for the block */