new dumper for partial graph
[libfirm] / ir / ir / irdumptxt.c
index 2ed06ed..03288b7 100644 (file)
@@ -125,7 +125,7 @@ int dump_irnode_to_file(FILE *F, ir_node *n) {
 
   if ((get_irp_ip_view_state() != ip_view_no)
       && (get_irn_opcode(n) == iro_Filter || get_irn_opcode(n) == iro_Block)) {
-    fprintf(F, "  inter arity: %d", get_irn_inter_arity(n));
+    fprintf(F, "  inter arity: %d\n", get_irn_inter_arity(n));
     fprintf(F, "  inter pred nodes: \n");
     for ( i = 0; i < get_irn_inter_arity(n); ++i) {
       fprintf(F, "     %d: %s ", i, is_intra_backedge(n, i) ? "be" : "  ");
@@ -150,20 +150,20 @@ int dump_irnode_to_file(FILE *F, ir_node *n) {
     fprintf(F, "\n");
   }
 
-  /* Loop node   Someone else please tell me what's wrong ...
+  /* 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",
+    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_Block: {
-    fprintf(F, "  block visited: %ld", get_Block_block_visited(n));
-    fprintf(F, "  dominator info: not implemented\n");
+    fprintf(F, "  block visited: %ld\n", get_Block_block_visited(n));
+    fprintf(F, "  dominator info: output not implemented\n");
     /* not dumped: graph_arr */
     /* not dumped: mature    */
   }  break;
@@ -380,9 +380,11 @@ int addr_is_alloc(ir_node *acc) {
 #define X(a)    case a: fprintf(F, #a); break
 void    dump_entity_to_file_prefix (FILE *F, entity *ent, char *prefix, unsigned verbosity) {
   int i, j;
-  assert(ent && ent->kind == k_entity);
-  type *owner = get_entity_owner(ent);
-  type *type  = get_entity_type(ent);
+  type *owner, *type;
+
+  assert(is_entity(ent));
+  owner = get_entity_owner(ent);
+  type  = get_entity_type(ent);
   if (verbosity & dump_verbosity_onlynames) {
     fprintf(F, "%sentity %s.%s (%ld)\n", prefix, get_type_name(get_entity_owner(ent)),
            get_entity_name(ent), get_entity_nr(ent));
@@ -396,24 +398,24 @@ void    dump_entity_to_file_prefix (FILE *F, entity *ent, char *prefix, unsigned
 
     if (is_class_type(get_entity_owner(ent))) {
       if (get_entity_n_overwrites(ent) > 0) {
-       fprintf(F, "%s  overwrites:\n", prefix);
-       for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
-         entity *ov = get_entity_overwrites(ent, i);
-         fprintf(F, "%s    %d: %s of class %s\n", prefix, i, get_entity_name(ov),
-                 get_type_name(get_entity_owner(ov)));
-       }
+           fprintf(F, "%s  overwrites:\n", prefix);
+           for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
+             entity *ov = get_entity_overwrites(ent, i);
+             fprintf(F, "%s    %d: %s of class %s\n", prefix, i, get_entity_name(ov),
+                     get_type_name(get_entity_owner(ov)));
+           }
       } else {
-       fprintf(F, "%s  Does not overwrite other entities. \n", prefix);
+           fprintf(F, "%s  Does not overwrite other entities. \n", prefix);
       }
       if (get_entity_n_overwrittenby(ent) > 0) {
-       fprintf(F, "%s  overwritten by:\n", prefix);
-       for (i = 0; i < get_entity_n_overwrittenby(ent); ++i) {
-         entity *ov = get_entity_overwrittenby(ent, i);
-         fprintf(F, "%s    %d: %s of class %s\n", prefix, i, get_entity_name(ov),
-                 get_type_name(get_entity_owner(ov)));
+           fprintf(F, "%s  overwritten by:\n", prefix);
+           for (i = 0; i < get_entity_n_overwrittenby(ent); ++i) {
+             entity *ov = get_entity_overwrittenby(ent, i);
+             fprintf(F, "%s    %d: %s of class %s\n", prefix, i, get_entity_name(ov),
+                     get_type_name(get_entity_owner(ov)));
        }
       } else {
-       fprintf(F, "%s  Is not overwritten by other entities. \n", prefix);
+           fprintf(F, "%s  Is not overwritten by other entities. \n", prefix);
       }
     }
 
@@ -508,6 +510,14 @@ void    dump_entity_to_file_prefix (FILE *F, entity *ent, char *prefix, unsigned
   if (verbosity & dump_verbosity_accessStats) {
     int n_acc = get_entity_n_accesses(ent);
     int max_depth = 0;
+    int max_L_freq = -1;
+    int max_S_freq = -1;
+    int max_LA_freq = -1;
+    int max_SA_freq = -1;
+    int *L_freq;
+    int *S_freq;
+    int *LA_freq;
+    int *SA_freq;
 
     /* Find maximal depth */
     for (i = 0; i < n_acc; ++i) {
@@ -516,53 +526,45 @@ void    dump_entity_to_file_prefix (FILE *F, entity *ent, char *prefix, unsigned
       max_depth = (depth > max_depth) ? depth : max_depth ;
     }
 
-    int L_freq[max_depth];
-    int max_L_freq = -1;
-    int S_freq[max_depth];
-    int max_S_freq = -1;
-    int LA_freq[max_depth];
-    int max_LA_freq = -1;
-    int SA_freq[max_depth];
-    int max_SA_freq = -1;
-    for (i = 0; i < max_depth; ++i) {
-      L_freq[i] = 0;
-      LA_freq[i] = 0;
-      S_freq[i] = 0;
-      SA_freq[i] = 0;
-    }
+    L_freq = xcalloc(4 * max_depth, sizeof(L_freq[0]));
+
+    S_freq  = L_freq + 1*max_depth;
+    LA_freq = L_freq + 2*max_depth;
+    SA_freq = L_freq + 3*max_depth;
 
     for (i = 0; i < n_acc; ++i) {
       ir_node *acc = get_entity_access(ent, i);
       int depth = get_weighted_loop_depth(acc);
       assert(depth < max_depth);
       if ((get_irn_op(acc) == op_Load) || (get_irn_op(acc) == op_Call)) {
-       L_freq[depth]++;
-       max_L_freq = (depth > max_L_freq) ? depth : max_L_freq;
-       if (addr_is_alloc(acc)) {
-         LA_freq[depth]++;
-         max_LA_freq = (depth > max_LA_freq) ? depth : max_LA_freq;
-       }
+           L_freq[depth]++;
+           max_L_freq = (depth > max_L_freq) ? depth : max_L_freq;
+           if (addr_is_alloc(acc)) {
+             LA_freq[depth]++;
+             max_LA_freq = (depth > max_LA_freq) ? depth : max_LA_freq;
+           }
       } else if (get_irn_op(acc) == op_Store) {
-       S_freq[depth]++;
-       max_S_freq = (depth > max_S_freq) ? depth : max_S_freq;
-       if (addr_is_alloc(acc)) {
-         SA_freq[depth]++;
-         max_SA_freq = (depth > max_SA_freq) ? depth : max_SA_freq;
-       }
+           S_freq[depth]++;
+           max_S_freq = (depth > max_S_freq) ? depth : max_S_freq;
+           if (addr_is_alloc(acc)) {
+             SA_freq[depth]++;
+             max_SA_freq = (depth > max_SA_freq) ? depth : max_SA_freq;
+           }
       } else {
-       assert(0);
+           assert(0);
       }
     }
 
     if (max_L_freq >= 0) {
-      fprintf(F, "%s  Load  Stats", prefix);
       char comma = ':';
+
+      fprintf(F, "%s  Load  Stats", prefix);
       for (i = 0; i <= max_L_freq; ++i) {
-       if (L_freq[i])
-         fprintf(F, "%c %d x  L%d", comma, L_freq[i], i);
-       else
-         fprintf(F, "         ");
-       comma = ',';
+           if (L_freq[i])
+             fprintf(F, "%c %d x  L%d", comma, L_freq[i], i);
+           else
+             fprintf(F, "         ");
+           comma = ',';
       }
       fprintf(F, "\n");
     }
@@ -570,23 +572,24 @@ void    dump_entity_to_file_prefix (FILE *F, entity *ent, char *prefix, unsigned
       //fprintf(F, "%s  LoadA Stats", prefix);
       char comma = ':';
       for (i = 0; i <= max_LA_freq; ++i) {
-       //if (LA_freq[i])
-         //fprintf(F, "%c %d x LA%d", comma, LA_freq[i], i);
-         //else
-         //fprintf(F, "         ");
-       comma = ',';
+           //if (LA_freq[i])
+             //fprintf(F, "%c %d x LA%d", comma, LA_freq[i], i);
+             //else
+             //fprintf(F, "         ");
+           comma = ',';
       }
       fprintf(F, "\n");
     }
     if (max_S_freq >= 0) {
-      fprintf(F, "%s  Store Stats", prefix);
       char comma = ':';
+
+      fprintf(F, "%s  Store Stats", prefix);
       for (i = 0; i <= max_S_freq; ++i) {
-       if (S_freq[i])
-         fprintf(F, "%c %d x  S%d", comma, S_freq[i], i);
-       else
-         fprintf(F, "         ");
-       comma = ',';
+           if (S_freq[i])
+             fprintf(F, "%c %d x  S%d", comma, S_freq[i], i);
+           else
+             fprintf(F, "         ");
+           comma = ',';
       }
       fprintf(F, "\n");
     }
@@ -594,14 +597,17 @@ void    dump_entity_to_file_prefix (FILE *F, entity *ent, char *prefix, unsigned
       //fprintf(F, "%s  StoreAStats", prefix);
       char comma = ':';
       for (i = 0; i <= max_SA_freq; ++i) {
-       //if (SA_freq[i])
-         //fprintf(F, "%c %d x SA%d", comma, SA_freq[i], i);
-       //else
-         //fprintf(F, "         ");
-       comma = ',';
+           //if (SA_freq[i])
+             //fprintf(F, "%c %d x SA%d", comma, SA_freq[i], i);
+           //else
+             //fprintf(F, "         ");
+           comma = ',';
       }
       fprintf(F, "\n");
     }
+
+    /* free allocated space */
+    free(L_freq);
   }
 
 }
@@ -620,6 +626,14 @@ void    dump_entitycsv_to_file_prefix (FILE *F, entity *ent, char *prefix, unsig
                                       int *max_disp, int disp[], const char *comma) {
   int i, max_depth = 0;
   int n_acc = get_entity_n_accesses(ent);
+  int max_L_freq = -1;
+  int max_S_freq = -1;
+  int max_LA_freq = -1;
+  int max_SA_freq = -1;
+  int *L_freq;
+  int *S_freq;
+  int *LA_freq;
+  int *SA_freq;
 
   /* Find maximal depth */
   for (i = 0; i < n_acc; ++i) {
@@ -628,20 +642,11 @@ void    dump_entitycsv_to_file_prefix (FILE *F, entity *ent, char *prefix, unsig
     max_depth = (depth > max_depth) ? depth : max_depth ;
   }
 
-  int L_freq[max_depth];
-  int max_L_freq = -1;
-  int S_freq[max_depth];
-  int max_S_freq = -1;
-  int LA_freq[max_depth];
-  int max_LA_freq = -1;
-  int SA_freq[max_depth];
-  int max_SA_freq = -1;
-  for (i = 0; i < max_depth; ++i) {
-    L_freq[i] = 0;
-    LA_freq[i] = 0;
-    S_freq[i] = 0;
-    SA_freq[i] = 0;
-  }
+  L_freq = xcalloc(4 * max_depth, sizeof(L_freq[0]));
+
+  S_freq  = L_freq + 1*max_depth;
+  LA_freq = L_freq + 2*max_depth;
+  SA_freq = L_freq + 3*max_depth;
 
   for (i = 0; i < n_acc; ++i) {
     ir_node *acc = get_entity_access(ent, i);
@@ -651,50 +656,56 @@ void    dump_entitycsv_to_file_prefix (FILE *F, entity *ent, char *prefix, unsig
       L_freq[depth]++;
       max_L_freq = (depth > max_L_freq) ? depth : max_L_freq;
       if (addr_is_alloc(acc)) {
-       LA_freq[depth]++;
-       max_LA_freq = (depth > max_LA_freq) ? depth : max_LA_freq;
+           LA_freq[depth]++;
+           max_LA_freq = (depth > max_LA_freq) ? depth : max_LA_freq;
       }
       if (get_entity_allocation(ent) == allocation_static) {
-       disp[depth]++;
-       *max_disp = (depth > *max_disp) ? depth : *max_disp;
+           disp[depth]++;
+           *max_disp = (depth > *max_disp) ? depth : *max_disp;
       }
     } else if (get_irn_op(acc) == op_Store) {
       S_freq[depth]++;
       max_S_freq = (depth > max_S_freq) ? depth : max_S_freq;
       if (addr_is_alloc(acc)) {
-       SA_freq[depth]++;
-       max_SA_freq = (depth > max_SA_freq) ? depth : max_SA_freq;
+           SA_freq[depth]++;
+           max_SA_freq = (depth > max_SA_freq) ? depth : max_SA_freq;
       }
       if (get_entity_allocation(ent) == allocation_static) {
-       assert(0);
+           assert(0);
       }
     } else {
       assert(0);
     }
   }
 
-  if (get_entity_allocation(ent) == allocation_static) return;
+  if (get_entity_allocation(ent) != allocation_static) {
 
-  fprintf(F, "%s_%s", get_type_name(get_entity_owner(ent)), get_entity_name(ent));
+    fprintf(F, "%s_%s", get_type_name(get_entity_owner(ent)), get_entity_name(ent));
 
-  if (max_L_freq >= 0) {
-    fprintf(F, "%s Load", comma);
-    for (i = 0; i <= max_L_freq; ++i) {
-      fprintf(F, "%s %d", comma, L_freq[i]);
+    if (max_L_freq >= 0) {
+      fprintf(F, "%s Load", comma);
+      for (i = 0; i <= max_L_freq; ++i) {
+        fprintf(F, "%s %d", comma, L_freq[i]);
+      }
     }
-  }
-  if (max_S_freq >= 0) {
-    if (max_L_freq >= 0)    fprintf(F, "\n%s_%s", get_type_name(get_entity_owner(ent)), get_entity_name(ent));
-    fprintf(F, "%s Store", comma);
-    for (i = 0; i <= max_S_freq; ++i) {
-      fprintf(F, "%s %d", comma, S_freq[i]);
+    if (max_S_freq >= 0) {
+      if (max_L_freq >= 0)    fprintf(F, "\n%s_%s", get_type_name(get_entity_owner(ent)), get_entity_name(ent));
+      fprintf(F, "%s Store", comma);
+      for (i = 0; i <= max_S_freq; ++i) {
+        fprintf(F, "%s %d", comma, S_freq[i]);
+      }
     }
+    fprintf(F, "\n");
   }
-  fprintf(F, "\n");
+  free(L_freq);
 }
 
 /* A fast hack to dump a csv. */
 void dump_typecsv_to_file(FILE *F, type *tp, dump_verbosity verbosity, const char *comma) {
+  int max_freq = -1;
+  int max_disp = -1;
+  int *freq, *disp; /* Accumulated accesses to static members: dispatch table. */
+
   if (!is_class_type(tp)) return;
 
   if (verbosity & dump_verbosity_accessStats) {
@@ -708,14 +719,9 @@ void dump_typecsv_to_file(FILE *F, type *tp, dump_verbosity verbosity, const cha
       max_depth = (depth > max_depth) ? depth : max_depth ;
     }
 
-    int freq[max_depth];
-    int max_freq = -1;
-    int disp[max_depth];   /* Accumulated accesses to static members: dispatch table. */
-    int max_disp = -1;
-    for (i = 0; i < max_depth; ++i) {
-      freq[i] = 0;
-      disp[i] = 0;
-    }
+    freq = xcalloc(2 * max_depth, sizeof(freq[0]));
+
+    disp = freq + max_depth;
 
     for (i = 0; i < n_all; ++i) {
       ir_node *all = get_type_allocation(tp, i);
@@ -731,7 +737,7 @@ void dump_typecsv_to_file(FILE *F, type *tp, dump_verbosity verbosity, const cha
 
     if (max_freq >= 0) {
       for (i = 0; i <= max_freq; ++i) {
-       fprintf(F, "%s %d", comma, freq[i]);
+           fprintf(F, "%s %d", comma, freq[i]);
       }
     }
     fprintf(F, "\n");
@@ -739,18 +745,21 @@ void dump_typecsv_to_file(FILE *F, type *tp, dump_verbosity verbosity, const cha
     for (i = 0; i < get_class_n_members(tp); ++i) {
       entity *mem = get_class_member(tp, i);
       if (((verbosity & dump_verbosity_methods) &&  is_method_type(get_entity_type(mem))) ||
-         ((verbosity & dump_verbosity_fields)  && !is_method_type(get_entity_type(mem)))   ) {
-       dump_entitycsv_to_file_prefix(F, mem, "    ", verbosity, &max_disp, disp, comma);
+             ((verbosity & dump_verbosity_fields)  && !is_method_type(get_entity_type(mem)))   ) {
+           dump_entitycsv_to_file_prefix(F, mem, "    ", verbosity, &max_disp, disp, comma);
       }
     }
 
     if (max_disp >= 0) {
       fprintf(F, "%s__disp_tab%s Load", get_type_name(tp), comma);
       for (i = 0; i <= max_disp; ++i) {
-       fprintf(F, "%s %d", comma, disp[i]);
+           fprintf(F, "%s %d", comma, disp[i]);
       }
       fprintf(F, "\n");
     }
+
+    /* free allocated space */
+    free(freq);
   }
 }
 
@@ -778,20 +787,20 @@ void dump_type_to_file (FILE *F, type *tp, dump_verbosity verbosity) {
     for (i = 0; i < get_class_n_members(tp); ++i) {
       entity *mem = get_class_member(tp, i);
       if (((verbosity & dump_verbosity_methods) &&  is_method_type(get_entity_type(mem))) ||
-         ((verbosity & dump_verbosity_fields)  && !is_method_type(get_entity_type(mem)))   ) {
-       dump_entity_to_file_prefix(F, mem, "    ", verbosity);
+             ((verbosity & dump_verbosity_fields)  && !is_method_type(get_entity_type(mem)))   ) {
+           dump_entity_to_file_prefix(F, mem, "    ", verbosity);
       }
     }
     if (verbosity & dump_verbosity_typeattrs) {
       fprintf(F, "  supertypes: ");
       for (i = 0; i < get_class_n_supertypes(tp); ++i) {
-       type *stp = get_class_supertype(tp, i);
-       fprintf(F, "\n    %s", get_type_name(stp));
+           type *stp = get_class_supertype(tp, i);
+           fprintf(F, "\n    %s", get_type_name(stp));
       }
       fprintf(F, "\n  subtypes: ");
       for (i = 0; i < get_class_n_subtypes(tp); ++i) {
-       type *stp = get_class_subtype(tp, i);
-       fprintf(F, "\n    %s", get_type_name(stp));
+           type *stp = get_class_subtype(tp, i);
+           fprintf(F, "\n    %s", get_type_name(stp));
       }
 
       fprintf(F, "\n  peculiarity: %s", get_peculiarity_string(get_class_peculiarity(tp)));
@@ -804,7 +813,7 @@ void dump_type_to_file (FILE *F, type *tp, dump_verbosity verbosity) {
     for (i = 0; i < get_compound_n_members(tp); ++i) {
       entity *mem = get_compound_member(tp, i);
       if (verbosity & dump_verbosity_fields) {
-       dump_entity_to_file_prefix(F, mem, "    ", verbosity);
+           dump_entity_to_file_prefix(F, mem, "    ", verbosity);
       }
     }
     break;
@@ -826,6 +835,8 @@ void dump_type_to_file (FILE *F, type *tp, dump_verbosity verbosity) {
   if (verbosity & dump_verbosity_accessStats) {
     int n_all = get_type_n_allocations(tp);
     int max_depth = 0;
+    int max_freq = -1;
+    int *freq;
 
     /* Find maximal depth */
     for (i = 0; i < n_all; ++i) {
@@ -834,9 +845,7 @@ void dump_type_to_file (FILE *F, type *tp, dump_verbosity verbosity) {
       max_depth = (depth > max_depth) ? depth : max_depth ;
     }
 
-    int freq[max_depth];
-    int max_freq = -1;
-    for (i = 0; i < max_depth; ++i) freq[i] = 0;
+    freq = xcalloc(max_depth, sizeof(freq[0]));
 
     for (i = 0; i < n_all; ++i) {
       ir_node *all = get_type_allocation(tp, i);
@@ -848,14 +857,17 @@ void dump_type_to_file (FILE *F, type *tp, dump_verbosity verbosity) {
     }
 
     if (max_freq >= 0) {
-      fprintf(F, "  Alloc Stats");
       char comma = ':';
+
+      fprintf(F, "  Alloc Stats");
       for (i = 0; i <= max_freq; ++i) {
-       fprintf(F, "%c %d x A%d", comma, freq[i], i);
-       comma = ',';
+           fprintf(F, "%c %d x A%d", comma, freq[i], i);
+           comma = ',';
       }
       fprintf(F, "\n");
     }
+
+    free(freq);
   }
 
   fprintf(F, "\n\n");