X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firdump.c;h=ccb1d324b333646682903663a7628b9caf07800f;hb=b78bdd4d94de46de4156272e6dbfe44e97933a5b;hp=f7e2b9ab861a6a1bd8cfea32e71c45a55d8c1316;hpb=f1a3d0394f0923ab574eb4153a1995390a488edb;p=libfirm diff --git a/ir/ir/irdump.c b/ir/ir/irdump.c index f7e2b9ab8..ccb1d324b 100644 --- a/ir/ir/irdump.c +++ b/ir/ir/irdump.c @@ -23,6 +23,8 @@ #include "firm_common_t.h" +#include "list.h" + #include "irnode.h" #include "irgraph.h" #include "irprog_t.h" @@ -40,6 +42,7 @@ #include "irloop_t.h" #include "callgraph.h" #include "irextbb_t.h" +#include "irhooks.h" #include "dbginfo_t.h" #include "irtools.h" @@ -108,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. */ @@ -802,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 @@ -922,7 +939,6 @@ static const pns_lookup_t bound_lut[] = { X(M), X(X_except), X(res), - X(M_except) #undef X }; @@ -1123,6 +1139,25 @@ static void dump_node_vcgattr(FILE *F, ir_node *node, ir_node *local, int bad) } } +/* Adds a new node info dumper callback. */ +void *dump_add_node_info_callback(dump_node_info_cb_t *cb, void *data) +{ + hook_entry_t *info = xmalloc(sizeof(*info)); + + info->hook._hook_node_info = cb; + info->context = data; + register_hook(hook_node_info, info); + + return info; +} + +/* Remove a previously added info dumper callback. */ +void dump_remv_node_info_callback(void *handle) +{ + hook_entry_t *info = handle; + unregister_hook(hook_node_info, info); + xfree(info); +} /** * Dump the node information of a node n to a file F. @@ -1137,6 +1172,9 @@ static INLINE int dump_node_info(FILE *F, ir_node *n) /* call the dump_node operation if available */ if (ops->dump_node) bad = ops->dump_node(n, F, dump_node_info_txt); + + /* allow additional info to be added */ + hook_node_info(F, n); fprintf(F, "\"\n"); return bad; @@ -1499,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); @@ -1635,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); @@ -2179,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;