analyzer: add program_point::get_next

Avoid some future copy-and-paste by introducing a function.

gcc/analyzer/ChangeLog:
	* engine.cc
	(exploded_graph::process_node) <case PK_BEFORE_SUPERNODE>:
	Simplify by using program_point::get_next.
	* program-point.cc (program_point::get_next): New.
	* program-point.h (program_point::get_next): New decl.
This commit is contained in:
David Malcolm 2020-09-15 14:25:52 -04:00
parent 6dd96e24ea
commit b9b5fc0c21
3 changed files with 35 additions and 20 deletions

View file

@ -2458,26 +2458,10 @@ exploded_graph::process_node (exploded_node *node)
&ctxt);
}
if (point.get_supernode ()->m_stmts.length () > 0)
{
program_point next_point
= program_point::before_stmt (point.get_supernode (), 0,
point.get_call_string ());
exploded_node *next
= get_or_create_node (next_point, next_state, node);
if (next)
add_edge (node, next, NULL);
}
else
{
program_point next_point
= program_point::after_supernode (point.get_supernode (),
point.get_call_string ());
exploded_node *next = get_or_create_node (next_point, next_state,
node);
if (next)
add_edge (node, next, NULL);
}
program_point next_point (point.get_next ());
exploded_node *next = get_or_create_node (next_point, next_state, node);
if (next)
add_edge (node, next, NULL);
}
break;
case PK_BEFORE_STMT:

View file

@ -529,6 +529,35 @@ function_point::next_stmt ()
}
}
/* For those program points for which there is a uniquely-defined
successor, return it. */
program_point
program_point::get_next () const
{
switch (m_function_point.get_kind ())
{
default:
gcc_unreachable ();
case PK_ORIGIN:
case PK_AFTER_SUPERNODE:
gcc_unreachable (); /* Not uniquely defined. */
case PK_BEFORE_SUPERNODE:
if (get_supernode ()->m_stmts.length () > 0)
return before_stmt (get_supernode (), 0, get_call_string ());
else
return after_supernode (get_supernode (), get_call_string ());
case PK_BEFORE_STMT:
{
unsigned next_idx = get_stmt_idx ();
if (next_idx < get_supernode ()->m_stmts.length ())
return before_stmt (get_supernode (), next_idx, get_call_string ());
else
return after_supernode (get_supernode (), get_call_string ());
}
}
}
#if CHECKING_P
namespace selftest {

View file

@ -294,6 +294,8 @@ public:
/* For before_stmt, go to next stmt. */
void next_stmt () { m_function_point.next_stmt (); }
program_point get_next () const;
private:
function_point m_function_point;
call_string m_call_string;