X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=c01465590c628f169d734cfa562eec3aad38ec5e;hb=d9bef16cf09218c009110a0ce40c061a471f5b9d;hp=0b570b367611a76529193e385f2362fba3a0a53b;hpb=34361bb7f3df0c241fd85c4ecb3eed91c16bc529;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index 0b570b367..c01465590 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -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" @@ -1125,48 +1126,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 +1160,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;