Pass GIMPLE statement to compute_objsize.
gcc/ChangeLog: * gimple-ssa-warn-restrict.c (builtin_access::builtin_access): Pass GIMPLE statement to compute_objsize. * pointer-query.cc (compute_objsize): Add a statement argument. * pointer-query.h (compute_objsize): Define a new overload.
This commit is contained in:
parent
f9379fcb0d
commit
9354a7d70c
3 changed files with 14 additions and 9 deletions
|
@ -777,7 +777,7 @@ builtin_access::builtin_access (range_query *query, gimple *call,
|
|||
if (!POINTER_TYPE_P (TREE_TYPE (addr)))
|
||||
addr = build1 (ADDR_EXPR, (TREE_TYPE (addr)), addr);
|
||||
|
||||
if (tree dstsize = compute_objsize (addr, ostype))
|
||||
if (tree dstsize = compute_objsize (addr, call, ostype))
|
||||
dst.basesize = wi::to_offset (dstsize);
|
||||
else if (POINTER_TYPE_P (TREE_TYPE (addr)))
|
||||
dst.basesize = HOST_WIDE_INT_MIN;
|
||||
|
@ -791,7 +791,7 @@ builtin_access::builtin_access (range_query *query, gimple *call,
|
|||
if (!POINTER_TYPE_P (TREE_TYPE (addr)))
|
||||
addr = build1 (ADDR_EXPR, (TREE_TYPE (addr)), addr);
|
||||
|
||||
if (tree srcsize = compute_objsize (addr, ostype))
|
||||
if (tree srcsize = compute_objsize (addr, call, ostype))
|
||||
src.basesize = wi::to_offset (srcsize);
|
||||
else if (POINTER_TYPE_P (TREE_TYPE (addr)))
|
||||
src.basesize = HOST_WIDE_INT_MIN;
|
||||
|
|
|
@ -1645,7 +1645,7 @@ handle_array_ref (tree aref, gimple *stmt, bool addr, int ostype,
|
|||
offset_int orng[2];
|
||||
tree off = pref->eval (TREE_OPERAND (aref, 1));
|
||||
range_query *const rvals = qry ? qry->rvals : NULL;
|
||||
if (!get_offset_range (off, NULL, orng, rvals))
|
||||
if (!get_offset_range (off, stmt, orng, rvals))
|
||||
{
|
||||
/* Set ORNG to the maximum offset representable in ptrdiff_t. */
|
||||
orng[1] = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
|
||||
|
@ -1732,7 +1732,7 @@ handle_mem_ref (tree mref, gimple *stmt, int ostype, access_ref *pref,
|
|||
offset_int orng[2];
|
||||
tree off = pref->eval (TREE_OPERAND (mref, 1));
|
||||
range_query *const rvals = qry ? qry->rvals : NULL;
|
||||
if (!get_offset_range (off, NULL, orng, rvals))
|
||||
if (!get_offset_range (off, stmt, orng, rvals))
|
||||
{
|
||||
/* Set ORNG to the maximum offset representable in ptrdiff_t. */
|
||||
orng[1] = wi::to_offset (TYPE_MAX_VALUE (ptrdiff_type_node));
|
||||
|
@ -1948,7 +1948,7 @@ compute_objsize_r (tree ptr, gimple *stmt, int ostype, access_ref *pref,
|
|||
|
||||
offset_int orng[2];
|
||||
tree off = pref->eval (TREE_OPERAND (ptr, 1));
|
||||
if (get_offset_range (off, NULL, orng, rvals))
|
||||
if (get_offset_range (off, stmt, orng, rvals))
|
||||
pref->add_offset (orng[0], orng[1]);
|
||||
else
|
||||
pref->add_max_offset ();
|
||||
|
@ -2197,13 +2197,13 @@ compute_objsize (tree ptr, gimple *stmt, int ostype, access_ref *pref,
|
|||
once callers transition to one of the two above. */
|
||||
|
||||
tree
|
||||
compute_objsize (tree ptr, int ostype, tree *pdecl /* = NULL */,
|
||||
compute_objsize (tree ptr, gimple *stmt, int ostype, tree *pdecl /* = NULL */,
|
||||
tree *poff /* = NULL */, range_query *rvals /* = NULL */)
|
||||
{
|
||||
/* Set the initial offsets to zero and size to negative to indicate
|
||||
none has been computed yet. */
|
||||
access_ref ref;
|
||||
tree size = compute_objsize (ptr, nullptr, ostype, &ref, rvals);
|
||||
tree size = compute_objsize (ptr, stmt, ostype, &ref, rvals);
|
||||
if (!size || !ref.base0)
|
||||
return NULL_TREE;
|
||||
|
||||
|
|
|
@ -260,8 +260,13 @@ inline tree compute_objsize (tree ptr, int ostype, access_ref *pref)
|
|||
}
|
||||
|
||||
/* Legacy/transitional API. Should not be used in new code. */
|
||||
extern tree compute_objsize (tree, int, tree * = nullptr, tree * = nullptr,
|
||||
range_query * = nullptr);
|
||||
extern tree compute_objsize (tree, gimple *, int, tree * = nullptr,
|
||||
tree * = nullptr, range_query * = nullptr);
|
||||
inline tree compute_objsize (tree ptr, int ostype, tree *pdecl = nullptr,
|
||||
tree *poff = nullptr, range_query *rvals = nullptr)
|
||||
{
|
||||
return compute_objsize (ptr, nullptr, ostype, pdecl, poff, rvals);
|
||||
}
|
||||
|
||||
/* Return the field at the constant offset. */
|
||||
extern tree field_at_offset (tree, tree, HOST_WIDE_INT,
|
||||
|
|
Loading…
Add table
Reference in a new issue