normalized various stuff
[libfirm] / ir / ir / irdump.c
index 7ba433b..337c091 100644 (file)
@@ -42,9 +42,7 @@
 # include "pmap.h"
 # include "eset.h"
 
-/* #undef HEAPANAL  */
-# undef HEAPANAL
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
 void dump_chi_term(FILE *FL, ir_node *n);
 void dump_state(FILE *FL, ir_node *n);
 int  get_opt_dump_abstvals(void);
@@ -59,10 +57,13 @@ SeqNo get_Block_seqno(ir_node *n);
 #define DEFAULT_ENUM_ITEM_ATTRIBUTE " "
 
 /* Attributes of edges between Firm nodes */
-#define BLOCK_EDGE_ATTR     "class:2 priority:2 linestyle:dotted"
-#define CF_EDGE_ATTR        "class:13 color:red"
-#define MEM_EDGE_ATTR       "class:14 color:blue"
-#define DOMINATOR_EDGE_ATTR "class:15 color:red"
+#define INTRA_DATA_EDGE_ATTR "class:1  priority:50"
+#define INTER_DATA_EDGE_ATTR "class:16 priority:10"
+#define BLOCK_EDGE_ATTR      "class:2  priority:50 linestyle:dotted"
+#define CF_EDGE_ATTR         "class:13 priority:60 color:red"
+#define INTRA_MEM_EDGE_ATTR  "class:14 priority:50 color:blue"
+#define INTER_MEM_EDGE_ATTR  "class:17 priority:10 color:blue"
+#define DOMINATOR_EDGE_ATTR  "class:15 color:red"
 
 #define BACK_EDGE_ATTR "linestyle:dashed "
 
@@ -108,6 +109,14 @@ SeqNo get_Block_seqno(ir_node *n);
 #define PRINT_ITEMID(X,Y)  fprintf(F, "i%pT%d", (void *) (X), (Y))
 #endif
 
+static const char *get_mode_name_ex(ir_mode *mode, int *bad)
+{
+  if (is_mode(mode))
+    return get_mode_name(mode);
+  *bad |= 1;
+  return "<ERROR>";
+}
+
 static const char *get_type_name_ex(type *tp, int *bad)
 {
   if (is_type(tp))
@@ -320,7 +329,7 @@ static void collect_node(ir_node * node, void *env) {
  * graphs not visited.
  * Free the list with DEL_ARR_F.  */
 static ir_node ** construct_block_lists(ir_graph *irg) {
-  int i;
+  int i, rem_view = interprocedural_view;
   ir_graph *rem = current_ir_graph;
   current_ir_graph = irg;
 
@@ -329,6 +338,14 @@ static ir_node ** construct_block_lists(ir_graph *irg) {
 
   irg_walk_graph(current_ir_graph, clear_link, collect_node, current_ir_graph);
 
+  /* Collect also EndReg and EndExcept. We do not want to change the walker. */
+  interprocedural_view = 0;
+  set_irg_visited(current_ir_graph, get_irg_visited(current_ir_graph)-1);
+  irg_walk(get_irg_end_reg(current_ir_graph), clear_link, collect_node, current_ir_graph);
+  set_irg_visited(current_ir_graph, get_irg_visited(current_ir_graph)-1);
+  irg_walk(get_irg_end_except(current_ir_graph), clear_link, collect_node, current_ir_graph);
+  interprocedural_view = rem_view;
+
   current_ir_graph = rem;
   return ird_get_irg_link(irg);
 }
@@ -435,14 +452,18 @@ dump_node_opcode(FILE *F, ir_node *n)
   } break;
 
   case iro_SymConst: {
-    if (get_SymConst_kind(n) == linkage_ptr_info) {
+    if (get_SymConst_kind(n) == symconst_addr_name) {
       /* don't use get_SymConst_ptr_info as it mangles the name. */
-      fprintf (F, "SymC %s", get_id_str(get_SymConst_ptrinfo(n)));
+      fprintf (F, "SymC %s", get_id_str(get_SymConst_name(n)));
+    } else if (get_SymConst_kind(n) == symconst_addr_ent) {
+      assert(get_SymConst_entity(n));
+      assert(is_entity(get_SymConst_entity(n)));
+      fprintf (F, "SymC &%s", get_entity_name(get_SymConst_entity(n)));
     } else {
       assert(get_kind(get_SymConst_type(n)) == k_type);
       assert(get_type_ident(get_SymConst_type(n)));
       fprintf (F, "SymC %s ", get_type_name_ex(get_SymConst_type(n), &bad));
-      if (get_SymConst_kind(n) == type_tag)
+      if (get_SymConst_kind(n) == symconst_type_tag)
         fprintf (F, "tag");
       else
         fprintf (F, "size");
@@ -454,6 +475,17 @@ dump_node_opcode(FILE *F, ir_node *n)
     else                       fprintf(F, "%s", get_irn_opname(n));
   } break;
 
+  case iro_Proj: {
+    ir_node *cond = get_Proj_pred(n);
+
+    if (get_irn_opcode(cond) == iro_Cond
+        && get_Proj_proj(n) == get_Cond_defaultProj(cond)
+       && get_irn_mode(get_Cond_selector(cond)) != mode_b)
+      fprintf (F, "defProj");
+    else
+      fprintf (F, "%s", get_irn_opname(n));
+  } break;
+
   case iro_Start: {
     if (interprocedural_view) {
       fprintf(F, "%s %s", get_irn_opname(n), get_ent_dump_name(get_irg_ent(get_irn_irg(n))));
@@ -469,9 +501,11 @@ dump_node_opcode(FILE *F, ir_node *n)
   return bad;
 }
 
-static INLINE void
+static INLINE int
 dump_node_mode (ir_node *n)
 {
+  int bad = 0;
+
   switch (get_irn_opcode(n)) {
   case iro_Phi:
   case iro_Const:
@@ -491,11 +525,12 @@ dump_node_mode (ir_node *n)
   case iro_Abs:
   case iro_Cmp:
   case iro_Confirm:
-    fprintf (F, "%s", get_mode_name(get_irn_mode(n)));
+    fprintf (F, "%s", get_mode_name_ex(get_irn_mode(n), &bad));
     break;
   default:
     ;
   }
+  return bad;
 }
 
 static int dump_node_typeinfo(ir_node *n) {
@@ -595,6 +630,7 @@ static INLINE int dump_node_info(ir_node *n)
   fprintf (F, " info1: \"");
   if (opt_dump_pointer_values_to_info)
     fprintf (F, "addr:    %p \n", (void *)n);
+  fprintf (F, "mode:    %s\n", get_mode_name(get_irn_mode(n)));
   fprintf (F, "visited: %ld \n", get_irn_visited(n));
   irg = get_irn_irg(n);
   if (irg != get_const_code_irg())
@@ -611,6 +647,15 @@ static INLINE int dump_node_info(ir_node *n)
   }
   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: {
@@ -745,7 +790,7 @@ static void dump_const_node_local(ir_node *n) {
       fprintf(F, "node: {title: "); PRINT_CONSTID(n, con);
       fprintf(F, " label: \"");
       bad |= dump_node_opcode(F, con);
-      dump_node_mode (con);
+      bad |= dump_node_mode (con);
       bad |= dump_node_typeinfo(con);
       fprintf (F, " ");
       bad |= dump_node_nodeattr(con);
@@ -777,7 +822,7 @@ static void dump_node(ir_node *n)
 
   bad = ! irn_vrfy_irg_dump(n, current_ir_graph, &p);
   bad |= dump_node_opcode(F, n);
-  dump_node_mode (n);
+  bad |= dump_node_mode (n);
   bad |= dump_node_typeinfo(n);
   fprintf(F, " ");
   bad |= dump_node_nodeattr(n);
@@ -788,7 +833,7 @@ static void dump_node(ir_node *n)
   dump_node_vcgattr(n, bad);
   fprintf(F, "}\n");
   dump_const_node_local(n);
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
   dump_chi_term(F, n);
   dump_state(F, n);
 #endif
@@ -807,7 +852,24 @@ dump_ir_block_edge(ir_node *n)  {
   }
 }
 
-static void print_edge_vcgattr(ir_node *from, int to) {
+static void
+print_data_edge_vcgattr(FILE *F, ir_node *from, int to) {
+  if (get_nodes_block(from) == get_nodes_block(get_irn_n(from, to)))
+    fprintf (F, INTRA_DATA_EDGE_ATTR);
+  else
+    fprintf (F, INTER_DATA_EDGE_ATTR);
+}
+
+static void
+print_mem_edge_vcgattr(FILE *F, ir_node *from, int to) {
+  if (get_nodes_block(from) == get_nodes_block(get_irn_n(from, to)))
+    fprintf (F, INTRA_MEM_EDGE_ATTR);
+  else
+    fprintf (F, INTER_MEM_EDGE_ATTR);
+}
+
+static void
+print_edge_vcgattr(ir_node *from, int to) {
   assert(from);
 
   if (dump_backedge_information_flag && is_backedge(from, to))
@@ -823,56 +885,79 @@ static void print_edge_vcgattr(ir_node *from, int to) {
       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, MEM_EDGE_ATTR);
+    fprintf (F, INTER_MEM_EDGE_ATTR);
     }
     break;
-  case iro_EndReg: break;
-  case iro_EndExcept: break;
-  case iro_Jmp:     break;
-  case iro_Break:   break;
-  case iro_Cond:    break;
+  case iro_EndReg:
+  case iro_EndExcept:
+  case iro_Jmp:
+  case iro_Break:
+  case iro_Cond:
+    print_data_edge_vcgattr(F, from, to);
+    break;
   case iro_Return:
   case iro_Raise:
-    if (to == 0) fprintf (F, MEM_EDGE_ATTR);
+    if (to == 0)
+      print_mem_edge_vcgattr(F, from, to);
+    else
+      print_data_edge_vcgattr(F, from, to);
+    break;
+  case iro_Const:
+  case iro_SymConst:
+    print_data_edge_vcgattr(F, from, to);
     break;
-  case iro_Const:   break;
-  case iro_SymConst:break;
   case iro_Sel:
   case iro_Call:
-    if (to == 0) fprintf (F, MEM_EDGE_ATTR);
+    if (to == 0)
+      print_mem_edge_vcgattr(F, from, to);
+    else
+      print_data_edge_vcgattr(F, from, to);
+    break;
+  case iro_CallBegin:
+  case iro_Add:
+  case iro_Sub:
+  case iro_Minus:
+  case iro_Mul:
+    print_data_edge_vcgattr(F, from, to);
     break;
-  case iro_CallBegin: break;
-  case iro_Add:     break;
-  case iro_Sub:     break;
-  case iro_Minus:   break;
-  case iro_Mul:     break;
   case iro_Quot:
   case iro_DivMod:
   case iro_Div:
   case iro_Mod:
-    if (to == 0) fprintf (F, MEM_EDGE_ATTR);
+    if (to == 0)
+      print_mem_edge_vcgattr(F, from, to);
+    else
+      print_data_edge_vcgattr(F, from, to);
+    break;
+  case iro_Abs:
+  case iro_And:
+  case iro_Or:
+  case iro_Eor:
+  case iro_Shl:
+  case iro_Shr:
+  case iro_Shrs:
+  case iro_Rot:
+  case iro_Cmp:
+  case iro_Conv:
+      print_data_edge_vcgattr(F, from, to);
     break;
-  case iro_Abs:    break;
-  case iro_And:    break;
-  case iro_Or:     break;
-  case iro_Eor:    break;
-  case iro_Shl:    break;
-  case iro_Shr:    break;
-  case iro_Shrs:   break;
-  case iro_Rot:    break;
-  case iro_Cmp:    break;
-  case iro_Conv:   break;
   case iro_Phi:
-    if (get_irn_modecode(from) == irm_M) fprintf (F, MEM_EDGE_ATTR);
+    if (get_irn_modecode(from) == irm_M)
+      fprintf (F, INTER_MEM_EDGE_ATTR);
+    else
+      print_data_edge_vcgattr(F, from, to);
     break;
   case iro_Load:
   case iro_Store:
   case iro_Alloc:
   case iro_Free:
-    if (to == 0) fprintf (F, MEM_EDGE_ATTR);
+    if (to == 0)
+      print_mem_edge_vcgattr(F, from, to);
+    else
+      print_data_edge_vcgattr(F, from, to);
     break;
   case iro_Sync:
-    fprintf (F, MEM_EDGE_ATTR);
+    print_mem_edge_vcgattr(F, from, to);
     break;
   case iro_Tuple:  break;
   case iro_Proj:
@@ -882,14 +967,27 @@ static void print_edge_vcgattr(ir_node *from, int to) {
       fprintf (F, CF_EDGE_ATTR);
       break;
     case irm_M:
-      fprintf (F, MEM_EDGE_ATTR);
+      fprintf (F, INTER_MEM_EDGE_ATTR);
+      break;
+    default:
+      print_data_edge_vcgattr(F, from, to);
       break;
-    default: break;
     }
     break;
-  case iro_Bad:    break;
+  case iro_Bad:     break;
   case iro_Unknown: break;
-  case iro_Id:     break;
+  case iro_Id:
+    switch (get_irn_modecode(from)) {
+    case irm_M:
+      fprintf (F, INTRA_MEM_EDGE_ATTR);
+      break;
+    case irm_X:
+      fprintf (F, CF_EDGE_ATTR);
+      break;
+    default:
+      print_data_edge_vcgattr(F, from, to);
+      break;
+    } break;
   default:
     ;
   }
@@ -984,7 +1082,7 @@ dump_whole_block(ir_node *block) {
   fprintf(F, "\"  label: \"");
   dump_node_opcode(F, block);
   fprintf (F, " %ld", get_irn_node_nr(block));
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
   if (get_opt_dump_abstvals())
     fprintf (F, " seqno: %d", (int)get_Block_seqno(block));
 #endif
@@ -1003,7 +1101,7 @@ dump_whole_block(ir_node *block) {
   /* Close the vcg information for the block */
   fprintf(F, "}\n");
   dump_const_node_local(block);
-#ifdef HEAPANAL
+#if DO_HEAPANALYSIS
   dump_chi_term(F, block);
 #endif
   fprintf(F, "\n");
@@ -1066,8 +1164,8 @@ static void dump_node2type_edges (ir_node *n, void *env)
     /* @@@ some consts have an entity */
     break;
   case iro_SymConst:
-    if (   (get_SymConst_kind(n) == type_tag)
-       || (get_SymConst_kind(n) == size))
+    if (   (get_SymConst_kind(n) ==symconst_type_tag)
+       || (get_SymConst_kind(n) ==symconst_size))
       {
     print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR);
       }
@@ -1093,15 +1191,19 @@ static void dump_node2type_edges (ir_node *n, void *env)
 }
 
 
-static void print_type_info(type *tp) {
+static int print_type_info(type *tp) {
+  int bad = 0;
+
   if (get_type_state(tp) == layout_undefined) {
     fprintf(F, "state: layout_undefined\n");
   } else {
     fprintf(F, "state: layout_fixed,\n");
   }
   if (get_type_mode(tp))
-    fprintf(F, "mode: %s,\n", get_mode_name(get_type_mode(tp)));
-  fprintf(F, "size: %dB,\n", get_type_size(tp));
+    fprintf(F, "mode: %s,\n", get_mode_name_ex(get_type_mode(tp), &bad));
+  fprintf(F, "size: %db,\n", get_type_size_bits(tp));
+
+  return bad;
 }
 
 static void print_typespecific_info(type *tp) {
@@ -1182,7 +1284,7 @@ static int print_type_node(type *tp)
   PRINT_TYPEID(tp);
   fprintf (F, " label: \"%s %s\"", get_type_tpop_name(tp), get_type_name_ex(tp, &bad));
   fprintf (F, " info1: \"");
-  print_type_info(tp);
+  bad |= print_type_info(tp);
   print_typespecific_info(tp);
   fprintf (F, "\"");
   print_typespecific_vcgattr(tp);
@@ -1230,10 +1332,10 @@ void dump_entity_node(entity *ent)
     X(volatility_is_volatile);
   }
 
-  fprintf(F, "\npeculiarity: %s", get_peculiarity_string(get_entity_peculiarity(ent)));
-  fprintf(F, "\nname:    %s\nld_name: %s",
+  fprintf(F, "\npeculiarity:  %s", get_peculiarity_string(get_entity_peculiarity(ent)));
+  fprintf(F, "\nname:         %s\nld_name:      %s",
       get_entity_name(ent), ent->ld_name ? get_entity_ld_name(ent) : "no yet set");
-  fprintf(F, "\noffset:  %d", get_entity_offset(ent));
+  fprintf(F, "\noffset(bits): %d", get_entity_offset_bits(ent));
   if (is_method_type(get_entity_type(ent))) {
     if (get_entity_irg(ent))   /* can be null */
       { fprintf (F, "\nirg = "); PRINT_IRGID(get_entity_irg(ent)); }
@@ -1255,7 +1357,7 @@ static void dump_enum_item(type *tp, int pos)
   PRINT_ITEMID(tp, pos); fprintf(F, "\"");
   fprintf (F, DEFAULT_ENUM_ITEM_ATTRIBUTE);
   fprintf (F, "label: ");
-  fprintf (F, "\"enum item %s\" " ENUM_ITEM_NODE_ATTR, id_to_str(id));
+  fprintf (F, "\"enum item %s\" " ENUM_ITEM_NODE_ATTR, get_id_str(id));
   fprintf (F, "\n info1: \"value: %s\"}\n", buf);
 }
 
@@ -1558,22 +1660,24 @@ dump_vcg_header(const char *name, const char *orientation) {
        "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 1:  \"intrablock Data\"\n"
+       "classname 16: \"interblock Data\"\n"
+       "classname 2:  \"Block\"\n"
+       "classname 13: \"Control Flow\"\n"
+       "classname 14: \"intrablock Memory\"\n"
+       "classname 17: \"interblock 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 1: \"Attribute\"\n"
        "infoname 2: \"Verification errors\"\n",
        name, label, orientation);
 
@@ -1591,7 +1695,7 @@ static void vcg_open (ir_graph *irg, char * suffix1, char *suffix2) {
   /** open file for vcg graph */
   fname = malloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5);
 
-  //strncpy (fname, nm, len);      /* copy the filename */
+  /* strncpy (fname, nm, len); */     /* copy the filename */
   j = 0;
   for (i = 0; i < len; ++i) {  /* replase '/' in the name: escape by @. */
     if (nm[i] == '/') {
@@ -1621,7 +1725,7 @@ static void vcg_open_name (const char *name, char *suffix) {
 
   /** open file for vcg graph */
   fname = malloc (len * 2 + 5 + strlen(suffix));
-  //strcpy (fname, name);    /* copy the filename */
+  /* strcpy (fname, name);*/    /* copy the filename */
   j = 0;
   for (i = 0; i < len; ++i) {  /* replase '/' in the name: escape by @. */
     if (name[i] == '/') {
@@ -1671,7 +1775,7 @@ dump_ir_graph (ir_graph *irg)
   char *suffix;
   rem = current_ir_graph;
 
-  if(strncmp(get_irg_dump_name(irg),dump_file_filter,strlen(dump_file_filter))!=0) return;
+  if(strncmp(get_entity_name(get_irg_ent(irg)),dump_file_filter,strlen(dump_file_filter))!=0) return;
 
   current_ir_graph = irg;
   if (interprocedural_view) suffix = "-pure-ip";
@@ -1700,7 +1804,7 @@ dump_ir_block_graph (ir_graph *irg)
   int i;
   char *suffix;
 
-  if(strncmp(get_irg_dump_name(irg),dump_file_filter,strlen(dump_file_filter))!=0) return;
+  if(strncmp(get_entity_name(get_irg_ent(irg)),dump_file_filter,strlen(dump_file_filter))!=0) return;
 
   if (interprocedural_view) suffix = "-ip";
   else                      suffix = "";
@@ -1964,7 +2068,7 @@ void dump_all_ir_graphs (dump_graph_func *dmp_grph) {
 
 
 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;
 
@@ -1973,13 +2077,12 @@ void dump_loops_standalone (ir_loop *loop) {
 
   /* Dump the loop elements. */
 
-  if (get_kind(son) == k_ir_loop)
+  for(i = 0; i < get_loop_n_elements(loop); i++)
     {
-      /* We are a loop son -> Recurse */
       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. */
@@ -1998,6 +2101,7 @@ void dump_loops_standalone (ir_loop *loop) {
         /* We are a loop node -> Collect firm nodes */
 
         ir_node *n = le.node;
+       int bad = 0;
 
         if (!loop_node_started) {
           /* Start a new node which contains all firm nodes of the current loop */
@@ -2010,11 +2114,11 @@ void dump_loops_standalone (ir_loop *loop) {
         else
           fprintf(F, "\n");
 
-        dump_node_opcode(F, n);
-        dump_node_mode (n);
-        dump_node_typeinfo(n);
+        bad |= dump_node_opcode(F, n);
+        bad |= dump_node_mode (n);
+        bad |= dump_node_typeinfo(n);
         fprintf (F, " ");
-        dump_node_nodeattr(n);
+        bad |= dump_node_nodeattr(n);
         fprintf (F, " %ld", get_irn_node_nr(n));
       }
     }
@@ -2036,6 +2140,7 @@ void dump_loop_tree(ir_graph *irg, char *suffix)
   int el_rem = edge_label;
   edge_label = 1;
 
+  /* @@@ AS: What does that do? */
   if(strncmp(get_irg_dump_name(irg),dump_file_filter,strlen(dump_file_filter))!=0) return;
 
   current_ir_graph = irg;