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:
parent
68e9b7b69a
commit
a62b740d7b
|
@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "gimple.h"
|
#include "gimple.h"
|
||||||
#include "ssa.h"
|
#include "ssa.h"
|
||||||
|
#include "pointer-query.h"
|
||||||
#include "gimple-array-bounds.h"
|
#include "gimple-array-bounds.h"
|
||||||
#include "gimple-iterator.h"
|
#include "gimple-iterator.h"
|
||||||
#include "gimple-walk.h"
|
#include "gimple-walk.h"
|
||||||
|
@ -37,7 +38,13 @@ along with GCC; see the file COPYING3. If not see
|
||||||
#include "domwalk.h"
|
#include "domwalk.h"
|
||||||
#include "tree-cfg.h"
|
#include "tree-cfg.h"
|
||||||
#include "attribs.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
|
// This purposely returns a value_range, not a value_range_equiv, to
|
||||||
// break the dependency on equivalences for this pass.
|
// 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 *
|
const value_range *
|
||||||
array_bounds_checker::get_value_range (const_tree op, gimple *stmt)
|
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
|
/* 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);
|
axssize = wi::to_offset (access_size);
|
||||||
|
|
||||||
access_ref aref;
|
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;
|
return false;
|
||||||
|
|
||||||
if (aref.offset_in_range (axssize))
|
if (aref.offset_in_range (axssize))
|
||||||
|
|
|
@ -20,13 +20,14 @@ along with GCC; see the file COPYING3. If not see
|
||||||
#ifndef GCC_GIMPLE_ARRAY_BOUNDS_H
|
#ifndef GCC_GIMPLE_ARRAY_BOUNDS_H
|
||||||
#define GCC_GIMPLE_ARRAY_BOUNDS_H
|
#define GCC_GIMPLE_ARRAY_BOUNDS_H
|
||||||
|
|
||||||
|
#include "pointer-query.h"
|
||||||
|
|
||||||
class array_bounds_checker
|
class array_bounds_checker
|
||||||
{
|
{
|
||||||
friend class check_array_bounds_dom_walker;
|
friend class check_array_bounds_dom_walker;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
array_bounds_checker (struct function *fun, range_query *v)
|
array_bounds_checker (struct function *, range_query *);
|
||||||
: fun (fun), ranges (v) { }
|
|
||||||
void check ();
|
void check ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -38,8 +39,9 @@ private:
|
||||||
|
|
||||||
/* Current function. */
|
/* Current function. */
|
||||||
struct function *fun;
|
struct function *fun;
|
||||||
/* Ranger instance. */
|
/* A pointer_query object to store information about pointers and
|
||||||
range_query *ranges;
|
their targets in. */
|
||||||
|
pointer_query m_ptr_qry;
|
||||||
/* Current statement. */
|
/* Current statement. */
|
||||||
gimple *m_stmt;
|
gimple *m_stmt;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue