X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=5305cc9323ca456405aa2f934f744eb16eadf061;hb=af0115376ccdcc72e0643caf221407218f4504f0;hp=9f3355a2efe2141d295c6f9906c024125ca95509;hpb=4b1138a9eee25ce11adbb7d7162eaa49421e8b51;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index 9f3355a2e..5305cc932 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -23,16 +23,10 @@ * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Hubert Schmidt * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif -#ifdef HAVE_STRING_H #include -#endif -#ifdef HAVE_STDLIB_H #include -#endif #include #include "firm_common_t.h" @@ -68,14 +62,6 @@ #include "eset.h" #include "pset.h" -#if DO_HEAPANALYSIS -extern void dump_irn_chi_term(FILE *FL, ir_node *n); -extern void dump_irn_state(FILE *FL, ir_node *n); -extern int get_opt_dump_abstvals(void); -typedef unsigned long SeqNo; -extern SeqNo get_Block_seqno(ir_node *n); -#endif - /** Dump only irgs with names that start with this prefix. */ static ident *dump_file_filter_id = NULL; @@ -328,6 +314,7 @@ static void init_colors(void) custom_color(ird_color_phi, "105 255 105"); custom_color(ird_color_anchor, "100 100 255"); named_color(ird_color_error, "red"); + custom_color(ird_color_entity, "204 204 255"); initialized = 1; } @@ -376,7 +363,7 @@ static void print_type_ent_edge(FILE *F, ir_type *T, ir_entity *E, const char *f * Prints the edge from an entity E to an entity T with additional info fmt, ... * to the file F. */ -static void print_ent_ent_edge(FILE *F, ir_entity *E, ir_entity *T, int backedge, const char *fmt, ...) +static void print_ent_ent_edge(FILE *F, ir_entity *E, ir_entity *T, int backedge, ird_color_t color, const char *fmt, ...) { va_list ap; @@ -388,6 +375,9 @@ static void print_ent_ent_edge(FILE *F, ir_entity *E, ir_entity *T, int backedge PRINT_ENTID(E); fprintf(F, "\" targetname: \""); PRINT_ENTID(T); fprintf(F, "\""); vfprintf(F, fmt, ap); + fprintf(F, " "); + if (color != (ird_color_t) -1) + print_vcg_color(F, color); fprintf(F, "}\n"); va_end(ap); } @@ -478,7 +468,7 @@ static void print_enum_item_edge(FILE *F, ir_type *E, int item, const char *fmt, /*-----------------------------------------------------------------*/ static void dump_whole_node(ir_node *n, void *env); -static INLINE void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg); +static inline void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg); /*-----------------------------------------------------------------*/ /* Helper functions. */ @@ -647,8 +637,9 @@ static ir_node **construct_block_lists(ir_graph *irg) { current_ir_graph = irg; - if(walk_flag) + if(walk_flag) { ir_free_resources(irg, IR_RESOURCE_IRN_VISITED); + } for (i = get_irp_n_irgs() - 1; i >= 0; --i) ird_set_irg_link(get_irp_irg(i), NULL); @@ -669,8 +660,9 @@ static ir_node **construct_block_lists(ir_graph *irg) { set_interprocedural_view(rem_view); #endif - if(walk_flag) + if(walk_flag) { ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED); + } current_ir_graph = rem; return ird_get_irg_link(irg); @@ -690,7 +682,7 @@ static list_tuple *construct_extblock_lists(ir_graph *irg) { ir_node **blk_list = construct_block_lists(irg); int i; ir_graph *rem = current_ir_graph; - list_tuple *lists = xmalloc(sizeof(*lists)); + list_tuple *lists = XMALLOC(list_tuple); current_ir_graph = irg; @@ -736,11 +728,6 @@ int dump_node_opcode(FILE *F, ir_node *n) /* implementation for default nodes */ switch (get_irn_opcode(n)) { - - case iro_Const: - ir_fprintf(F, "%T", get_Const_tarval(n)); - break; - case iro_SymConst: switch (get_SymConst_kind(n)) { case symconst_addr_name: @@ -841,6 +828,9 @@ int dump_node_opcode(FILE *F, ir_node *n) case iro_DivMod: fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_DivMod_resmode(n), &bad)); break; + case iro_Builtin: + fprintf(F, "%s[%s]", get_irn_opname(n), get_builtin_kind_name(get_Builtin_kind(n))); + break; default: default_case: @@ -927,7 +917,6 @@ static const pns_lookup_t start_lut[] = { X(P_frame_base), X(P_tls), X(T_args), - X(P_value_arg_base) #undef X }; @@ -1103,6 +1092,10 @@ dump_node_nodeattr(FILE *F, ir_node *n) } break; + case iro_Const: + ir_fprintf(F, "%T ", get_Const_tarval(n)); + break; + case iro_Proj: pred = get_Proj_pred(n); proj_nr = get_Proj_proj(n); @@ -1230,7 +1223,7 @@ static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad) return; } - mode = get_irn_mode(node); + mode = get_irn_mode(n); if(mode == mode_M) { print_vcg_color(F, ird_color_memory); return; @@ -1288,7 +1281,7 @@ 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)); + hook_entry_t *info = XMALLOC(hook_entry_t); info->hook._hook_node_info = cb; info->context = data; @@ -1308,7 +1301,7 @@ void dump_remv_node_info_callback(void *handle) /** * Dump the node information of a node n to a file F. */ -static INLINE int dump_node_info(FILE *F, ir_node *n) +static inline int dump_node_info(FILE *F, ir_node *n) { int bad = 0; const ir_op_ops *ops = get_op_ops(get_irn_op(n)); @@ -1326,7 +1319,7 @@ static INLINE int dump_node_info(FILE *F, ir_node *n) return bad; } -static INLINE int is_constlike_node(const ir_node *node) +static inline int is_constlike_node(const ir_node *node) { const ir_op *op = get_irn_op(node); return is_op_constlike(op); @@ -1350,7 +1343,7 @@ static void dump_const_node_local(FILE *F, ir_node *n) { for (i = 0; i < get_irn_arity(n); i++) { ir_node *con = get_irn_n(n, i); - if (is_constlike_node(con) && irn_not_visited(con)) { + if (is_constlike_node(con) && !irn_visited(con)) { int bad = 0; mark_irn_visited(con); @@ -1467,10 +1460,6 @@ static void dump_node(FILE *F, ir_node *n) if(dump_node_edge_hook) dump_node_edge_hook(F, n); -#if DO_HEAPANALYSIS - dump_irn_chi_term(F, n); - dump_irn_state(F, n); -#endif } /** dump the edge to the block this node belongs to */ @@ -1573,7 +1562,7 @@ static void print_edge_vcgattr(FILE *F, ir_node *from, int to) { /** dump edges to our inputs */ static void dump_ir_data_edges(FILE *F, ir_node *n) { int i, num; - unsigned long visited = get_irn_visited(n); + ir_visited_t visited = get_irn_visited(n); if (!dump_keepalive && is_End(n)) { /* the End node has only keep-alive edges */ @@ -1719,10 +1708,6 @@ static void dump_whole_block(FILE *F, ir_node *block) { PRINT_NODEID(block); fprintf(F, "\" label: \""); dump_node_label(F, block); -#if DO_HEAPANALYSIS - if (get_opt_dump_abstvals()) - fprintf(F, " seqno: %d", (int)get_Block_seqno(block)); -#endif /* colorize blocks */ if (! get_Block_matured(block)) @@ -1753,9 +1738,6 @@ static void dump_whole_block(FILE *F, ir_node *block) { /* Close the vcg information for the block */ fprintf(F, "}\n"); dump_const_node_local(F, block); -#if DO_HEAPANALYSIS - dump_irn_chi_term(F, block); -#endif fprintf(F, "\n"); } @@ -2001,17 +1983,15 @@ int dump_type_node(FILE *F, ir_type *tp) } -void dump_entity_node(FILE *F, ir_entity *ent, int color) +void dump_entity_node(FILE *F, ir_entity *ent) { fprintf(F, "node: {title: \""); PRINT_ENTID(ent); fprintf(F, "\""); fprintf(F, DEFAULT_TYPE_ATTRIBUTE); fprintf(F, "label: "); - fprintf(F, "\"ent %s\" ", get_ent_dump_name(ent)); - if (color) - fprintf(F, "color:%d", color); - else - fprintf(F, ENTITY_NODE_ATTR); + fprintf(F, "\"%s\" ", get_ent_dump_name(ent)); + + print_vcg_color(F, ird_color_entity); fprintf(F, "\n info1: \""); dump_entity_to_file(F, ent, dump_verbosity_entattrs | dump_verbosity_entconsts); @@ -2053,7 +2033,7 @@ dump_type_info(type_or_ent tore, void *env) { ir_entity *ent = tore.ent; ir_node *value; /* The node */ - dump_entity_node(F, ent, 0); + dump_entity_node(F, ent); /* The Edges */ /* skip this to reduce graph. Member edge of type is parallel to this edge. * fprintf(F, "edge: { sourcename: \"%p\" targetname: \"%p\" " @@ -2061,7 +2041,7 @@ dump_type_info(type_or_ent tore, void *env) { 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), 0, ENT_OVERWRITES_EDGE_ATTR); + print_ent_ent_edge(F,ent, get_entity_overwrites(ent, i), 0, -1, ENT_OVERWRITES_EDGE_ATTR); } /* attached subgraphs */ if (const_entities && (get_entity_variability(ent) != variability_uninitialized)) { @@ -2079,7 +2059,7 @@ dump_type_info(type_or_ent tore, void *env) { if (value) { print_ent_node_edge(F, ent, value, ENT_VALUE_EDGE_ATTR, i); dump_const_expression(F, value); - print_ent_ent_edge(F, ent, get_compound_ent_value_member(ent, i), 0, ENT_CORR_EDGE_ATTR, i); + print_ent_ent_edge(F, ent, get_compound_ent_value_member(ent, i), 0, -1, ENT_CORR_EDGE_ATTR, i); /* fprintf(F, "edge: { sourcename: \"%p\" targetname: \"%p\" " ENT_CORR_EDGE_ATTR "}\n", GET_ENTID(ent), @@ -2173,11 +2153,11 @@ dump_class_hierarchy_node(type_or_ent tore, void *ctx) { break; /* GL */ if (env->dump_ent && is_Class_type(get_entity_owner(ent))) { /* The node */ - dump_entity_node(F, ent, 0); + dump_entity_node(F, ent); /* The edges */ print_type_ent_edge(F,get_entity_owner(ent),ent,TYPE_MEMBER_EDGE_ATTR); for(i = 0; i < get_entity_n_overwrites(ent); i++) - print_ent_ent_edge(F, get_entity_overwrites(ent, i), ent, 0, ENT_OVERWRITES_EDGE_ATTR); + print_ent_ent_edge(F, get_entity_overwrites(ent, i), ent, 0, -1, ENT_OVERWRITES_EDGE_ATTR); } break; } @@ -2222,13 +2202,13 @@ dump_out_edge(ir_node *n, void *env) { } } -static INLINE void +static inline void dump_loop_label(FILE *F, 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)); } -static INLINE void dump_loop_info(FILE *F, ir_loop *loop) { +static inline void dump_loop_info(FILE *F, ir_loop *loop) { fprintf(F, " info1: \""); fprintf(F, " loop nr: %d", get_loop_loop_nr(loop)); #ifdef DEBUG_libfirm /* GL @@@ debug analyses */ @@ -2237,7 +2217,7 @@ static INLINE void dump_loop_info(FILE *F, ir_loop *loop) { fprintf(F, "\""); } -static INLINE void +static inline void dump_loop_node(FILE *F, ir_loop *loop) { fprintf(F, "node: {title: \""); PRINT_LOOPID(loop); @@ -2248,7 +2228,7 @@ dump_loop_node(FILE *F, ir_loop *loop) { fprintf(F, "}\n"); } -static INLINE void +static inline void dump_loop_node_edge(FILE *F, ir_loop *loop, int i) { assert(loop); fprintf(F, "edge: {sourcename: \""); @@ -2259,7 +2239,7 @@ dump_loop_node_edge(FILE *F, ir_loop *loop, int i) { fprintf(F, "}\n"); } -static INLINE void +static inline void dump_loop_son_edge(FILE *F, ir_loop *loop, int i) { assert(loop); fprintf(F, "edge: {sourcename: \""); @@ -2288,7 +2268,7 @@ void dump_loops(FILE *F, ir_loop *loop) { } } -static INLINE +static inline void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg) { ir_graph *rem = current_ir_graph; current_ir_graph = irg; @@ -2373,7 +2353,7 @@ FILE *vcg_open(ir_graph *irg, const char * suffix1, const char *suffix2) { if (!suffix2) suffix2 = ""; /* open file for vcg graph */ - fname = xmalloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5); + fname = XMALLOCN(char, len * 2 + strlen(suffix1) + strlen(suffix2) + 5); /* strncpy (fname, nm, len); */ /* copy the filename */ j = 0; @@ -2417,7 +2397,7 @@ FILE *vcg_open_name(const char *name, const char *suffix) { if (!suffix) suffix = ""; /** open file for vcg graph */ - fname = xmalloc(len * 2 + 5 + strlen(suffix)); + fname = XMALLOCN(char, len * 2 + 5 + strlen(suffix)); /* strcpy (fname, name);*/ /* copy the filename */ j = 0; for (i = 0; i < len; ++i) { /* replace '/' in the name: escape by @. */ @@ -2831,7 +2811,6 @@ void dump_subgraph(ir_node *root, int depth, const char *suffix) { } } -#ifdef INTERPROCEDURAL_VIEW void dump_callgraph(const char *suffix) { FILE *F = vcg_open_name("Callgraph", suffix); @@ -2839,29 +2818,24 @@ void dump_callgraph(const char *suffix) { int i, rem = edge_label; //int colorize; edge_label = 1; - dump_vcg_header(F, "Callgraph", NULL); - - //colorize = get_irp_callgraph_state() == irp_callgraph_and_calltree_consistent; + dump_vcg_header(F, "Callgraph", "Hierarchiv", NULL); for (i = get_irp_n_irgs() - 1; i >= 0; --i) { ir_graph *irg = get_irp_irg(i); ir_entity *ent = get_irg_entity(irg); int j; - //int n_callees = get_irg_n_callees(irg); - int color; + int n_callees = get_irg_n_callees(irg); - //color = colorize ? get_entity_color(ent) : ird_color_green; - color = ird_color_green; - dump_entity_node(F, ent, color); + dump_entity_node(F, ent); for (j = 0; j < n_callees; ++j) { ir_entity *c = get_irg_entity(get_irg_callee(irg, j)); //if (id_is_prefix(prefix, get_entity_ld_ident(c))) continue; int be = is_irg_callee_backedge(irg, j); char *attr; attr = (be) ? - "label:\"recursion %d\" color:%d" : - "label:\"calls %d\" color:%d"; - print_ent_ent_edge(F, ent, c, be, attr, get_irg_callee_loop_depth(irg, j), color); + "label:\"recursion %d\"" : + "label:\"calls %d\""; + print_ent_ent_edge(F, ent, c, be, ird_color_entity, attr, get_irg_callee_loop_depth(irg, j)); } } @@ -2871,6 +2845,7 @@ void dump_callgraph(const char *suffix) { } } +#if 0 /* Dump all irgs in interprocedural view to a single file. */ void dump_all_cg_block_graph(const char *suffix) { FILE *f = vcg_open_name("All_graphs", suffix);