- Changed keep logic: all nodes can be keeped yet, thi is necessary to fix fehler152
[libfirm] / ir / ir / irdump.c
index 0810720..6fd63ce 100644 (file)
@@ -58,6 +58,7 @@
 #include "irhooks.h"
 #include "dbginfo_t.h"
 #include "irtools.h"
+#include "irprintf.h"
 
 #include "irvrfy.h"
 
@@ -106,6 +107,8 @@ static int dump_node_idx_labels = 0;
 static int dump_anchors = 0;
 /** An option to dump the macro block edges. */
 static int dump_macro_block_edges = 0;
+/** An option to dump block marker in the block title */
+static int dump_block_marker = 0;
 
 int dump_dominator_information_flag = 0;
 int opt_dump_analysed_type_info = 1;
@@ -254,6 +257,10 @@ void dump_macroblock_edges(int flag) {
        dump_macro_block_edges = flag;
 }
 
+void dump_block_marker_in_title(int flag) {
+       dump_block_marker = flag;
+}
+
 /* -------------- some extended helper functions ----------------- */
 
 /**
@@ -601,9 +608,7 @@ static void collect_node(ir_node * node, void *env) {
        (void) env;
        if (is_Block(node)
            || node_floats(node)
-           || get_irn_op(node) == op_Bad
-           || get_irn_op(node) == op_Unknown
-           || get_irn_op(node) == op_NoMem) {
+           || (get_op_flags(get_irn_op(node)) & irop_flag_dump_noblock)) {
                ir_node ** arr = (ir_node **) ird_get_irg_link(get_irn_irg(node));
                if (!arr) arr = NEW_ARR_F(ir_node *, 0);
                ARR_APP1(ir_node *, arr, node);
@@ -637,13 +642,13 @@ static ir_node **construct_block_lists(ir_graph *irg) {
 #ifdef INTERPROCEDURAL_VIEW
        int      rem_view  = get_interprocedural_view();
 #endif
-       int      walk_flag = using_irn_visited(irg);
+       int      walk_flag = ir_resources_reserved(irg) & IR_RESOURCE_IRN_VISITED;
        ir_graph *rem      = current_ir_graph;
 
        current_ir_graph = irg;
 
        if(walk_flag)
-               clear_using_irn_visited(current_ir_graph);
+               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);
@@ -665,7 +670,7 @@ static ir_node **construct_block_lists(ir_graph *irg) {
 #endif
 
        if(walk_flag)
-               set_using_irn_visited(current_ir_graph);
+               ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
 
        current_ir_graph = rem;
        return ird_get_irg_link(irg);
@@ -732,15 +737,11 @@ int dump_node_opcode(FILE *F, ir_node *n)
        /* implementation for default nodes */
        switch (get_irn_opcode(n)) {
 
-       case iro_Const: {
-               int res;
-               char buf[1024];
-               res = tarval_snprintf(buf, sizeof(buf), get_Const_tarval(n));
-               assert(res < (int) sizeof(buf) && "buffer to small for tarval_snprintf");
-               fprintf(F, buf);
-       } break;
+       case iro_Const:
+               ir_fprintf(F, "%T", get_Const_tarval(n));
+               break;
 
-       case iro_SymConst: {
+       case iro_SymConst:
                switch (get_SymConst_kind(n)) {
                case symconst_addr_name:
                        /* don't use get_SymConst_ptr_info as it mangles the name. */
@@ -768,14 +769,14 @@ int dump_node_opcode(FILE *F, ir_node *n)
                        fprintf(F, "SymC %lu label", get_SymConst_label(n));
                        break;
                }
-       } break;
+               break;
 
-       case iro_Filter: {
+       case iro_Filter:
                if (!get_interprocedural_view())
                        fprintf(F, "Proj'");
                else
                        goto default_case;
-       } break;
+               break;
 
        case iro_Proj: {
                ir_node *pred = get_Proj_pred(n);
@@ -790,20 +791,20 @@ int dump_node_opcode(FILE *F, ir_node *n)
        case iro_Start:
        case iro_End:
        case iro_EndExcept:
-       case iro_EndReg: {
+       case iro_EndReg:
                if (get_interprocedural_view()) {
                        fprintf(F, "%s %s", get_irn_opname(n), get_ent_dump_name(get_irg_entity(get_irn_irg(n))));
                        break;
                } else
                        goto default_case;
-       }
+
        case iro_CallBegin: {
                ir_node *addr = get_CallBegin_ptr(n);
                ir_entity *ent = NULL;
                if (get_irn_op(addr) == op_Sel)
                        ent = get_Sel_entity(addr);
-               else if (is_SymConst_addr_ent(addr))
-                       ent = get_SymConst_entity(addr);
+               else if (is_Global(addr))
+                       ent = get_Global_entity(addr);
                fprintf(F, "%s", get_irn_opname(n));
                if (ent) fprintf(F, " %s", get_entity_name(ent));
                break;
@@ -819,7 +820,9 @@ int dump_node_opcode(FILE *F, ir_node *n)
                fprintf(F, "%s", get_irn_opname(n));
                break;
        case iro_Block:
-               fprintf(F, "%s%s", is_Block_dead(n) ? "Dead " : "", get_irn_opname(n));
+               fprintf(F, "%s%s%s",
+                       is_Block_dead(n) ? "Dead " : "", get_irn_opname(n),
+                       dump_block_marker ? (get_Block_mark(n) ? "*" : "") : "");
                break;
        case iro_Conv:
                if (get_Conv_strict(n))
@@ -922,7 +925,6 @@ static const pns_lookup_t start_lut[] = {
 #define X(a)    { pn_Start_##a, #a }
        X(X_initial_exec),
        X(P_frame_base),
-       X(P_globals),
        X(P_tls),
        X(T_args),
        X(P_value_arg_base)
@@ -1441,18 +1443,26 @@ static void dump_node(FILE *F, ir_node *n)
                return;
 
        /* dump this node */
-       fprintf(F, "node: {title: \""); PRINT_NODEID(n); fprintf(F, "\" label: \"");
+       fputs("node: {title: \"", F);
+       PRINT_NODEID(n);
+       fputs("\"", F);
 
+       fputs(" label: \"", F);
        bad = ! irn_vrfy_irg_dump(n, current_ir_graph, &p);
        bad |= dump_node_label(F, n);
        dump_node_ana_vals(F, n);
        //dump_node_ana_info(F, n);
-       fprintf(F, "\" ");
+       fputs("\" ", F);
+
+       if (get_op_flags(get_irn_op(n)) & irop_flag_dump_noinput) {
+               //fputs(" node_class:23", F);
+       }
+
        bad |= dump_node_info(F, n);
        print_node_error(F, p);
        print_dbg_info(F, get_irn_dbg_info(n));
        dump_node_vcgattr(F, n, NULL, bad);
-       fprintf(F, "}\n");
+       fputs("}\n", F);
        dump_const_node_local(F, n);
 
        if(dump_node_edge_hook)
@@ -2032,15 +2042,15 @@ static void dump_enum_item(FILE *F, ir_type *tp, int pos)
 
 /* dumps a type or entity and it's edges. */
 static void
-dump_type_info(type_or_ent *tore, void *env) {
+dump_type_info(type_or_ent tore, void *env) {
        FILE *F = env;
        int i = 0;  /* to shutup gcc */
 
        /* dump this type or entity */
 
-       switch (get_kind(tore)) {
+       switch (get_kind(tore.ent)) {
        case k_entity: {
-               ir_entity *ent = (ir_entity *)tore;
+               ir_entity *ent = tore.ent;
                ir_node *value;
                /* The node */
                dump_entity_node(F, ent, 0);
@@ -2082,7 +2092,7 @@ dump_type_info(type_or_ent *tore, void *env) {
                break;
        }
        case k_type: {
-               ir_type *tp = (ir_type *)tore;
+               ir_type *tp = tore.typ;
                dump_type_node(F, tp);
                /* and now the edges */
                switch (get_type_tpop_code(tp)) {
@@ -2149,17 +2159,18 @@ typedef struct _h_env {
  * If env->dump_ent dumps entities of classes and overwrites edges.
  */
 static void
-dump_class_hierarchy_node(type_or_ent *tore, void *ctx) {
+dump_class_hierarchy_node(type_or_ent tore, void *ctx) {
        h_env_t *env = ctx;
        FILE *F = env->f;
        int i = 0;  /* to shutup gcc */
 
        /* dump this type or entity */
-       switch (get_kind(tore)) {
+       switch (get_kind(tore.ent)) {
        case k_entity: {
-               ir_entity *ent = (ir_entity *)tore;
+               ir_entity *ent = tore.ent;
                if (get_entity_owner(ent) == get_glob_type()) break;
-               if (!is_Method_type(get_entity_type(ent))) break;  /* GL */
+               if (!is_Method_type(get_entity_type(ent)))
+                       break;  /* GL */
                if (env->dump_ent && is_Class_type(get_entity_owner(ent))) {
                        /* The node */
                        dump_entity_node(F, ent, 0);
@@ -2171,8 +2182,9 @@ dump_class_hierarchy_node(type_or_ent *tore, void *ctx) {
                break;
        }
        case k_type: {
-               ir_type *tp = (ir_type *)tore;
-               if (tp == get_glob_type()) break;
+               ir_type *tp = tore.typ;
+               if (tp == get_glob_type())
+                       break;
                switch (get_type_tpop_code(tp)) {
                case tpo_class:
                        dump_type_node(F, tp);
@@ -2290,25 +2302,21 @@ void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg) {
 /**
  * dumps the VCG header
  */
-void dump_vcg_header(FILE *F, const char *name, const char *orientation) {
+void dump_vcg_header(FILE *F, const char *name, const char *layout, const char *orientation) {
        int   i;
        char *label;
 
        init_colors();
 
-       if (edge_label) {
-               label = "yes";
-       } else {
-               label = "no";
-       }
-
+       label = edge_label ? "yes" : "no";
+       if (! layout)     layout = "Compilergraph";
        if (!orientation) orientation = "bottom_to_top";
 
        /* print header */
        fprintf(F,
                "graph: { title: \"ir graph of %s\"\n"
                "display_edge_labels: %s\n"
-               "layoutalgorithm: mindepth\n"
+               "layoutalgorithm: mindepth //$ \"%s\"\n"
                "manhattan_edges: yes\n"
                "port_sharing: no\n"
                "orientation: %s\n"
@@ -2334,13 +2342,14 @@ void dump_vcg_header(FILE *F, const char *name, const char *orientation) {
                "classname 20: \"Keep Alive\"\n"
                "classname 21: \"Out Edges\"\n"
                "classname 22: \"Macro Block Edges\"\n"
+               //"classname 23: \"NoInput Nodes\"\n"
                "infoname 1: \"Attribute\"\n"
                "infoname 2: \"Verification errors\"\n"
                "infoname 3: \"Debug info\"\n",
-               name, label, orientation);
+               name, label, layout, orientation);
 
        for (i = 0; i < ird_color_count; ++i) {
-               if(color_rgb[i] != NULL) {
+               if (color_rgb[i] != NULL) {
                        fprintf(F, "colorentry %s: %s\n", color_names[i], color_rgb[i]);
                }
        }
@@ -2487,7 +2496,7 @@ void dump_ir_graph_file(ir_graph *irg, FILE *out)
                construct_backedges(irg);
        }
 
-       dump_vcg_header(out, get_irg_dump_name(irg), NULL);
+       dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
 
        /* call the dump graph hook */
        if (dump_ir_graph_hook) {
@@ -2518,7 +2527,7 @@ void dump_ir_block_graph_file(ir_graph *irg, FILE *out)
 {
        int i;
 
-       dump_vcg_header(out, get_irg_dump_name(irg), NULL);
+       dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
 
        construct_block_lists(irg);
 
@@ -2553,7 +2562,7 @@ void dump_ir_extblock_graph_file(ir_graph *irg, FILE *F)
        if (get_irg_extblk_state(irg) != extblk_valid)
                compute_extbb(irg);
 
-       dump_vcg_header(F, get_irg_dump_name(irg), NULL);
+       dump_vcg_header(F, get_irg_dump_name(irg), NULL, NULL);
 
        construct_extblock_lists(irg);
 
@@ -2612,7 +2621,7 @@ void dump_ir_graph_w_types_file(ir_graph *irg, FILE *out)
        /* dumping types does not work with local nodes */
        dump_const_local = 0;
 
-       dump_vcg_header(out, get_irg_dump_name(irg), NULL);
+       dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
 
        /* dump common ir graph */
        irg_walk(get_irg_end(irg), NULL, dump_whole_node, out);
@@ -2644,7 +2653,7 @@ void dump_ir_block_graph_w_types_file(ir_graph *irg, FILE *out)
        /* dumping types does not work with local nodes */
        dump_const_local = 0;
 
-       dump_vcg_header(out, get_irg_dump_name(irg), NULL);
+       dump_vcg_header(out, get_irg_dump_name(irg), NULL, NULL);
 
        /* dump common blocked ir graph */
        construct_block_lists(irg);
@@ -2765,7 +2774,7 @@ void dump_cfg(ir_graph *irg, const char *suffix)
 #endif
 
                current_ir_graph = irg;
-               dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+               dump_vcg_header(f, get_irg_dump_name(irg), NULL, NULL);
 
 #ifdef INTERPROCEDURAL_VIEW
                if (ipv) {
@@ -2814,7 +2823,7 @@ void dump_subgraph(ir_node *root, int depth, const char *suffix) {
        F = vcg_open(get_irn_irg(root), suffix, buf);
        if (F != NULL) {
                pset *mark_set = pset_new_ptr(1);
-               dump_vcg_header(F, get_irg_dump_name(get_irn_irg(root)), NULL);
+               dump_vcg_header(F, get_irg_dump_name(get_irn_irg(root)), NULL, NULL);
                descend_and_dump(F, root, depth, mark_set);
                dump_vcg_footer(F);
                fclose(F);
@@ -2911,7 +2920,7 @@ dump_type_graph(ir_graph *irg, const char *suffix)
                ir_graph *rem = current_ir_graph;
                current_ir_graph = irg;
 
-               dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+               dump_vcg_header(f, get_irg_dump_name(irg), "Hierarchic", NULL);
 
                /* walk over the blocks in the graph */
                type_walk_irg(irg, dump_type_info, NULL, f);
@@ -2932,7 +2941,7 @@ dump_all_types(const char *suffix)
 {
        FILE *f = vcg_open_name("All_types", suffix);
        if (f) {
-               dump_vcg_header(f, "All_types", NULL);
+               dump_vcg_header(f, "All_types", "Hierarchic", NULL);
                type_walk(dump_type_info, NULL, f);
                inc_irg_visited(get_const_code_irg());
 
@@ -2950,7 +2959,7 @@ dump_class_hierarchy(int entities, const char *suffix)
                h_env_t env;
                env.f        = f;
                env.dump_ent = entities;
-               dump_vcg_header(f, "class_hierarchy", NULL);
+               dump_vcg_header(f, "class_hierarchy", "Hierarchic", NULL);
                type_walk(dump_class_hierarchy_node, NULL, &env);
 
                dump_vcg_footer(f);
@@ -2988,15 +2997,14 @@ void dump_loops_standalone(FILE *F, ir_loop *loop) {
        dump_loop_node(F, loop);
 
        /* Dump the loop elements. */
-
-       for(i = 0; i < get_loop_n_elements(loop); i++) {
+       for (i = 0; i < get_loop_n_elements(loop); i++) {
                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. */
+                       if (loop_node_started) { /* Close the "firm-nodes" node first if we started one. */
                                fprintf(F, "\" }\n");
                                fprintf(F, "edge: {sourcename: \"");
                                PRINT_LOOPID(loop);
@@ -3031,7 +3039,7 @@ void dump_loops_standalone(FILE *F, ir_loop *loop) {
                        assert(get_kind(son) == k_ir_graph);
 
                        /* We are a loop node -> Collect firm graphs */
-                       n = (ir_graph *)le.node;
+                       n = le.irg;
                        if (!loop_node_started) {
                                /* Start a new node which contains all firm nodes of the current loop */
                                fprintf(F, "node: { title: \"");
@@ -3072,9 +3080,10 @@ void dump_loop_tree(ir_graph *irg, const char *suffix)
                current_ir_graph = irg;
                edge_label = 1;
 
-               dump_vcg_header(f, get_irg_dump_name(irg), "top_to_bottom");
+               dump_vcg_header(f, get_irg_dump_name(irg), "Tree", "top_to_bottom");
 
-               if (get_irg_loop(irg)) dump_loops_standalone(f, get_irg_loop(irg));
+               if (get_irg_loop(irg))
+                       dump_loops_standalone(f, get_irg_loop(irg));
 
                dump_vcg_footer(f);
                fclose(f);
@@ -3087,7 +3096,7 @@ void dump_loop_tree(ir_graph *irg, const char *suffix)
 void dump_callgraph_loop_tree(const char *suffix) {
        FILE *F;
        F = vcg_open_name("Callgraph_looptree", suffix);
-       dump_vcg_header(F, "callgraph looptree", "top_to_bottom");
+       dump_vcg_header(F, "callgraph looptree", "Tree", "top_to_bottom");
        dump_loops_standalone(F, irp->outermost_cg_loop);
        dump_vcg_footer(F);
        fclose(F);
@@ -3151,7 +3160,7 @@ void dump_loop(ir_loop *l, const char *suffix) {
                eset *extnodes = eset_create();
                ir_node *n, *b;
 
-               dump_vcg_header(F, name, NULL);
+               dump_vcg_header(F, name, NULL, NULL);
 
                /* collect all nodes to dump */
                collect_nodeloop(F, l, loopnodes);