aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2025-04-28 18:21:20 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2025-04-28 18:21:20 -0400
commit0ef00f71969f200589355eb96a393b584340c0cf (patch)
treecc2b12782f02e27788f35ccfed48b0068bce3c54 /gcc
parent1dc8916bcbb14c859def696be9d76f25e69c9b57 (diff)
downloadgcc-0ef00f71969f200589355eb96a393b584340c0cf.zip
gcc-0ef00f71969f200589355eb96a393b584340c0cf.tar.gz
gcc-0ef00f71969f200589355eb96a393b584340c0cf.tar.bz2
analyzer: add a call_details::dump (using text_art)
Add a new function to help debugging -fanalyzer. No functional change intended. gcc/analyzer/ChangeLog: * call-details.cc (call_details::dump): New overload. (call_details::make_dump_widget): New. * call-details.h (call_details::dump): Declare new overload. (call_details::make_dump_widget): New decl. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/analyzer/call-details.cc59
-rw-r--r--gcc/analyzer/call-details.h4
2 files changed, 63 insertions, 0 deletions
diff --git a/gcc/analyzer/call-details.cc b/gcc/analyzer/call-details.cc
index 4122f84..3d85c17 100644
--- a/gcc/analyzer/call-details.cc
+++ b/gcc/analyzer/call-details.cc
@@ -366,6 +366,65 @@ call_details::dump (bool simple) const
dump_to_pp (&pp, simple);
}
+/* Dump a tree-like representation of this call to stderr. */
+
+DEBUG_FUNCTION void
+call_details::dump () const
+{
+ text_art::dump (*this);
+}
+
+std::unique_ptr<text_art::tree_widget>
+call_details::make_dump_widget (const text_art::dump_widget_info &dwi) const
+{
+ using text_art::tree_widget;
+ std::unique_ptr<tree_widget> cd_widget
+ (tree_widget::from_fmt (dwi, nullptr, "Call Details"));
+
+ {
+ pretty_printer the_pp;
+ pretty_printer * const pp = &the_pp;
+ pp_format_decoder (pp) = default_tree_printer;
+ pp_string (pp, "gcall: ");
+ pp_gimple_stmt_1 (pp, m_call, 0 /* spc */, TDF_NONE /* flags */);
+ cd_widget->add_child (tree_widget::make (dwi, pp));
+ }
+ {
+ pretty_printer the_pp;
+ pretty_printer * const pp = &the_pp;
+ pp_format_decoder (pp) = default_tree_printer;
+ pp_string (pp, "return region: ");
+ if (m_lhs_region)
+ m_lhs_region->dump_to_pp (pp, true);
+ else
+ pp_string (pp, "NULL");
+ auto w = tree_widget::make (dwi, pp);
+ if (m_lhs_region)
+ w->add_child (m_lhs_region->make_dump_widget (dwi));
+ cd_widget->add_child (std::move (w));
+ }
+ if (gimple_call_num_args (m_call) > 0)
+ {
+ std::unique_ptr<tree_widget> args_widget
+ (tree_widget::from_fmt (dwi, nullptr, "Arguments"));
+ for (unsigned i = 0; i < gimple_call_num_args (m_call); i++)
+ {
+ pretty_printer the_pp;
+ pretty_printer * const pp = &the_pp;
+ pp_format_decoder (pp) = default_tree_printer;
+ const svalue *arg_sval = get_arg_svalue (i);
+ pp_printf (pp, "%i: ", i);
+ arg_sval->dump_to_pp (pp, true);
+ auto w = tree_widget::make (dwi, pp);
+ w->add_child (arg_sval->make_dump_widget (dwi));
+ args_widget->add_child (std::move (w));
+ }
+ cd_widget->add_child (std::move (args_widget));
+ }
+
+ return cd_widget;
+}
+
/* Get a conjured_svalue for this call for REG,
and purge any state already relating to that conjured_svalue. */
diff --git a/gcc/analyzer/call-details.h b/gcc/analyzer/call-details.h
index fee7ad4..0f9f400 100644
--- a/gcc/analyzer/call-details.h
+++ b/gcc/analyzer/call-details.h
@@ -68,6 +68,10 @@ public:
void dump_to_pp (pretty_printer *pp, bool simple) const;
void dump (bool simple) const;
+ void dump () const;
+
+ std::unique_ptr<text_art::tree_widget>
+ make_dump_widget (const text_art::dump_widget_info &dwi) const;
const svalue *get_or_create_conjured_svalue (const region *) const;