+ bad |= dump_node_label(F, con);
+ fprintf(F, "\" ");
+ bad |= dump_node_info(F, con);
+ dump_node_vcgattr(F, n, con, bad);
+ fprintf(F, "}\n");
+ }
+ }
+}
+
+/** If the block of an edge is a const_like node, dump it local with an edge */
+static void dump_const_block_local(FILE *F, ir_node *n) {
+ ir_node *blk;
+
+ if (!get_opt_dump_const_local()) return;
+
+ blk = get_nodes_block(n);
+ if (is_constlike_node(blk)) {
+ int bad = 0;
+
+ /* Generate a new name for the node by appending the names of
+ n and blk. */
+ fprintf(F, "node: {title: \""); PRINT_CONSTBLKID(n, blk);
+ fprintf(F, "\" label: \"");
+ bad |= dump_node_label(F, blk);
+ fprintf(F, "\" ");
+ bad |= dump_node_info(F, blk);
+ dump_node_vcgattr(F, n, blk, bad);
+ fprintf(F, "}\n");
+
+ 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");
+ }
+}
+
+/**
+ * prints the error message of a node to a file F as info2.
+ */
+static void INLINE print_node_error(FILE *F, const char *err_msg)
+{
+ if (! err_msg)
+ return;
+
+ fprintf (F, " info2: \"%s\"", err_msg);
+}
+
+/**
+ * prints debug messages of a node to file F as info3.
+ */
+static void print_node_dbg_info(FILE *F, dbg_info *dbg)
+{
+ char buf[1024];
+
+ if (__dbg_info_snprint) {
+ buf[0] = '\0';
+ if (__dbg_info_snprint(buf, sizeof(buf), dbg) > 0)
+ fprintf (F, " info3: \"%s\"\n", buf);
+ }
+}
+
+/**
+ * Dump a node
+ */
+static void dump_node(FILE *F, ir_node *n)
+{
+ int bad = 0;
+ const char *p;
+
+ if (get_opt_dump_const_local() && is_constlike_node(n))
+ return;
+
+ /* dump this node */
+ fprintf(F, "node: {title: \""); PRINT_NODEID(n); fprintf(F, "\" label: \"");
+
+ bad = ! irn_vrfy_irg_dump(n, current_ir_graph, &p);
+ bad |= dump_node_label(F, n);
+ dump_node_ana_vals(F, n);
+ //dump_node_ana_info(F, n);
+ fprintf(F, "\" ");
+ bad |= dump_node_info(F, n);
+ print_node_error(F, p);
+ print_node_dbg_info(F, get_irn_dbg_info(n));
+ dump_node_vcgattr(F, n, NULL, bad);
+ fprintf(F, "}\n");
+ dump_const_node_local(F, n);
+
+ if(dump_node_edge_hook)
+ dump_node_edge_hook(F, n);
+#if DO_HEAPANALYSIS
+ dump_irn_chi_term(F, n);
+ dump_irn_state(F, n);
+#endif
+}
+
+/** dump the edge to the block this node belongs to */
+static void
+dump_ir_block_edge(FILE *F, ir_node *n) {
+ if (get_opt_dump_const_local() && is_constlike_node(n)) return;
+ if (is_no_Block(n)) {
+ ir_node *block = get_nodes_block(n);
+
+ if (get_opt_dump_const_local() && is_constlike_node(block)) {
+ dump_const_block_local(F, n);
+ }
+ else {
+ fprintf (F, "edge: { sourcename: \"");
+ 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");