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.
This commit is contained in:
Kito Cheng 2020-07-22 14:50:40 +08:00
parent 5029d42c40
commit 2ca1b6d009
5 changed files with 40 additions and 2 deletions

View File

@ -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

View File

@ -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);

View File

@ -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 } */

View File

@ -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);
}

View File

@ -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. */