diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2024-03-05 19:48:25 +0000 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2024-03-05 19:48:25 +0000 |
commit | fca6f6fddb22b8665e840f455a7d0318d4575227 (patch) | |
tree | e805561f832aee10043c1b5489fec0d4765af7c1 | |
parent | 8776468d9e57ace5f832c1368243a6dbce9984d5 (diff) | |
download | gcc-fca6f6fddb22b8665e840f455a7d0318d4575227.zip gcc-fca6f6fddb22b8665e840f455a7d0318d4575227.tar.gz gcc-fca6f6fddb22b8665e840f455a7d0318d4575227.tar.bz2 |
asan: Handle poly-int sizes in ASAN_MARK [PR97696]
This patch makes the expansion of IFN_ASAN_MARK let through
poly-int-sized objects. The expansion itself was already generic
enough, but the tests for the fast path were too strict.
gcc/
PR sanitizer/97696
* asan.cc (asan_expand_mark_ifn): Allow the length to be a poly_int.
gcc/testsuite/
PR sanitizer/97696
* gcc.target/aarch64/sve/pr97696.c: New test.
-rw-r--r-- | gcc/asan.cc | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/sve/pr97696.c | 29 |
2 files changed, 33 insertions, 5 deletions
diff --git a/gcc/asan.cc b/gcc/asan.cc index 0fd7dd1..d621ec9 100644 --- a/gcc/asan.cc +++ b/gcc/asan.cc @@ -3795,9 +3795,7 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter) } tree len = gimple_call_arg (g, 2); - gcc_assert (tree_fits_shwi_p (len)); - unsigned HOST_WIDE_INT size_in_bytes = tree_to_shwi (len); - gcc_assert (size_in_bytes); + gcc_assert (poly_int_tree_p (len)); g = gimple_build_assign (make_ssa_name (pointer_sized_int_node), NOP_EXPR, base); @@ -3806,9 +3804,10 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter) tree base_addr = gimple_assign_lhs (g); /* Generate direct emission if size_in_bytes is small. */ - if (size_in_bytes - <= (unsigned)param_use_after_scope_direct_emission_threshold) + unsigned threshold = param_use_after_scope_direct_emission_threshold; + if (tree_fits_uhwi_p (len) && tree_to_uhwi (len) <= threshold) { + unsigned HOST_WIDE_INT size_in_bytes = tree_to_uhwi (len); const unsigned HOST_WIDE_INT shadow_size = shadow_mem_size (size_in_bytes); const unsigned int shadow_align diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr97696.c b/gcc/testsuite/gcc.target/aarch64/sve/pr97696.c new file mode 100644 index 0000000..8b7de18 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr97696.c @@ -0,0 +1,29 @@ +/* { dg-skip-if "" { no_fsanitize_address } } */ +/* { dg-options "-fsanitize=address -fsanitize-address-use-after-scope" } */ + +#include <arm_sve.h> + +__attribute__((noinline, noclone)) int +foo (char *a) +{ + int i, j = 0; + asm volatile ("" : "+r" (a) : : "memory"); + for (i = 0; i < 12; i++) + j += a[i]; + return j; +} + +int +main () +{ + int i, j = 0; + for (i = 0; i < 4; i++) + { + char a[12]; + __SVInt8_t freq; + __builtin_bcmp (&freq, a, 10); + __builtin_memset (a, 0, sizeof (a)); + j += foo (a); + } + return j; +} |