X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=ccb1d324b333646682903663a7628b9caf07800f;hb=b78bdd4d94de46de4156272e6dbfe44e97933a5b;hp=0b570b367611a76529193e385f2362fba3a0a53b;hpb=eb777555396d7567bd28e47c7ad18fe8c94e64a6;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index 0b570b367..ccb1d324b 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" @@ -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. */ @@ -804,6 +818,7 @@ static const pns_lookup_t start_lut[] = { X(X_initial_exec), X(P_frame_base), X(P_globals), + X(P_tls), X(T_args), X(P_value_arg_base) #undef X @@ -924,7 +939,6 @@ static const pns_lookup_t bound_lut[] = { X(M), X(X_except), X(res), - X(M_except) #undef X }; @@ -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); @@ -1682,11 +1676,8 @@ static void dump_node2type_edges(ir_node *n, void *env) /* @@@ some consts have an entity */ break; case iro_SymConst: - if ( (get_SymConst_kind(n) ==symconst_type_tag) - || (get_SymConst_kind(n) ==symconst_size)) - { - print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR); - } + if (SYMCONST_HAS_TYPE(get_SymConst_kind(n))) + print_node_type_edge(F,n,get_SymConst_type(n),NODE2TYPE_EDGE_ATTR); break; case iro_Sel: { print_node_ent_edge(F,n,get_Sel_entity(n),NODE2TYPE_EDGE_ATTR); @@ -2226,7 +2217,7 @@ FILE *vcg_open (ir_graph *irg, const char * suffix1, const char *suffix2) { if (!suffix2) suffix2 = ""; /* open file for vcg graph */ - fname = malloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5); + fname = xmalloc (len * 2 + strlen(suffix1) + strlen(suffix2) + 5); /* strncpy (fname, nm, len); */ /* copy the filename */ j = 0;