aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-object-size.cc
diff options
context:
space:
mode:
authorQing Zhao <qing.zhao@oracle.com>2022-10-07 14:59:01 +0000
committerQing Zhao <qing.zhao@oracle.com>2022-10-07 17:44:14 +0000
commitb9ad850e86b863c24f6f4f5acf08d49944cc7bbe (patch)
tree75c67c9441b7ee72843604f81d79a1c97b9d254d /gcc/tree-object-size.cc
parent1879e48f3d8595bc9e7f583bbd12df3c6f5c42dc (diff)
downloadgcc-b9ad850e86b863c24f6f4f5acf08d49944cc7bbe.zip
gcc-b9ad850e86b863c24f6f4f5acf08d49944cc7bbe.tar.gz
gcc-b9ad850e86b863c24f6f4f5acf08d49944cc7bbe.tar.bz2
Use array_at_struct_end_p in __builtin_object_size [PR101836]
Use array_at_struct_end_p to determine whether the trailing array of a structure is flexible array member in __builtin_object_size. gcc/ChangeLog: PR tree-optimization/101836 * tree-object-size.cc (addr_object_size): Use array_at_struct_end_p to determine a flexible array member reference. gcc/testsuite/ChangeLog: PR tree-optimization/101836 * gcc.dg/pr101836.c: New test. * gcc.dg/pr101836_1.c: New test. * gcc.dg/pr101836_2.c: New test. * gcc.dg/pr101836_3.c: New test. * gcc.dg/pr101836_4.c: New test. * gcc.dg/pr101836_5.c: New test. * gcc.dg/strict-flex-array-2.c: New test. * gcc.dg/strict-flex-array-3.c: New test.
Diffstat (limited to 'gcc/tree-object-size.cc')
-rw-r--r--gcc/tree-object-size.cc16
1 files changed, 7 insertions, 9 deletions
diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc
index 4eb454a..1f04cb8 100644
--- a/gcc/tree-object-size.cc
+++ b/gcc/tree-object-size.cc
@@ -604,9 +604,9 @@ addr_object_size (struct object_size_info *osi, const_tree ptr,
else if (var != pt_var && TREE_CODE (pt_var) == MEM_REF)
{
tree v = var;
- /* For &X->fld, compute object size only if fld isn't the last
- field, as struct { int i; char c[1]; } is often used instead
- of flexible array member. */
+ /* For &X->fld, compute object size if fld isn't a flexible array
+ member. */
+ bool is_flexible_array_mem_ref = false;
while (v && v != pt_var)
switch (TREE_CODE (v))
{
@@ -633,6 +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);
while (v != pt_var && TREE_CODE (v) == COMPONENT_REF)
if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0)))
!= UNION_TYPE
@@ -645,12 +646,9 @@ addr_object_size (struct object_size_info *osi, const_tree ptr,
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0)))
== RECORD_TYPE)
{
- tree fld_chain = DECL_CHAIN (TREE_OPERAND (v, 1));
- for (; fld_chain; fld_chain = DECL_CHAIN (fld_chain))
- if (TREE_CODE (fld_chain) == FIELD_DECL)
- break;
-
- if (fld_chain)
+ /* compute object size only if v is not a
+ flexible array member. */
+ if (!is_flexible_array_mem_ref)
{
v = NULL_TREE;
break;