#include "irloop_t.h"
#include "callgraph.h"
#include "irextbb_t.h"
+#include "irhooks.h"
#include "dbginfo_t.h"
#include "irtools.h"
}
+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. */
}
}
-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);
}
/**
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;
/* 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);