https://gcc.gnu.org/g:ae07f62a70ee2d0fdd7d8786122ae6360cfd4ca9
commit r15-1854-gae07f62a70ee2d0fdd7d8786122ae6360cfd4ca9 Author: Alex Coplan <alex.cop...@arm.com> Date: Fri Jul 5 11:57:56 2024 +0100 middle-end: Add debug functions to dump dominator tree in dot format 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. Diff: --- gcc/dominance.cc | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/gcc/dominance.cc b/gcc/dominance.cc index 0357210ed27..c14d997ded7 100644 --- a/gcc/dominance.cc +++ b/gcc/dominance.cc @@ -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. */