This patch adds a simple wrapper class to make it easier to write human-readable .dot files.
gcc/ChangeLog: * analyzer/graphviz.cc: New file. * analyzer/graphviz.h: New file. --- gcc/analyzer/graphviz.cc | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ gcc/analyzer/graphviz.h | 50 ++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 gcc/analyzer/graphviz.cc create mode 100644 gcc/analyzer/graphviz.h diff --git a/gcc/analyzer/graphviz.cc b/gcc/analyzer/graphviz.cc new file mode 100644 index 0000000..46e7194 --- /dev/null +++ b/gcc/analyzer/graphviz.cc @@ -0,0 +1,81 @@ +/* Helper code for graphviz output. + Copyright (C) 2019 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalc...@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#include "gcc-plugin.h" +#include "system.h" +#include "coretypes.h" +#include "analyzer/graphviz.h" + +/* graphviz_out's ctor, wrapping PP. */ + +graphviz_out::graphviz_out (pretty_printer *pp) +: m_pp (pp), + m_indent (0) +{ +} + +/* Formatted print of FMT. */ + +void +graphviz_out::print (const char *fmt, ...) +{ + text_info text; + va_list ap; + + va_start (ap, fmt); + text.err_no = errno; + text.args_ptr = ≈ + text.format_spec = fmt; + pp_format (m_pp, &text); + pp_output_formatted_text (m_pp); + va_end (ap); +} + +/* Formatted print of FMT. The text is indented by the current + indent, and a newline is added. */ + +void +graphviz_out::println (const char *fmt, ...) +{ + text_info text; + va_list ap; + + write_indent (); + + va_start (ap, fmt); + text.err_no = errno; + text.args_ptr = ≈ + text.format_spec = fmt; + pp_format (m_pp, &text); + pp_output_formatted_text (m_pp); + va_end (ap); + + pp_newline (m_pp); +} + +/* Print the current indent to the underlying pp. */ + +void +graphviz_out::write_indent () +{ + for (int i = 0; i < m_indent * 2; ++i) + pp_space (m_pp); +} diff --git a/gcc/analyzer/graphviz.h b/gcc/analyzer/graphviz.h new file mode 100644 index 0000000..d097834 --- /dev/null +++ b/gcc/analyzer/graphviz.h @@ -0,0 +1,50 @@ +/* Helper code for graphviz output. + Copyright (C) 2019 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalc...@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_ANALYZER_GRAPHVIZ_H +#define GCC_ANALYZER_GRAPHVIZ_H + +#include "pretty-print.h" /* for ATTRIBUTE_GCC_PPDIAG. */ + +/* A class for writing .dot output to a pretty_printer with + indentation to show nesting. */ + +class graphviz_out { + public: + graphviz_out (pretty_printer *pp); + + void print (const char *fmt, ...) + ATTRIBUTE_GCC_PPDIAG(2,3); + void println (const char *fmt, ...) + ATTRIBUTE_GCC_PPDIAG(2,3); + + void indent () { m_indent++; } + void outdent () { m_indent--; } + + void write_indent (); + + pretty_printer *get_pp () const { return m_pp; } + + private: + pretty_printer *m_pp; + int m_indent; +}; + +#endif /* GCC_ANALYZER_GRAPHVIZ_H */ -- 1.8.5.3