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