is_irn_always_opt() added
[libfirm] / ir / ir / irdump.c
index f7e2b9a..af5b16e 100644 (file)
@@ -23,6 +23,8 @@
 
 #include "firm_common_t.h"
 
+#include "list.h"
+
 #include "irnode.h"
 #include "irgraph.h"
 #include "irprog_t.h"
@@ -40,6 +42,7 @@
 #include "irloop_t.h"
 #include "callgraph.h"
 #include "irextbb_t.h"
+#include "irhooks.h"
 #include "dbginfo_t.h"
 #include "irtools.h"
 
@@ -108,6 +111,19 @@ DUMP_NODE_EDGE_FUNC get_dump_node_edge_hook(void)
 }
 
 
+static DUMP_NODE_EDGE_FUNC dump_block_edge_hook = NULL;
+
+void set_dump_block_edge_hook(DUMP_NODE_EDGE_FUNC func)
+{
+  dump_block_edge_hook = func;
+}
+
+DUMP_NODE_EDGE_FUNC get_dump_block_edge_hook(void)
+{
+  return dump_node_edge_hook;
+}
+
+
 /** The vcg node attribute hook. */
 static DUMP_IR_GRAPH_FUNC dump_ir_graph_hook = NULL;
 /** The vcg node attribute hook. */
@@ -717,6 +733,11 @@ int dump_node_opcode(FILE *F, ir_node *n)
   case iro_Block:
     fprintf (F, "%s%s", is_Block_dead(n) ? "Dead " : "", get_irn_opname(n));
     break;
+  case iro_Conv:
+    if (get_Conv_strict(n))
+      fprintf (F, "strict");
+    fprintf (F, "%s", get_irn_opname(n));
+    break;
 
   default:
 default_case:
@@ -802,6 +823,7 @@ static const pns_lookup_t start_lut[] = {
   X(X_initial_exec),
   X(P_frame_base),
   X(P_globals),
+  X(P_tls),
   X(T_args),
   X(P_value_arg_base)
 #undef X
@@ -922,7 +944,6 @@ static const pns_lookup_t bound_lut[] = {
   X(M),
   X(X_except),
   X(res),
-  X(M_except)
 #undef X
 };
 
@@ -1112,6 +1133,9 @@ static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad)
   case iro_Psi:
     print_vcg_color(F, ird_color_gold);
     break;
+  case iro_Pin:
+    print_vcg_color(F, ird_color_orchid);
+    break;
   case iro_Const:
   case iro_Proj:
   case iro_Filter:
@@ -1123,6 +1147,25 @@ 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));
+
+  info->hook._hook_node_info = cb;
+  info->context              = data;
+  register_hook(hook_node_info, info);
+
+  return info;
+}
+
+/* Remove a previously added info dumper callback. */
+void dump_remv_node_info_callback(void *handle)
+{
+  hook_entry_t *info = handle;
+  unregister_hook(hook_node_info, info);
+  xfree(info);
+}
 
 /**
  * Dump the node information of a node n to a file F.
@@ -1137,6 +1180,9 @@ static INLINE int dump_node_info(FILE *F, ir_node *n)
   /* call the dump_node operation if available */
   if (ops->dump_node)
     bad = ops->dump_node(n, F, dump_node_info_txt);
+
+  /* allow additional info to be added */
+  hook_node_info(F, n);
   fprintf(F, "\"\n");
 
   return bad;
@@ -1499,6 +1545,9 @@ dump_whole_block(FILE *F, ir_node *block) {
   /* dump the blocks edges */
   dump_ir_data_edges(F, block);
 
+  if (dump_block_edge_hook)
+    dump_block_edge_hook(F, block);
+
   /* dump the nodes that go into the block */
   for (node = ird_get_irn_link(block); node; node = ird_get_irn_link(node)) {
     dump_node(F, node);
@@ -1635,11 +1684,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) ==symconst_type_tag)
-       || (get_SymConst_kind(n) ==symconst_size))
-      {
-        print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR);
-      }
+    if (SYMCONST_HAS_TYPE(get_SymConst_kind(n)))
+      print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR);
     break;
   case iro_Sel: {
       print_node_ent_edge(F,n,get_Sel_entity(n),NODE2TYPE_EDGE_ATTR);
@@ -2179,7 +2225,7 @@ FILE *vcg_open (ir_graph *irg, const char * suffix1, const char *suffix2) {
   if (!suffix2) suffix2 = "";
 
   /* open file for vcg graph */
-  fname = malloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5);
+  fname = xmalloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5);
 
   /* strncpy (fname, nm, len); */     /* copy the filename */
   j = 0;