aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2022-01-07 13:49:28 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2022-01-07 19:03:28 -0500
commitc1b7d28a5987e74232b7f054849f8bd8ccc7e7de (patch)
tree4bb86b66b24a8b4caaab9154b0ede0cb5a688c75
parent6cd51207f5732b5258e883e9030b94c987b6d696 (diff)
downloadgcc-c1b7d28a5987e74232b7f054849f8bd8ccc7e7de.zip
gcc-c1b7d28a5987e74232b7f054849f8bd8ccc7e7de.tar.gz
gcc-c1b7d28a5987e74232b7f054849f8bd8ccc7e7de.tar.bz2
analyzer: add region::is_named_decl_p
This patch adds a debug function that I've found handy when debugging a problem with handling the decl "yy_buffer_stack" in PR analyzer/103546. gcc/analyzer/ChangeLog: * region.cc (region::is_named_decl_p): New. * region.h (region::is_named_decl_p): New decl. gcc/ChangeLog: * doc/analyzer.texi (Other Debugging Techniques): Document region::is_named_decl_p. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
-rw-r--r--gcc/analyzer/region.cc14
-rw-r--r--gcc/analyzer/region.h2
-rw-r--r--gcc/doc/analyzer.texi10
3 files changed, 26 insertions, 0 deletions
diff --git a/gcc/analyzer/region.cc b/gcc/analyzer/region.cc
index befcaa4..161e7e1 100644
--- a/gcc/analyzer/region.cc
+++ b/gcc/analyzer/region.cc
@@ -638,6 +638,20 @@ region::symbolic_for_unknown_ptr_p () const
return false;
}
+/* Return true if this is a region for a decl with name DECL_NAME.
+ Intended for use when debugging (for assertions and conditional
+ breakpoints). */
+
+DEBUG_FUNCTION bool
+region::is_named_decl_p (const char *decl_name) const
+{
+ if (tree decl = maybe_get_decl ())
+ if (DECL_NAME (decl)
+ && !strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), decl_name))
+ return true;
+ return false;
+}
+
/* region's ctor. */
region::region (complexity c, unsigned id, const region *parent, tree type)
diff --git a/gcc/analyzer/region.h b/gcc/analyzer/region.h
index fbb50a1..d97bbc1 100644
--- a/gcc/analyzer/region.h
+++ b/gcc/analyzer/region.h
@@ -189,6 +189,8 @@ public:
const complexity &get_complexity () const { return m_complexity; }
+ bool is_named_decl_p (const char *decl_name) const;
+
protected:
region (complexity c, unsigned id, const region *parent, tree type);
diff --git a/gcc/doc/analyzer.texi b/gcc/doc/analyzer.texi
index 6577981..62faac4 100644
--- a/gcc/doc/analyzer.texi
+++ b/gcc/doc/analyzer.texi
@@ -545,3 +545,13 @@ and the exploded graph in compressed JSON form.
One approach when tracking down where a particular bogus state is
introduced into the @code{exploded_graph} is to add custom code to
@code{program_state::validate}.
+
+The debug function @code{region::is_named_decl_p} can be used when debugging,
+such as for assertions and conditional breakpoints. For example, when
+tracking down a bug in handling a decl called @code{yy_buffer_stack}, I
+temporarily added a:
+@smallexample
+ gcc_assert (!m_base_region->is_named_decl_p ("yy_buffer_stack"));
+@end smallexample
+to @code{binding_cluster::mark_as_escaped} to trap a point where
+@code{yy_buffer_stack} was mistakenly being treated as having escaped.