aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKito Cheng <kito.cheng@sifive.com>2020-07-22 14:50:40 +0800
committerKito Cheng <kito.cheng@sifive.com>2020-07-23 14:57:31 +0800
commit2ca1b6d009b194286c3ec91f9c51cc6b0a475458 (patch)
treeaf63dcdcbc211febcb5323810b4a881e5a4f8a00 /gcc
parent5029d42c4014ce8c9771ba7b8280d5e7770b6dee (diff)
downloadgcc-2ca1b6d009b194286c3ec91f9c51cc6b0a475458.zip
gcc-2ca1b6d009b194286c3ec91f9c51cc6b0a475458.tar.gz
gcc-2ca1b6d009b194286c3ec91f9c51cc6b0a475458.tar.bz2
PR target/96260 - KASAN should work even back-end not porting anything.
- Most KASAN function don't need any porting anything in back-end except asan stack protection. - However kernel will given shadow offset when enable asan stack protection, so eveything in KASAN can work if shadow offset is given. - Verified with x86 and risc-v. - Verified with RISC-V linux kernel. gcc/ChangeLog: PR target/96260 * asan.c (asan_shadow_offset_set_p): New. * asan.h (asan_shadow_offset_set_p): Ditto. * toplev.c (process_options): Allow -fsanitize=kernel-address even TARGET_ASAN_SHADOW_OFFSET not implemented, only check when asan stack protection is enabled. gcc/testsuite/ChangeLog: PR target/96260 * gcc.target/riscv/pr91441.c: Update warning message. * gcc.target/riscv/pr96260.c: New.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/asan.c7
-rw-r--r--gcc/asan.h2
-rw-r--r--gcc/testsuite/gcc.target/riscv/pr91441.c2
-rw-r--r--gcc/testsuite/gcc.target/riscv/pr96260.c9
-rw-r--r--gcc/toplev.c22
5 files changed, 40 insertions, 2 deletions
diff --git a/gcc/asan.c b/gcc/asan.c
index 9c9aa4c..0b471af 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -344,6 +344,13 @@ asan_shadow_offset ()
return asan_shadow_offset_value;
}
+/* Returns Asan shadow offset has been set. */
+bool
+asan_shadow_offset_set_p ()
+{
+ return asan_shadow_offset_computed;
+}
+
alias_set_type asan_shadow_set = -1;
/* Pointer types to 1, 2 or 4 byte integers in shadow memory. A separate
diff --git a/gcc/asan.h b/gcc/asan.h
index 9efd33f..114b457 100644
--- a/gcc/asan.h
+++ b/gcc/asan.h
@@ -129,6 +129,8 @@ asan_var_and_redzone_size (unsigned HOST_WIDE_INT size)
extern bool set_asan_shadow_offset (const char *);
+extern bool asan_shadow_offset_set_p ();
+
extern void set_sanitized_sections (const char *);
extern bool asan_sanitize_stack_p (void);
diff --git a/gcc/testsuite/gcc.target/riscv/pr91441.c b/gcc/testsuite/gcc.target/riscv/pr91441.c
index 593a297..b55df5e 100644
--- a/gcc/testsuite/gcc.target/riscv/pr91441.c
+++ b/gcc/testsuite/gcc.target/riscv/pr91441.c
@@ -7,4 +7,4 @@ int *f( int a)
{
return bar(&a);
}
-/* { dg-warning ".'-fsanitize=address' and '-fsanitize=kernel-address' are not supported for this target" "" { target *-*-* } 0 } */
+/* { dg-warning ".'-fsanitize=kernel-address' with stack protection is not supported without '-fasan-shadow-offset=' for this target" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/gcc.target/riscv/pr96260.c b/gcc/testsuite/gcc.target/riscv/pr96260.c
new file mode 100644
index 0000000..229997f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/pr96260.c
@@ -0,0 +1,9 @@
+/* PR target/96260 */
+/* { dg-do compile } */
+/* { dg-options "--param asan-stack=1 -fsanitize=kernel-address -fasan-shadow-offset=0x100000" } */
+
+int *bar(int *);
+int *f( int a)
+{
+ return bar(&a);
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 95eea63..2bd1888 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1835,7 +1835,7 @@ process_options (void)
/* Address Sanitizer needs porting to each target architecture. */
if ((flag_sanitize & SANITIZE_ADDRESS)
- && (!FRAME_GROWS_DOWNWARD || targetm.asan_shadow_offset == NULL))
+ && !FRAME_GROWS_DOWNWARD)
{
warning_at (UNKNOWN_LOCATION, 0,
"%<-fsanitize=address%> and %<-fsanitize=kernel-address%> "
@@ -1843,6 +1843,26 @@ process_options (void)
flag_sanitize &= ~SANITIZE_ADDRESS;
}
+ if ((flag_sanitize & SANITIZE_USER_ADDRESS)
+ && targetm.asan_shadow_offset == NULL)
+ {
+ warning_at (UNKNOWN_LOCATION, 0,
+ "%<-fsanitize=address%> not supported for this target");
+ flag_sanitize &= ~SANITIZE_ADDRESS;
+ }
+
+ if ((flag_sanitize & SANITIZE_KERNEL_ADDRESS)
+ && (targetm.asan_shadow_offset == NULL
+ && param_asan_stack
+ && !asan_shadow_offset_set_p ()))
+ {
+ warning_at (UNKNOWN_LOCATION, 0,
+ "%<-fsanitize=kernel-address%> with stack protection "
+ "is not supported without %<-fasan-shadow-offset=%> "
+ "for this target");
+ flag_sanitize &= ~SANITIZE_ADDRESS;
+ }
+
/* Do not use IPA optimizations for register allocation if profiler is active
or patchable function entries are inserted for run-time instrumentation
or port does not emit prologue and epilogue as RTL. */