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>
This commit is contained in:
David Malcolm 2022-01-07 13:49:28 -05:00
parent 6cd51207f5
commit c1b7d28a59
3 changed files with 26 additions and 0 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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.