Added Dummy node which does not CSE with anything
[libfirm] / ir / ir / irdump.c
index 9f3355a..5305cc9 100644 (file)
  * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Hubert Schmidt
  * @version $Id$
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
-#ifdef HAVE_STRING_H
 #include <string.h>
-#endif
-#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
-#endif
 #include <stdarg.h>
 
 #include "firm_common_t.h"
 #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);