From: Michael Beck Date: Thu, 20 Apr 2006 08:52:30 +0000 (+0000) Subject: Used hooks to implement dump_add_node_info_callback() X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=d9bef16cf09218c009110a0ce40c061a471f5b9d;p=libfirm Used hooks to implement dump_add_node_info_callback() add prototypes to header file [r7646] --- 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; diff --git a/ir/ir/irdump.h b/ir/ir/irdump.h index 1808ee40e..b2c6d9cc0 100644 --- a/ir/ir/irdump.h +++ b/ir/ir/irdump.h @@ -651,4 +651,28 @@ void dump_ld_names(int flag); */ void dump_all_anchors(int flag); +/** A node info dumper callback. */ +typedef void (dump_node_info_cb_t)(void *data, FILE *f, const ir_node *n); + +/** + * Adds a new node info dumper callback. It is possible to add an unlimited + * number of callbacks. The callbacks are called at the end of the default + * info dumper. + * + * @param cb the callback function to be called + * @param data a context parameter + * + * @return A callback handle. + * + * @note This functionality is only available, if Firm hooks are enabled (default). + */ +void *dump_add_node_info_callback(dump_node_info_cb_t *cb, void *data); + +/** + * Remove a previously added info dumper callback. + * + * @param handle the callback handle returned from dump_add_node_info_callback() + */ +void dump_remv_node_info_callback(void *handle); + # endif /* _IRDUMP_H_ */