#include "firm_common_t.h"
+#include "list.h"
+
#include "irnode.h"
#include "irgraph.h"
#include "irprog_t.h"
#include "irloop_t.h"
#include "callgraph.h"
#include "irextbb_t.h"
+#include "irhooks.h"
#include "dbginfo_t.h"
#include "irtools.h"
}
+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. */
case iro_Block:
fprintf (F, "%s%s", is_Block_dead(n) ? "Dead " : "", get_irn_opname(n));
break;
+ case iro_Conv:
+ if (get_Conv_strict(n))
+ fprintf (F, "strict");
+ fprintf (F, "%s", get_irn_opname(n));
+ break;
default:
default_case:
X(X_initial_exec),
X(P_frame_base),
X(P_globals),
+ X(P_tls),
X(T_args),
X(P_value_arg_base)
#undef X
X(M),
X(X_except),
X(res),
- X(M_except)
#undef X
};
case iro_Psi:
print_vcg_color(F, ird_color_gold);
break;
+ case iro_Pin:
+ print_vcg_color(F, ird_color_orchid);
+ break;
case iro_Const:
case iro_Proj:
case iro_Filter:
}
}
+/* 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.
/* 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;
/* 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);
/* @@@ 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);
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;