aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/asan.h7
-rw-r--r--gcc/builtins.cc3
-rw-r--r--gcc/testsuite/c-c++-common/hwasan/builtin-special-handling.c18
3 files changed, 17 insertions, 11 deletions
diff --git a/gcc/asan.h b/gcc/asan.h
index 82811bd..d1bf8b1 100644
--- a/gcc/asan.h
+++ b/gcc/asan.h
@@ -185,8 +185,13 @@ extern hash_set<tree> *asan_handled_variables;
inline bool
asan_intercepted_p (enum built_in_function fcode)
{
+ /* This list should be kept up-to-date with upstream's version at
+ compiler-rt/lib/hwasan/hwasan_platform_interceptors.h. */
if (hwasan_sanitize_p ())
- return false;
+ return fcode == BUILT_IN_MEMCMP
+ || fcode == BUILT_IN_MEMCPY
+ || fcode == BUILT_IN_MEMMOVE
+ || fcode == BUILT_IN_MEMSET;
return fcode == BUILT_IN_INDEX
|| fcode == BUILT_IN_MEMCHR
diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index 1d54ea0..4c04ae0 100644
--- a/gcc/builtins.cc
+++ b/gcc/builtins.cc
@@ -7791,7 +7791,8 @@ expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode,
default:
break;
}
- if (sanitize_flags_p (SANITIZE_ADDRESS) && asan_intercepted_p (fcode))
+ if (sanitize_flags_p (SANITIZE_ADDRESS | SANITIZE_HWADDRESS)
+ && asan_intercepted_p (fcode))
return expand_call (exp, target, ignore);
/* When not optimizing, generate calls to library functions for a certain
diff --git a/gcc/testsuite/c-c++-common/hwasan/builtin-special-handling.c b/gcc/testsuite/c-c++-common/hwasan/builtin-special-handling.c
index a7a6d91..f975baa 100644
--- a/gcc/testsuite/c-c++-common/hwasan/builtin-special-handling.c
+++ b/gcc/testsuite/c-c++-common/hwasan/builtin-special-handling.c
@@ -8,24 +8,24 @@
/* { dg-skip-if "" { *-*-* } { "-flto" } { "-flto-partition=none" } } */
typedef __SIZE_TYPE__ size_t;
-/* Functions to observe that HWASAN instruments memory builtins in the expected
- manner. */
+/* HWASAN used to instrument calls to memset, memcpy, and memmove. It no
+ longer does this. Many other string and memory builtins are intercepted by
+ the runtime (and hence the codegen need not do anything). */
void * __attribute__((noinline))
memset_builtin (void *dest, int value, size_t len)
{
return __builtin_memset (dest, value, len);
}
-/* HWASAN avoids strlen because it doesn't know the size of the memory access
- until *after* the function call. */
size_t __attribute__ ((noinline))
strlen_builtin (char *element)
{
return __builtin_strlen (element);
}
-/* First test ensures that the HWASAN_CHECK was emitted before the
- memset. Second test ensures there was only HWASAN_CHECK (which demonstrates
- that strlen was not instrumented). */
-/* { dg-final { scan-tree-dump-times "HWASAN_CHECK.*memset" 1 "asan1" } } */
-/* { dg-final { scan-tree-dump-times "HWASAN_CHECK" 1 "asan1" } } */
+/* First check here ensures there is no inline instrumentation generated for
+ these builtins. Second checks that we end up calling memset (i.e. that it's
+ not optimised into an inline operation, which would happen without the
+ instrumentation). */
+/* { dg-final { scan-tree-dump-not "HWASAN_CHECK" "asan1" } } */
+/* { dg-final { scan-assembler-times "\tmemset\\M" 1 } } */