Fixed typos, improved docu
[libfirm] / ir / ir / irdump.c
index 0b570b3..bcb36f3 100644 (file)
@@ -42,6 +42,7 @@
 #include "irloop_t.h"
 #include "callgraph.h"
 #include "irextbb_t.h"
+#include "irhooks.h"
 #include "dbginfo_t.h"
 #include "irtools.h"
 
@@ -110,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. */
@@ -1125,48 +1139,24 @@ static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad)
   }
 }
 
-static struct list_head node_info_callbacks = { NULL };
-static int node_info_callbacks_inited       = 0;
-
-typedef struct _node_dump_cb_info_t {
-       struct list_head list;
-       dump_node_info_cb_t *cb;
-       void *data;
-} node_dump_cb_info_t;
-
+/* Adds a new node info dumper callback. */
 void *dump_add_node_info_callback(dump_node_info_cb_t *cb, void *data)
 {
-       node_dump_cb_info_t *info = xmalloc(sizeof(info[0]));
+  hook_entry_t *info = xmalloc(sizeof(*info));
 
-       if(!node_info_callbacks_inited) {
-               INIT_LIST_HEAD(&node_info_callbacks);
-               node_info_callbacks_inited = 1;
-       }
+  info->hook._hook_node_info = cb;
+  info->context              = data;
+  register_hook(hook_node_info, info);
 
-       INIT_LIST_HEAD(&info->list);
-       info->cb   = cb;
-       info->data = data;
-       list_add(&info->list, &node_info_callbacks);
-       return info;
+  return info;
 }
 
+/* Remove a previously added info dumper callback. */
 void dump_remv_node_info_callback(void *handle)
 {
-       node_dump_cb_info_t *info = handle;
-       list_del(&info->list);
-       xfree(info);
-}
-
-static void dump_node_info_call(FILE *f, const ir_node *n)
-{
-       node_dump_cb_info_t *pos;
-
-       if(!node_info_callbacks_inited)
-               return;
-
-       list_for_each_entry(node_dump_cb_info_t, pos, &node_info_callbacks, list) {
-               pos->cb(pos->data, f, n);
-       }
+  hook_entry_t *info = handle;
+  unregister_hook(hook_node_info, info);
+  xfree(info);
 }
 
 /**
@@ -1183,7 +1173,8 @@ static INLINE int dump_node_info(FILE *F, ir_node *n)
   if (ops->dump_node)
     bad = ops->dump_node(n, F, dump_node_info_txt);
 
-  dump_node_info_call(F, n);
+  /* allow additional info to be added */
+  hook_node_info(F, n);
   fprintf(F, "\"\n");
 
   return bad;
@@ -1546,6 +1537,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);