public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-1117] analyzer: show saved diagnostics as nodes in .eg.dot dumps
@ 2022-06-15 21:41 David Malcolm
0 siblings, 0 replies; only message in thread
From: David Malcolm @ 2022-06-15 21:41 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:c540077a3bf60013333a175674558f6eefa08180
commit r13-1117-gc540077a3bf60013333a175674558f6eefa08180
Author: David Malcolm <dmalcolm@redhat.com>
Date: Wed Jun 15 17:40:33 2022 -0400
analyzer: show saved diagnostics as nodes in .eg.dot dumps
I've been using this tweak to the output of
-fdump-analyzer-exploded-graph in my working copies for a while;
the extra red nodes make it *much* easier to find the places where
diagnostics are being emitted (or rejected by the diagnostic_manager).
gcc/analyzer/ChangeLog:
* diagnostic-manager.cc (saved_diagnostic::dump_dot_id): New.
(saved_diagnostic::dump_as_dot_node): New.
* diagnostic-manager.h (saved_diagnostic::dump_dot_id): New decl.
(saved_diagnostic::dump_as_dot_node): New decl.
* engine.cc (exploded_node::dump_dot): Add nodes for saved
diagnostics.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diff:
---
gcc/analyzer/diagnostic-manager.cc | 62 ++++++++++++++++++++++++++++++++++++++
gcc/analyzer/diagnostic-manager.h | 3 ++
gcc/analyzer/engine.cc | 21 +++++++++++++
3 files changed, 86 insertions(+)
diff --git a/gcc/analyzer/diagnostic-manager.cc b/gcc/analyzer/diagnostic-manager.cc
index e90cd001f1a..4e96a3667e3 100644
--- a/gcc/analyzer/diagnostic-manager.cc
+++ b/gcc/analyzer/diagnostic-manager.cc
@@ -742,6 +742,68 @@ saved_diagnostic::to_json () const
return sd_obj;
}
+/* Dump this to PP in a form suitable for use as an id in .dot output. */
+
+void
+saved_diagnostic::dump_dot_id (pretty_printer *pp) const
+{
+ pp_printf (pp, "sd_%i", m_idx);
+}
+
+/* Dump this to PP in a form suitable for use as a node in .dot output. */
+
+void
+saved_diagnostic::dump_as_dot_node (pretty_printer *pp) const
+{
+ dump_dot_id (pp);
+ pp_printf (pp,
+ " [shape=none,margin=0,style=filled,fillcolor=\"red\",label=\"");
+ pp_write_text_to_stream (pp);
+
+ /* Node label. */
+ pp_printf (pp, "DIAGNOSTIC: %s (sd: %i)\n",
+ m_d->get_kind (), m_idx);
+ if (m_sm)
+ {
+ pp_printf (pp, "sm: %s", m_sm->get_name ());
+ if (m_state)
+ {
+ pp_printf (pp, "; state: ");
+ m_state->dump_to_pp (pp);
+ }
+ pp_newline (pp);
+ }
+ if (m_stmt)
+ {
+ pp_string (pp, "stmt: ");
+ pp_gimple_stmt_1 (pp, m_stmt, 0, (dump_flags_t)0);
+ pp_newline (pp);
+ }
+ if (m_var)
+ pp_printf (pp, "var: %qE\n", m_var);
+ if (m_sval)
+ {
+ pp_string (pp, "sval: ");
+ m_sval->dump_to_pp (pp, true);
+ pp_newline (pp);
+ }
+ if (m_best_epath)
+ pp_printf (pp, "path length: %i\n", get_epath_length ());
+
+ pp_write_text_as_dot_label_to_stream (pp, /*for_record=*/true);
+ pp_string (pp, "\"];\n\n");
+
+ /* Show links to duplicates. */
+ for (auto iter : m_duplicates)
+ {
+ dump_dot_id (pp);
+ pp_string (pp, " -> ");
+ iter->dump_dot_id (pp);
+ pp_string (pp, " [style=\"dotted\" arrowhead=\"none\"];");
+ pp_newline (pp);
+ }
+}
+
/* Use PF to find the best exploded_path for this saved_diagnostic,
and store it in m_best_epath.
If m_stmt is still NULL, use m_stmt_finder on the epath to populate
diff --git a/gcc/analyzer/diagnostic-manager.h b/gcc/analyzer/diagnostic-manager.h
index fc5dc043c78..b9bb7c8c254 100644
--- a/gcc/analyzer/diagnostic-manager.h
+++ b/gcc/analyzer/diagnostic-manager.h
@@ -46,6 +46,9 @@ public:
json::object *to_json () const;
+ void dump_dot_id (pretty_printer *pp) const;
+ void dump_as_dot_node (pretty_printer *pp) const;
+
const feasibility_problem *get_feasibility_problem () const
{
return m_problem;
diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc
index 5ccfedf9a44..ca86166173c 100644
--- a/gcc/analyzer/engine.cc
+++ b/gcc/analyzer/engine.cc
@@ -1209,6 +1209,27 @@ exploded_node::dump_dot (graphviz_out *gv, const dump_args_t &args) const
pp_write_text_as_dot_label_to_stream (pp, /*for_record=*/true);
pp_string (pp, "\"];\n\n");
+
+ /* It can be hard to locate the saved diagnostics as text within the
+ enode nodes, so add extra nodes to the graph for each saved_diagnostic,
+ highlighted in red.
+ Compare with dump_saved_diagnostics. */
+ {
+ unsigned i;
+ const saved_diagnostic *sd;
+ FOR_EACH_VEC_ELT (m_saved_diagnostics, i, sd)
+ {
+ sd->dump_as_dot_node (pp);
+
+ /* Add edge connecting this enode to the saved_diagnostic. */
+ dump_dot_id (pp);
+ pp_string (pp, " -> ");
+ sd->dump_dot_id (pp);
+ pp_string (pp, " [style=\"dotted\" arrowhead=\"none\"];");
+ pp_newline (pp);
+ }
+ }
+
pp_flush (pp);
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-15 21:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-15 21:41 [gcc r13-1117] analyzer: show saved diagnostics as nodes in .eg.dot dumps David Malcolm
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).