]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end: Add debug functions to dump dominator tree in dot format
authorAlex Coplan <alex.coplan@arm.com>
Fri, 5 Jul 2024 10:57:56 +0000 (11:57 +0100)
committerAlex Coplan <alex.coplan@arm.com>
Fri, 5 Jul 2024 10:57:56 +0000 (11:57 +0100)
This adds debug functions to dump the dominator tree in dot format.
There are two overloads: one which takes a FILE * and another which
takes a const char *fname and wraps the first with fopen/fclose for
convenience.

gcc/ChangeLog:

* dominance.cc (dot_dominance_tree): New.

gcc/dominance.cc

index 0357210ed27f2ed69fc72e140bf1b824e391fff8..c14d997ded7399acc3de0a8f95050ea648c1870f 100644 (file)
@@ -1658,6 +1658,36 @@ debug_dominance_info (enum cdi_direction dir)
       fprintf (stderr, "%i %i\n", bb->index, bb2->index);
 }
 
+/* Dump the dominance tree in direction DIR to the file F in dot form.
+   This allows easily visualizing the tree using graphviz.  */
+
+DEBUG_FUNCTION void
+dot_dominance_tree (FILE *f, enum cdi_direction dir)
+{
+  fprintf (f, "digraph {\n");
+  basic_block bb, idom;
+  FOR_EACH_BB_FN (bb, cfun)
+    if ((idom = get_immediate_dominator (dir, bb)))
+      fprintf (f, "%i -> %i;\n", idom->index, bb->index);
+  fprintf (f, "}\n");
+}
+
+/* Convenience wrapper around the above that dumps the dominance tree in
+   direction DIR to the file at path FNAME in dot form.  */
+
+DEBUG_FUNCTION void
+dot_dominance_tree (const char *fname, enum cdi_direction dir)
+{
+  FILE *f = fopen (fname, "w");
+  if (f)
+    {
+      dot_dominance_tree (f, dir);
+      fclose (f);
+    }
+  else
+    fprintf (stderr, "failed to open %s: %s\n", fname, xstrerror (errno));
+}
+
 /* Prints to stderr representation of the dominance tree (for direction DIR)
    rooted in ROOT, indented by INDENT tabulators.  If INDENT_FIRST is false,
    the first line of the output is not indented.  */