}
-/** The vcg attribute hook. */
+/** The vcg node attribute hook. */
+static DUMP_IR_GRAPH_FUNC dump_ir_graph_hook = NULL;
+/** The vcg node attribute hook. */
static DUMP_NODE_VCGATTR_FUNC dump_node_vcgattr_hook = NULL;
+/** The vcg edge attribute hook. */
+static DUMP_EDGE_VCGATTR_FUNC dump_edge_vcgattr_hook = NULL;
-/* set the hook */
+/* set the ir graph hook */
+void set_dump_ir_graph_hook(DUMP_IR_GRAPH_FUNC hook) {
+ dump_ir_graph_hook = hook;
+}
+/* set the node attribute hook */
void set_dump_node_vcgattr_hook(DUMP_NODE_VCGATTR_FUNC hook) {
dump_node_vcgattr_hook = hook;
}
+/* set the edge attribute hook */
+void set_dump_edge_vcgattr_hook(DUMP_EDGE_VCGATTR_FUNC hook) {
+ dump_edge_vcgattr_hook = hook;
+}
INLINE bool get_opt_dump_const_local(void) {
if (!dump_out_edge_flag && !dump_loop_information_flag)
case iro_Confirm:
fprintf (F, "%s ", get_pnc_string(get_Confirm_cmp(n)));
break;
+ case iro_CopyB:
+ fprintf (F, "(%s) ", get_type_name_ex(get_CopyB_type(n), &bad));
+ break;
default:
;
fprintf (F, "edge: { sourcename: \"");
PRINT_NODEID(n);
fprintf (F, "\" targetname: \""); PRINT_CONSTBLKID(n,blk);
+
+ if (dump_edge_vcgattr_hook) {
+ fprintf (F, "\" ");
+ if (dump_edge_vcgattr_hook(F, n, -1)) {
+ fprintf (F, "}\n");
+ return;
+ }
+ else {
+ fprintf (F, " " BLOCK_EDGE_ATTR "}\n");
+ return;
+ }
+ }
+
fprintf (F, "\" " BLOCK_EDGE_ATTR "}\n");
}
}
PRINT_NODEID(n);
fprintf (F, "\" targetname: ");
fprintf(F, "\""); PRINT_NODEID(block); fprintf(F, "\"");
+
+ if (dump_edge_vcgattr_hook) {
+ fprintf (F, " ");
+ if (dump_edge_vcgattr_hook(F, n, -1)) {
+ fprintf (F, "}\n");
+ return;
+ }
+ else {
+ fprintf (F, " " BLOCK_EDGE_ATTR "}\n");
+ return;
+ }
+ }
+
fprintf (F, " " BLOCK_EDGE_ATTR "}\n");
}
}
print_edge_vcgattr(FILE *F, ir_node *from, int to) {
assert(from);
+ if (dump_edge_vcgattr_hook)
+ if (dump_edge_vcgattr_hook(F, from, to))
+ return;
+
if (dump_backedge_information_flag && is_backedge(from, to))
fprintf (F, BACK_EDGE_ATTR);
fprintf(F, "\" status:clustered color:%s \n", color);
- /* ycomp can show attributs for blocks, VCG parses but ignores them */
+ /* yComp can show attributes for blocks, XVCG parses but ignores them */
dump_node_info(F, block);
+ print_node_dbg_info(F, get_irn_dbg_info(block));
/* dump the blocks edges */
dump_ir_data_edges(F, block);
current_ir_graph = rem;
}
+/**
+ * Dump the info for an irg.
+ * Parsed by XVCG but not shown. use yComp.
+ */
+static void dump_graph_info(FILE *F, ir_graph *irg) {
+ fprintf(F, "info1:\"");
+ dump_entity_to_file(F, get_irg_entity(irg), dump_verbosity_entattrs | dump_verbosity_entconsts);
+ fprintf(F, "\"\n");
+}
+
/** Dumps an irg as a graph clustered by block nodes.
* If interprocedural view edges can point to nodes out of this graph.
*/
fprintf(F, "\" label: \"%s\" status:clustered color:white \n",
get_ent_dump_name(get_irg_entity(irg)));
+ dump_graph_info(F, irg);
+
dump_block_graph(F, irg);
/* Close the vcg information for the irg */
f = vcg_open(irg, suffix, suffix1);
dump_vcg_header(f, get_irg_dump_name(irg), NULL);
+ /* call the dump graph hook */
+ if (dump_ir_graph_hook)
+ if (dump_ir_graph_hook(f, irg))
+ return;
+
/* walk over the graph */
/* dump_whole_node must be called in post visiting predecessors */
irg_walk(get_irg_end(irg), NULL, dump_whole_node, f);
fprintf(F, "\" label: \"%s\" status:clustered color:white \n",
get_ent_dump_name(get_irg_entity(irg)));
+ dump_graph_info(F, irg);
+
for (i = 0; i < get_irp_n_irgs(); i++) {
ir_graph *irg = get_irp_irg(i);
list_tuple *lists = ird_get_irg_link(irg);