Change the name of array_at_struct_end_p to array_ref_flexible_size_p
The name of the utility routine "array_at_struct_end_p" is misleading and should be changed to a new name that more accurately reflects its real meaning. The routine "array_at_struct_end_p" is used to check whether an array reference is to an array whose actual size might be larger than its upper bound implies, which includes 3 different cases: A. a ref to a flexible array member at the end of a structure; B. a ref to an array with a different type against the original decl; C. a ref to an array that was passed as a parameter; The old name only reflects the above case A, therefore very confusing when reading the corresponding gcc source code. In this patch, A new name "array_ref_flexible_size_p" is used to replace the old name. All the references to the routine "array_at_struct_end_p" was replaced with this new name, and the corresponding comments were updated to make them clean and consistent. gcc/ChangeLog: * gimple-array-bounds.cc (trailing_array): Replace array_at_struct_end_p with new name and update comments. * gimple-fold.cc (get_range_strlen_tree): Likewise. * gimple-ssa-warn-restrict.cc (builtin_memref::builtin_memref): Likewise. * graphite-sese-to-poly.cc (bounds_are_valid): Likewise. * tree-if-conv.cc (idx_within_array_bound): Likewise. * tree-object-size.cc (addr_object_size): Likewise. * tree-ssa-alias.cc (component_ref_to_zero_sized_trailing_array_p): Likewise. (stmt_kills_ref_p): Likewise. * tree-ssa-loop-niter.cc (idx_infer_loop_bounds): Likewise. * tree-ssa-strlen.cc (maybe_set_strlen_range): Likewise. * tree.cc (array_at_struct_end_p): Rename to ... (array_ref_flexible_size_p): ... this. (component_ref_size): Replace array_at_struct_end_p with new name. * tree.h (array_at_struct_end_p): Rename to ... (array_ref_flexible_size_p): ... this.
This commit is contained in:
parent
0b3d926d79
commit
ace0ae0933
11 changed files with 35 additions and 37 deletions
|
@ -129,7 +129,7 @@ get_ref_size (tree arg, tree *pref)
|
|||
}
|
||||
|
||||
/* Return true if REF is (likely) an ARRAY_REF to a trailing array member
|
||||
of a struct. It refines array_at_struct_end_p by detecting a pointer
|
||||
of a struct. It refines array_ref_flexible_size_p by detecting a pointer
|
||||
to an array and an array parameter declared using the [N] syntax (as
|
||||
opposed to a pointer) and returning false. Set *PREF to the decl or
|
||||
expression REF refers to. */
|
||||
|
@ -167,7 +167,7 @@ trailing_array (tree arg, tree *pref)
|
|||
return false;
|
||||
}
|
||||
|
||||
return array_at_struct_end_p (arg);
|
||||
return array_ref_flexible_size_p (arg);
|
||||
}
|
||||
|
||||
/* Checks one ARRAY_REF in REF, located at LOCUS. Ignores flexible
|
||||
|
|
|
@ -1690,13 +1690,11 @@ get_range_strlen_tree (tree arg, bitmap visited, strlen_range_kind rkind,
|
|||
/* Handle a MEM_REF into a DECL accessing an array of integers,
|
||||
being conservative about references to extern structures with
|
||||
flexible array members that can be initialized to arbitrary
|
||||
numbers of elements as an extension (static structs are okay).
|
||||
FIXME: Make this less conservative -- see
|
||||
component_ref_size in tree.cc. */
|
||||
numbers of elements as an extension (static structs are okay). */
|
||||
tree ref = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
|
||||
if ((TREE_CODE (ref) == PARM_DECL || VAR_P (ref))
|
||||
&& (decl_binds_to_current_def_p (ref)
|
||||
|| !array_at_struct_end_p (arg)))
|
||||
|| !array_ref_flexible_size_p (arg)))
|
||||
{
|
||||
/* Fail if the offset is out of bounds. Such accesses
|
||||
should be diagnosed at some point. */
|
||||
|
|
|
@ -296,8 +296,9 @@ builtin_memref::builtin_memref (pointer_query &ptrqry, gimple *stmt, tree expr,
|
|||
tree basetype = TREE_TYPE (base);
|
||||
if (TREE_CODE (basetype) == ARRAY_TYPE)
|
||||
{
|
||||
if (ref && array_at_struct_end_p (ref))
|
||||
; /* Use the maximum possible offset for last member arrays. */
|
||||
if (ref && array_ref_flexible_size_p (ref))
|
||||
; /* Use the maximum possible offset for an array that might
|
||||
have flexible size. */
|
||||
else if (tree basesize = TYPE_SIZE_UNIT (basetype))
|
||||
if (TREE_CODE (basesize) == INTEGER_CST)
|
||||
/* Size could be non-constant for a variable-length type such
|
||||
|
|
|
@ -536,9 +536,9 @@ bounds_are_valid (tree ref, tree low, tree high)
|
|||
|| !tree_fits_shwi_p (high))
|
||||
return false;
|
||||
|
||||
/* 1-element arrays at end of structures may extend over
|
||||
/* An array that has flexible size may extend over
|
||||
their declared size. */
|
||||
if (array_at_struct_end_p (ref)
|
||||
if (array_ref_flexible_size_p (ref)
|
||||
&& operand_equal_p (low, high, 0))
|
||||
return false;
|
||||
|
||||
|
|
|
@ -763,10 +763,9 @@ idx_within_array_bound (tree ref, tree *idx, void *dta)
|
|||
if (TREE_CODE (ref) != ARRAY_REF)
|
||||
return false;
|
||||
|
||||
/* For arrays at the end of the structure, we are not guaranteed that they
|
||||
do not really extend over their declared size. However, for arrays of
|
||||
size greater than one, this is unlikely to be intended. */
|
||||
if (array_at_struct_end_p (ref))
|
||||
/* For arrays that might have flexible sizes, it is not guaranteed that they
|
||||
do not extend over their declared size. */
|
||||
if (array_ref_flexible_size_p (ref))
|
||||
return false;
|
||||
|
||||
ev = analyze_scalar_evolution (loop, *idx);
|
||||
|
|
|
@ -633,7 +633,7 @@ addr_object_size (struct object_size_info *osi, const_tree ptr,
|
|||
v = NULL_TREE;
|
||||
break;
|
||||
}
|
||||
is_flexible_array_mem_ref = array_at_struct_end_p (v);
|
||||
is_flexible_array_mem_ref = array_ref_flexible_size_p (v);
|
||||
while (v != pt_var && TREE_CODE (v) == COMPONENT_REF)
|
||||
if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0)))
|
||||
!= UNION_TYPE
|
||||
|
|
|
@ -1073,7 +1073,7 @@ component_ref_to_zero_sized_trailing_array_p (tree ref)
|
|||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (ref, 1))) == ARRAY_TYPE
|
||||
&& (!TYPE_SIZE (TREE_TYPE (TREE_OPERAND (ref, 1)))
|
||||
|| integer_zerop (TYPE_SIZE (TREE_TYPE (TREE_OPERAND (ref, 1)))))
|
||||
&& array_at_struct_end_p (ref));
|
||||
&& array_ref_flexible_size_p (ref));
|
||||
}
|
||||
|
||||
/* Worker for aliasing_component_refs_p. Most parameters match parameters of
|
||||
|
@ -3433,10 +3433,10 @@ stmt_kills_ref_p (gimple *stmt, ao_ref *ref)
|
|||
}
|
||||
/* Finally check if the lhs has the same address and size as the
|
||||
base candidate of the access. Watch out if we have dropped
|
||||
an array-ref that was at struct end, this means ref->ref may
|
||||
be outside of the TYPE_SIZE of its base. */
|
||||
an array-ref that might have flexible size, this means ref->ref
|
||||
may be outside of the TYPE_SIZE of its base. */
|
||||
if ((! innermost_dropped_array_ref
|
||||
|| ! array_at_struct_end_p (innermost_dropped_array_ref))
|
||||
|| ! array_ref_flexible_size_p (innermost_dropped_array_ref))
|
||||
&& (lhs == base
|
||||
|| (((TYPE_SIZE (TREE_TYPE (lhs))
|
||||
== TYPE_SIZE (TREE_TYPE (base)))
|
||||
|
|
|
@ -3716,18 +3716,17 @@ idx_infer_loop_bounds (tree base, tree *idx, void *dta)
|
|||
struct ilb_data *data = (struct ilb_data *) dta;
|
||||
tree ev, init, step;
|
||||
tree low, high, type, next;
|
||||
bool sign, upper = true, at_end = false;
|
||||
bool sign, upper = true, has_flexible_size = false;
|
||||
class loop *loop = data->loop;
|
||||
|
||||
if (TREE_CODE (base) != ARRAY_REF)
|
||||
return true;
|
||||
|
||||
/* For arrays at the end of the structure, we are not guaranteed that they
|
||||
do not really extend over their declared size. However, for arrays of
|
||||
size greater than one, this is unlikely to be intended. */
|
||||
if (array_at_struct_end_p (base))
|
||||
/* For arrays that might have flexible sizes, it is not guaranteed that they
|
||||
do not really extend over their declared size. */
|
||||
if (array_ref_flexible_size_p (base))
|
||||
{
|
||||
at_end = true;
|
||||
has_flexible_size = true;
|
||||
upper = false;
|
||||
}
|
||||
|
||||
|
@ -3760,9 +3759,9 @@ idx_infer_loop_bounds (tree base, tree *idx, void *dta)
|
|||
sign = tree_int_cst_sign_bit (step);
|
||||
type = TREE_TYPE (step);
|
||||
|
||||
/* The array of length 1 at the end of a structure most likely extends
|
||||
/* The array that might have flexible size most likely extends
|
||||
beyond its bounds. */
|
||||
if (at_end
|
||||
if (has_flexible_size
|
||||
&& operand_equal_p (low, high, 0))
|
||||
return true;
|
||||
|
||||
|
|
|
@ -1987,7 +1987,7 @@ maybe_set_strlen_range (tree lhs, tree src, tree bound)
|
|||
suggests if it's treated as a poor-man's flexible array member. */
|
||||
src = TREE_OPERAND (src, 0);
|
||||
if (TREE_CODE (src) != MEM_REF
|
||||
&& !array_at_struct_end_p (src))
|
||||
&& !array_ref_flexible_size_p (src))
|
||||
{
|
||||
tree type = TREE_TYPE (src);
|
||||
tree size = TYPE_SIZE_UNIT (type);
|
||||
|
|
11
gcc/tree.cc
11
gcc/tree.cc
|
@ -12727,8 +12727,8 @@ array_ref_up_bound (tree exp)
|
|||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Returns true if REF is an array reference, component reference,
|
||||
or memory reference to an array whose actual size might be larger
|
||||
/* Returns true if REF is an array reference, a component reference,
|
||||
or a memory reference to an array whose actual size might be larger
|
||||
than its upper bound implies, there are multiple cases:
|
||||
A. a ref to a flexible array member at the end of a structure;
|
||||
B. a ref to an array with a different type against the original decl;
|
||||
|
@ -12743,10 +12743,10 @@ array_ref_up_bound (tree exp)
|
|||
int test (uint8_t *p, uint32_t t[1][1], int n) {
|
||||
for (int i = 0; i < 4; i++, p++)
|
||||
t[i][0] = ...;
|
||||
*/
|
||||
|
||||
FIXME, the name of this routine need to be changed to be more accurate. */
|
||||
bool
|
||||
array_at_struct_end_p (tree ref)
|
||||
array_ref_flexible_size_p (tree ref)
|
||||
{
|
||||
/* the TYPE for this array referece. */
|
||||
tree atype = NULL_TREE;
|
||||
|
@ -12879,6 +12879,7 @@ array_at_struct_end_p (tree ref)
|
|||
return afield_decl ? !DECL_NOT_FLEXARRAY (afield_decl) : true;
|
||||
}
|
||||
|
||||
|
||||
/* Return a tree representing the offset, in bytes, of the field referenced
|
||||
by EXP. This does not include any offset in DECL_FIELD_BIT_OFFSET. */
|
||||
|
||||
|
@ -12974,7 +12975,7 @@ component_ref_size (tree ref, special_array_member *sam /* = NULL */)
|
|||
return (tree_int_cst_equal (memsize, TYPE_SIZE_UNIT (memtype))
|
||||
? memsize : NULL_TREE);
|
||||
|
||||
bool trailing = array_at_struct_end_p (ref);
|
||||
bool trailing = array_ref_flexible_size_p (ref);
|
||||
bool zero_length = integer_zerop (memsize);
|
||||
if (!trailing && !zero_length)
|
||||
/* MEMBER is either an interior array or is an array with
|
||||
|
|
|
@ -5554,10 +5554,10 @@ extern tree array_ref_up_bound (tree);
|
|||
EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */
|
||||
extern tree array_ref_low_bound (tree);
|
||||
|
||||
/* Returns true if REF is an array reference or a component reference
|
||||
to an array at the end of a structure. If this is the case, the array
|
||||
may be allocated larger than its upper bound implies. */
|
||||
extern bool array_at_struct_end_p (tree);
|
||||
/* Returns true if REF is an array reference, a component reference,
|
||||
or a memory reference to an array whose actual size might be larger
|
||||
than its upper bound implies. */
|
||||
extern bool array_ref_flexible_size_p (tree);
|
||||
|
||||
/* Return a tree representing the offset, in bytes, of the field referenced
|
||||
by EXP. This does not include any offset in DECL_FIELD_BIT_OFFSET. */
|
||||
|
|
Loading…
Add table
Reference in a new issue