Fixed optimization of Div/Mod/DivMod nodes
[libfirm] / ir / ir / irdump.c
index ff85cd4..5f2c0d7 100644 (file)
@@ -6,7 +6,7 @@
  * Modified by: Goetz Lindenmaier, Hubert Schmidt
  * Created:
  * CVS-ID:      $Id$
- * Copyright:   (c) 1998-2003 Universität Karlsruhe
+ * Copyright:   (c) 1998-2003 Universitt Karlsruhe
  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
  */
 #ifdef HAVE_CONFIG_H
 #include "type_or_entity.h"
 #include "irouts.h"
 #include "irdom.h"
-#include "irloop.h"
+#include "irloop_t.h"
 #include "callgraph.h"
 #include "irextbb_t.h"
+#include "dbginfo_t.h"
 
 #include "irvrfy.h"
 
@@ -240,12 +241,19 @@ static INLINE void dump_loop_nodes_into_graph(FILE *F, ir_graph *irg);
  */
 static pmap *irdump_link_map = NULL;
 
-/** Creates the link attribut map. */
+/** NOT A STANDARD LIBFIRM INIT METHOD
+ *
+ * We do not want to integrate dumping into libfirm, i.e., if the dumpers
+ * are off, we want to have as few interferences as possible.  Therefore the
+ * initialization is performed lazily and not called from within init_firm.
+ *
+ * Creates the link attribute map. */
 static void init_irdump(void) {
   /* We need a new, empty map. */
   if (irdump_link_map) pmap_destroy(irdump_link_map);
   irdump_link_map = pmap_create();
-  dump_file_filter_id = new_id_from_str("");
+  if (!dump_file_filter_id)
+    dump_file_filter_id = new_id_from_str("");
 }
 /**
  * Returns the private link field.
@@ -443,6 +451,20 @@ bool opt_dump_pointer_values_to_info = 0;  /* default off: for test compares!! *
 
 static const char *overrule_nodecolor = NULL;
 
+/** An additional edge hook. */
+static DUMP_NODE_EDGE_FUNC dump_node_edge_hook = NULL;
+
+void set_dump_node_edge_hook(DUMP_NODE_EDGE_FUNC func)
+{
+    dump_node_edge_hook = func;
+}
+
+DUMP_NODE_EDGE_FUNC get_dump_node_edge_hook(void)
+{
+    return dump_node_edge_hook;
+}
+
+
 /** The vcg attribute hook. */
 static DUMP_NODE_VCGATTR_FUNC dump_node_vcgattr_hook = NULL;
 
@@ -578,10 +600,6 @@ dump_node_opcode(FILE *F, ir_node *n)
         && get_Proj_proj(n) == get_Cond_defaultProj(pred)
         && get_irn_mode(get_Cond_selector(pred)) != mode_b)
       fprintf (F, "defProj");
-/*
- *   else if (get_irn_opcode(pred) == iro_Proj && get_irn_opcode(get_Proj_pred(pred)) == iro_Start)
- *     fprintf (F, "Arg");
- */
     else
       goto default_case;
   } break;
@@ -677,6 +695,7 @@ static INLINE int
 dump_node_nodeattr(FILE *F, ir_node *n)
 {
   int bad = 0;
+  ir_node *pred;
 
   switch (get_irn_opcode(n)) {
   case iro_Start:
@@ -685,11 +704,26 @@ dump_node_nodeattr(FILE *F, ir_node *n)
     }
     break;
   case iro_Proj:
-    if (get_irn_opcode(get_Proj_pred(n)) == iro_Cmp) {
+    pred = get_Proj_pred(n);
+
+    if (get_irn_opcode(pred) == iro_Cmp)
       fprintf (F, "%s ", get_pnc_string(get_Proj_proj(n)));
-    } else {
-      fprintf (F, "%ld ", get_Proj_proj(n));
+    else if (get_irn_opcode(pred) == iro_Start) {
+      switch (get_Proj_proj(n)) {
+      case pn_Start_P_frame_base:
+        fprintf (F, "FrameBase "); break;
+      case pn_Start_P_globals:
+        fprintf (F, "GlobalBase "); break;
+      case pn_Start_P_value_arg_base:
+        fprintf (F, "ValueBase "); break;
+      default:
+        fprintf (F, "%ld ", get_Proj_proj(n));
+      }
     }
+    else if (get_irn_opcode(pred) == iro_Proj && get_irn_opcode(get_Proj_pred(pred)) == iro_Start)
+      fprintf (F, "Arg %ld ", get_Proj_proj(n));
+    else
+      fprintf (F, "%ld ", get_Proj_proj(n));
     break;
   case iro_Filter:
     fprintf (F, "%ld ", get_Filter_proj(n));
@@ -885,6 +919,20 @@ static void INLINE print_node_error(FILE *F, const char *err_msg)
   fprintf (F, " info2: \"%s\"", err_msg);
 }
 
+/**
+ * prints debug messages of a node to file F as info3.
+ */
+static void print_node_dbg_info(FILE *F, dbg_info *dbg)
+{
+  char buf[1024];
+
+  if (__dbg_info_snprint) {
+    buf[0] = '\0';
+    if (__dbg_info_snprint(buf, sizeof(buf), dbg) > 0)
+      fprintf (F, " info3: \"%s\"", buf);
+  }
+}
+
 /**
  * Dump a node
  */
@@ -906,9 +954,13 @@ static void dump_node(FILE *F, ir_node *n)
   fprintf(F, "\" ");
   bad |= dump_node_info(F, n);
   print_node_error(F, p);
+  print_node_dbg_info(F, get_irn_dbg_info(n));
   dump_node_vcgattr(F, n, NULL, bad);
   fprintf(F, "}\n");
   dump_const_node_local(F, 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);
@@ -937,7 +989,11 @@ dump_ir_block_edge(FILE *F, ir_node *n)  {
 
 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)))
+       /*
+        * do not use get_nodes_block() here, will fail
+        * if the irg is not pinned.
+        */
+  if (get_irn_n(from, -1) == get_irn_n(get_irn_n(from, to), -1))
     fprintf (F, INTRA_DATA_EDGE_ATTR);
   else
     fprintf (F, INTER_DATA_EDGE_ATTR);
@@ -945,7 +1001,11 @@ print_data_edge_vcgattr(FILE *F, ir_node *from, int to) {
 
 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)))
+       /*
+        * do not use get_nodes_block() here, will fail
+        * if the irg is not pinned.
+        */
+  if (get_irn_n(from, -1) == get_irn_n(get_irn_n(from, to), -1))
     fprintf (F, INTRA_MEM_EDGE_ATTR);
   else
     fprintf (F, INTER_MEM_EDGE_ATTR);
@@ -1210,7 +1270,7 @@ dump_block_graph(FILE *F, ir_graph *irg) {
     } else {
       /* Nodes that are not in a Block. */
       dump_node(F, node);
-      if (is_Bad(get_nodes_block(node)) && !node_floats(node)) {
+      if (!node_floats(node) && is_Bad(get_nodes_block(node))) {
         dump_const_block_local(F, node);
       }
       dump_ir_data_edges(F, node);
@@ -1788,7 +1848,8 @@ INLINE void dump_vcg_header(FILE *F, const char *name, const char *orientation)
        "classname 11: \"Overwrites\"\n"
        "classname 12: \"Member\"\n"
        "infoname 1: \"Attribute\"\n"
-       "infoname 2: \"Verification errors\"\n",
+       "infoname 2: \"Verification errors\"\n"
+       "infoname 3: \"Debug info\"\n",
        name, label, orientation);
 
   /* don't use all, the range is too whith/black. */