X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=370eaeb35ad36502180188f478bbc351bd69d9b1;hb=df144e685b61ac41bf4d82f172515aa81bb1a2f3;hp=9857f39675ccfc503bb45f523ea1dce2e7d930b3;hpb=68cc2e78ca8ad2e8ab0d473ac7cebdad14f64bd1;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index 9857f3967..370eaeb35 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -1,13 +1,27 @@ /* - * Project: libFIRM - * File name: ir/ir/irdump.c - * Purpose: Write vcg representation of firm to file. - * Author: Martin Trapp, Christian Schaefer - * Modified by: Goetz Lindenmaier, Hubert Schmidt - * Created: - * CVS-ID: $Id$ - * Copyright: (c) 1998-2006 Universit�t Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +/** + * @file + * @brief Write vcg representation of firm to file. + * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Hubert Schmidt + * @version $Id$ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -34,9 +48,7 @@ #include "irdump_t.h" #include "irgwalk.h" -#include "typewalk.h" #include "tv_t.h" -#include "type_or_entity.h" #include "irouts.h" #include "irdom.h" #include "irloop_t.h" @@ -480,6 +492,7 @@ static void ird_set_irg_link(ir_graph *irg, void *x) { * Walker, clears the private link field. */ static void clear_link(ir_node * node, void * env) { + (void) env; ird_set_irn_link(node, NULL); } @@ -523,20 +536,10 @@ static int node_floats(ir_node *n) { * Walker that visits the anchors */ static void ird_walk_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *post, void *env) { - irg_walk_graph(irg, pre, post, env); - if (dump_anchors) { - int i; - - for (i = anchor_max - 1; i >= 0; --i) { - ir_node *n = irg->anchors[i]; - - if (n) { - /* reset the visit flag: will be increase in the walker */ - set_irg_visited(irg, get_irg_visited(irg) - 1); - irg_walk(n, pre, post, env); - } - } + irg_walk_anchors(irg, pre, post, env); + } else { + irg_walk_graph(irg, pre, post, env); } } @@ -544,6 +547,7 @@ static void ird_walk_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *pos * Walker, allocates an array for all blocks and puts it's nodes non-floating nodes into this array. */ static void collect_node(ir_node * node, void *env) { + (void) env; if (is_Block(node) || node_floats(node) || get_irn_op(node) == op_Bad @@ -578,10 +582,16 @@ static void collect_node(ir_node * node, void *env) { * Free the list with DEL_ARR_F(). */ static ir_node **construct_block_lists(ir_graph *irg) { - int i, rem_view = get_interprocedural_view(); - ir_graph *rem = current_ir_graph; + int i; + int rem_view = get_interprocedural_view(); + int walk_flag = using_visited(irg); + ir_graph *rem = current_ir_graph; + current_ir_graph = irg; + if(walk_flag) + clear_using_visited(current_ir_graph); + for (i = get_irp_n_irgs() - 1; i >= 0; --i) ird_set_irg_link(get_irp_irg(i), NULL); @@ -597,6 +607,9 @@ static ir_node **construct_block_lists(ir_graph *irg) { set_interprocedural_view(rem_view); + if(walk_flag) + set_using_visited(current_ir_graph); + current_ir_graph = rem; return ird_get_irg_link(irg); } @@ -666,7 +679,7 @@ int dump_node_opcode(FILE *F, ir_node *n) int res; char buf[1024]; res = tarval_snprintf(buf, sizeof(buf), get_Const_tarval(n)); - assert(res < sizeof(buf) && "buffer to small for tarval_snprintf"); + assert(res < (int) sizeof(buf) && "buffer to small for tarval_snprintf"); fprintf(F, buf); } break; @@ -694,6 +707,9 @@ int dump_node_opcode(FILE *F, ir_node *n) case symconst_enum_const: fprintf(F, "SymC %s enum", get_enumeration_name(get_SymConst_enum(n))); break; + case symconst_label: + fprintf(F, "SymC %lu label", get_SymConst_label(n)); + break; } } break; @@ -736,8 +752,15 @@ int dump_node_opcode(FILE *F, ir_node *n) break; } case iro_Load: + if (get_Load_align(n) == align_non_aligned) + fprintf(F, "ua"); fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Load_mode(n), &bad)); break; + case iro_Store: + if (get_Store_align(n) == align_non_aligned) + fprintf(F, "ua"); + fprintf(F, "%s", get_irn_opname(n)); + break; case iro_Block: fprintf(F, "%s%s", is_Block_dead(n) ? "Dead " : "", get_irn_opname(n)); break; @@ -746,6 +769,15 @@ int dump_node_opcode(FILE *F, ir_node *n) fprintf(F, "strict"); 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)); + break; + case iro_Mod: + fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_Mod_resmode(n), &bad)); + break; + case iro_DivMod: + fprintf(F, "%s[%s]", get_irn_opname(n), get_mode_name_ex(get_DivMod_resmode(n), &bad)); + break; default: default_case: @@ -849,10 +881,11 @@ static const pns_lookup_t cond_lut[] = { static const pns_lookup_t call_lut[] = { #define X(a) { pn_Call_##a, #a } X(M_regular), - X(T_result), - X(P_value_res_base), + X(X_regular), X(X_except), - X(M_except) + X(T_result), + X(M_except), + X(P_value_res_base) #undef X }; @@ -860,6 +893,7 @@ static const pns_lookup_t call_lut[] = { static const pns_lookup_t quot_lut[] = { #define X(a) { pn_Quot_##a, #a } X(M), + X(X_regular), X(X_except), X(res) #undef X @@ -869,6 +903,7 @@ static const pns_lookup_t quot_lut[] = { static const pns_lookup_t divmod_lut[] = { #define X(a) { pn_DivMod_##a, #a } X(M), + X(X_regular), X(X_except), X(res_div), X(res_mod) @@ -879,6 +914,7 @@ static const pns_lookup_t divmod_lut[] = { static const pns_lookup_t div_lut[] = { #define X(a) { pn_Div_##a, #a } X(M), + X(X_regular), X(X_except), X(res) #undef X @@ -888,6 +924,7 @@ static const pns_lookup_t div_lut[] = { static const pns_lookup_t mod_lut[] = { #define X(a) { pn_Mod_##a, #a } X(M), + X(X_regular), X(X_except), X(res) #undef X @@ -897,6 +934,7 @@ static const pns_lookup_t mod_lut[] = { static const pns_lookup_t load_lut[] = { #define X(a) { pn_Load_##a, #a } X(M), + X(X_regular), X(X_except), X(res) #undef X @@ -906,6 +944,7 @@ static const pns_lookup_t load_lut[] = { static const pns_lookup_t store_lut[] = { #define X(a) { pn_Store_##a, #a } X(M), + X(X_regular), X(X_except) #undef X }; @@ -914,6 +953,7 @@ static const pns_lookup_t store_lut[] = { static const pns_lookup_t alloc_lut[] = { #define X(a) { pn_Alloc_##a, #a } X(M), + X(X_regular), X(X_except), X(res) #undef X @@ -923,6 +963,7 @@ static const pns_lookup_t alloc_lut[] = { static const pns_lookup_t copyb_lut[] = { #define X(a) { pn_CopyB_##a, #a } X(M), + X(X_regular), X(X_except), X(M_except) #undef X @@ -932,6 +973,7 @@ static const pns_lookup_t copyb_lut[] = { static const pns_lookup_t instof_lut[] = { #define X(a) { pn_InstOf_##a, #a } X(M), + X(X_regular), X(X_except), X(res), X(M_except), @@ -950,6 +992,7 @@ static const pns_lookup_t raise_lut[] = { static const pns_lookup_t bound_lut[] = { #define X(a) { pn_Bound_##a, #a } X(M), + X(X_regular), X(X_except), X(res), #undef X @@ -1066,7 +1109,6 @@ handle_lut: #include #include "execution_frequency.h" -#include "callgraph.h" static void dump_node_ana_vals(FILE *F, ir_node *n) { return; @@ -1149,6 +1191,9 @@ static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad) case iro_Tuple: print_vcg_color(F, ird_color_yellow); break; + case iro_ASM: + print_vcg_color(F, ird_color_darkyellow); + break; default: PRINT_DEFAULT_NODE_ATTR; } @@ -1392,8 +1437,8 @@ print_mem_edge_vcgattr(FILE *F, ir_node *from, int to) { fprintf(F, INTER_MEM_EDGE_ATTR); } -static void -print_edge_vcgattr(FILE *F, ir_node *from, int to) { +/** Print the vcg attributes for the edge from node from to it's to's input */ +static void print_edge_vcgattr(FILE *F, ir_node *from, int to) { assert(from); if (dump_edge_vcgattr_hook) @@ -1411,9 +1456,9 @@ print_edge_vcgattr(FILE *F, ir_node *from, int to) { case iro_End: if (to >= 0) { 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, INTER_MEM_EDGE_ATTR); + fprintf(F, KEEP_ALIVE_CF_EDGE_ATTR); + else + fprintf(F, KEEP_ALIVE_DF_EDGE_ATTR); } break; default: @@ -1434,9 +1479,8 @@ 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) { +/** dump edges to our inputs */ +static void dump_ir_data_edges(FILE *F, ir_node *n) { int i; unsigned long visited = get_irn_visited(n); @@ -2164,6 +2208,7 @@ void dump_vcg_header(FILE *F, const char *name, const char *orientation) { "classname 17: \"interblock Memory\"\n" "classname 18: \"Exception Control Flow for Interval Analysis\"\n" "classname 19: \"Postdominators\"\n" + "classname 20: \"Keep Alive\"\n" "infoname 1: \"Attribute\"\n" "infoname 2: \"Verification errors\"\n" "infoname 3: \"Debug info\"\n", @@ -2330,6 +2375,10 @@ dump_ir_graph(ir_graph *irg, const char *suffix ) if (!is_filtered_dump_name(get_entity_ident(get_irg_entity(irg)))) return; + if (dump_backedge_information_flag && get_irg_loopinfo_state(irg) != loopinfo_consistent) { + construct_backedges(irg); + } + rem = current_ir_graph; current_ir_graph = irg; if (get_interprocedural_view()) suffix1 = "-pure-ip"; @@ -2709,6 +2758,9 @@ static int compute_color(int my, int max) { return base_color + n_colors - color; } +/** + * Calculate a entity color depending on it's execution propability. + */ static int get_entity_color(ir_entity *ent) { ir_graph *irg = get_entity_irg(ent); assert(irg); @@ -2734,19 +2786,20 @@ void dump_callgraph(const char *suffix) { FILE *F = vcg_open_name("Callgraph", suffix); if (F != NULL) { - int i, rem = edge_label; + int i, rem = edge_label, colorize; edge_label = 1; dump_vcg_header(F, "Callgraph", NULL); + colorize = get_irp_callgraph_state() == irp_callgraph_and_calltree_consistent; + 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, n_callees = get_irg_n_callees(irg); + int color; - /* Do not dump runtime system. */ - //if (id_is_prefix(prefix, get_entity_ld_ident(ent))) continue; - - dump_entity_node(F, ent, get_entity_color(ent)); + color = colorize ? get_entity_color(ent) : ird_color_green; + dump_entity_node(F, ent, color); 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; @@ -2755,7 +2808,7 @@ void dump_callgraph(const char *suffix) { 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), get_entity_color(ent)); + print_ent_ent_edge(F, ent, c, be, attr, get_irg_callee_loop_depth(irg, j), color); } } @@ -2987,9 +3040,9 @@ void dump_callgraph_loop_tree(const char *suffix) { } -/*-----------------------------------------------------------------------------*/ -/* Dumps the firm nodes in the loop tree to a graph along with the loop nodes. */ -/*-----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +/* Dumps the firm nodes in the loop tree to a graph along with the loop nodes.*/ +/*----------------------------------------------------------------------------*/ void collect_nodeloop(FILE *F, ir_loop *loop, eset *loopnodes) { int i, son_number = 0, node_number = 0;