aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-object-size.c
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@gotplt.org>2022-01-11 19:52:43 +0530
committerSiddhesh Poyarekar <siddhesh@gotplt.org>2022-01-11 20:17:39 +0530
commit1f07810659616221c3bf4177c1fc2ca3607f7728 (patch)
treed1cfc6cb9825541f4f71d526e1e511d8ee4fff1a /gcc/tree-object-size.c
parentea19c8f33a3a8d2b52f89f1fade0a21e3c779190 (diff)
downloadgcc-1f07810659616221c3bf4177c1fc2ca3607f7728.zip
gcc-1f07810659616221c3bf4177c1fc2ca3607f7728.tar.gz
gcc-1f07810659616221c3bf4177c1fc2ca3607f7728.tar.bz2
tree-object-size: Handle GIMPLE_CALL
Handle non-constant expressions in GIMPLE_CALL arguments. Also handle alloca. gcc/ChangeLog: PR middle-end/70090 * tree-object-size.c (alloc_object_size): Make and return non-constant size expression. (call_object_size): Return expression or unknown based on whether dynamic object size is requested. gcc/testsuite/ChangeLog: PR middle-end/70090 * gcc.dg/builtin-dynamic-object-size-0.c: Add new tests. * gcc.dg/builtin-object-size-1.c (test1) [__builtin_object_size]: Alter expected result for dynamic object size. * gcc.dg/builtin-object-size-2.c (test1) [__builtin_object_size]: Likewise. * gcc.dg/builtin-object-size-3.c (test1) [__builtin_object_size]: Likewise. * gcc.dg/builtin-object-size-4.c (test1) [__builtin_object_size]: Likewise. Signed-off-by: Siddhesh Poyarekar <siddhesh@gotplt.org>
Diffstat (limited to 'gcc/tree-object-size.c')
-rw-r--r--gcc/tree-object-size.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c
index fa7233d..a887cc6 100644
--- a/gcc/tree-object-size.c
+++ b/gcc/tree-object-size.c
@@ -751,7 +751,8 @@ alloc_object_size (const gcall *call, int object_size_type)
gcc_assert (is_gimple_call (call));
tree calltype;
- if (tree callfn = gimple_call_fndecl (call))
+ tree callfn = gimple_call_fndecl (call);
+ if (callfn)
calltype = TREE_TYPE (callfn);
else
calltype = gimple_call_fntype (call);
@@ -771,12 +772,13 @@ alloc_object_size (const gcall *call, int object_size_type)
if (TREE_CHAIN (p))
arg2 = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (p)))-1;
}
+ else if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
+ && callfn && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (callfn)))
+ arg1 = 0;
- if (arg1 < 0 || arg1 >= (int)gimple_call_num_args (call)
- || TREE_CODE (gimple_call_arg (call, arg1)) != INTEGER_CST
- || (arg2 >= 0
- && (arg2 >= (int)gimple_call_num_args (call)
- || TREE_CODE (gimple_call_arg (call, arg2)) != INTEGER_CST)))
+ /* Non-const arguments are OK here, let the caller handle constness. */
+ if (arg1 < 0 || arg1 >= (int) gimple_call_num_args (call)
+ || arg2 >= (int) gimple_call_num_args (call))
return size_unknown (object_size_type);
tree bytes = NULL_TREE;
@@ -787,7 +789,10 @@ alloc_object_size (const gcall *call, int object_size_type)
else if (arg1 >= 0)
bytes = fold_convert (sizetype, gimple_call_arg (call, arg1));
- return bytes;
+ if (bytes)
+ return STRIP_NOPS (bytes);
+
+ return size_unknown (object_size_type);
}
@@ -1242,6 +1247,9 @@ call_object_size (struct object_size_info *osi, tree ptr, gcall *call)
gcc_assert (osi->pass == 0);
tree bytes = alloc_object_size (call, object_size_type);
+ if (!(object_size_type & OST_DYNAMIC) && TREE_CODE (bytes) != INTEGER_CST)
+ bytes = size_unknown (object_size_type);
+
object_sizes_set (osi, varno, bytes, bytes);
}