Enable pointer_query caching in -Warray-bounds.

gcc/ChangeLog:

	* gimple-array-bounds.cc (array_bounds_checker::array_bounds_checker):
	Define ctor.
	(array_bounds_checker::get_value_range): Use new member.
	(array_bounds_checker::check_mem_ref): Same.
	* gimple-array-bounds.h (array_bounds_checker::array_bounds_checker):
	Outline ctor.
	(array_bounds_checker::m_ptr_query): New member.
This commit is contained in:
Martin Sebor 2022-02-03 13:58:28 -07:00
parent 68e9b7b69a
commit a62b740d7b
2 changed files with 16 additions and 7 deletions

View File

@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree.h"
#include "gimple.h"
#include "ssa.h"
#include "pointer-query.h"
#include "gimple-array-bounds.h"
#include "gimple-iterator.h"
#include "gimple-walk.h"
@ -37,7 +38,13 @@ along with GCC; see the file COPYING3. If not see
#include "domwalk.h"
#include "tree-cfg.h"
#include "attribs.h"
#include "pointer-query.h"
array_bounds_checker::array_bounds_checker (struct function *func,
range_query *qry)
: fun (func), m_ptr_qry (qry)
{
/* No-op. */
}
// This purposely returns a value_range, not a value_range_equiv, to
// break the dependency on equivalences for this pass.
@ -45,7 +52,7 @@ along with GCC; see the file COPYING3. If not see
const value_range *
array_bounds_checker::get_value_range (const_tree op, gimple *stmt)
{
return ranges->get_value_range (op, stmt);
return m_ptr_qry.rvals->get_value_range (op, stmt);
}
/* Try to determine the DECL that REF refers to. Return the DECL or
@ -401,7 +408,7 @@ array_bounds_checker::check_mem_ref (location_t location, tree ref,
axssize = wi::to_offset (access_size);
access_ref aref;
if (!compute_objsize (ref, m_stmt, 0, &aref, ranges))
if (!m_ptr_qry.get_ref (ref, m_stmt, &aref, 0))
return false;
if (aref.offset_in_range (axssize))

View File

@ -20,13 +20,14 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_GIMPLE_ARRAY_BOUNDS_H
#define GCC_GIMPLE_ARRAY_BOUNDS_H
#include "pointer-query.h"
class array_bounds_checker
{
friend class check_array_bounds_dom_walker;
public:
array_bounds_checker (struct function *fun, range_query *v)
: fun (fun), ranges (v) { }
array_bounds_checker (struct function *, range_query *);
void check ();
private:
@ -38,8 +39,9 @@ private:
/* Current function. */
struct function *fun;
/* Ranger instance. */
range_query *ranges;
/* A pointer_query object to store information about pointers and
their targets in. */
pointer_query m_ptr_qry;
/* Current statement. */
gimple *m_stmt;
};