mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-02 03:45:28 +08:00
Asan changes for RISC-V.
We have only riscv64 asan support, there is no riscv32 support as yet. So I need to be able to conditionally enable asan support for the riscv target. I implemented this by returning zero from the asan_shadow_offset function. This requires a change to toplev.c and docs in target.def. gcc/ * config/riscv/riscv.c (riscv_asan_shadow_offset): New. (TARGET_ASAN_SHADOW_OFFSET): New. * doc/tm.texi: Regenerated. * target.def (asan_shadow_offset); Mention that it can return zero. * toplev.c (process_options): Check for and handle zero return from targetm.asan_shadow_offset call. Co-Authored-By: cooper.joshua <cooper.joshua@linux.alibaba.com>
This commit is contained in:
parent
a4dd85e015
commit
dcf0dde488
@ -5299,6 +5299,19 @@ riscv_gpr_save_operation_p (rtx op)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Implement TARGET_ASAN_SHADOW_OFFSET. */
|
||||||
|
|
||||||
|
static unsigned HOST_WIDE_INT
|
||||||
|
riscv_asan_shadow_offset (void)
|
||||||
|
{
|
||||||
|
/* We only have libsanitizer support for RV64 at present.
|
||||||
|
|
||||||
|
This number must match kRiscv*_ShadowOffset* in the file
|
||||||
|
libsanitizer/asan/asan_mapping.h which is currently 1<<29 for rv64,
|
||||||
|
even though 1<<36 makes more sense. */
|
||||||
|
return TARGET_64BIT ? (HOST_WIDE_INT_1 << 29) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize the GCC target structure. */
|
/* Initialize the GCC target structure. */
|
||||||
#undef TARGET_ASM_ALIGNED_HI_OP
|
#undef TARGET_ASM_ALIGNED_HI_OP
|
||||||
#define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
|
#define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
|
||||||
@ -5482,6 +5495,9 @@ riscv_gpr_save_operation_p (rtx op)
|
|||||||
#undef TARGET_NEW_ADDRESS_PROFITABLE_P
|
#undef TARGET_NEW_ADDRESS_PROFITABLE_P
|
||||||
#define TARGET_NEW_ADDRESS_PROFITABLE_P riscv_new_address_profitable_p
|
#define TARGET_NEW_ADDRESS_PROFITABLE_P riscv_new_address_profitable_p
|
||||||
|
|
||||||
|
#undef TARGET_ASAN_SHADOW_OFFSET
|
||||||
|
#define TARGET_ASAN_SHADOW_OFFSET riscv_asan_shadow_offset
|
||||||
|
|
||||||
struct gcc_target targetm = TARGET_INITIALIZER;
|
struct gcc_target targetm = TARGET_INITIALIZER;
|
||||||
|
|
||||||
#include "gt-riscv.h"
|
#include "gt-riscv.h"
|
||||||
|
@ -12094,7 +12094,8 @@ is zero, which disables this optimization.
|
|||||||
@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_ASAN_SHADOW_OFFSET (void)
|
@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_ASAN_SHADOW_OFFSET (void)
|
||||||
Return the offset bitwise ored into shifted address to get corresponding
|
Return the offset bitwise ored into shifted address to get corresponding
|
||||||
Address Sanitizer shadow memory address. NULL if Address Sanitizer is not
|
Address Sanitizer shadow memory address. NULL if Address Sanitizer is not
|
||||||
supported by the target.
|
supported by the target. May return 0 if Address Sanitizer is not supported
|
||||||
|
by a subtarget.
|
||||||
@end deftypefn
|
@end deftypefn
|
||||||
|
|
||||||
@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_MEMMODEL_CHECK (unsigned HOST_WIDE_INT @var{val})
|
@deftypefn {Target Hook} {unsigned HOST_WIDE_INT} TARGET_MEMMODEL_CHECK (unsigned HOST_WIDE_INT @var{val})
|
||||||
|
@ -4462,7 +4462,8 @@ DEFHOOK
|
|||||||
(asan_shadow_offset,
|
(asan_shadow_offset,
|
||||||
"Return the offset bitwise ored into shifted address to get corresponding\n\
|
"Return the offset bitwise ored into shifted address to get corresponding\n\
|
||||||
Address Sanitizer shadow memory address. NULL if Address Sanitizer is not\n\
|
Address Sanitizer shadow memory address. NULL if Address Sanitizer is not\n\
|
||||||
supported by the target.",
|
supported by the target. May return 0 if Address Sanitizer is not supported\n\
|
||||||
|
by a subtarget.",
|
||||||
unsigned HOST_WIDE_INT, (void),
|
unsigned HOST_WIDE_INT, (void),
|
||||||
NULL)
|
NULL)
|
||||||
|
|
||||||
|
@ -1834,7 +1834,8 @@ process_options (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((flag_sanitize & SANITIZE_USER_ADDRESS)
|
if ((flag_sanitize & SANITIZE_USER_ADDRESS)
|
||||||
&& targetm.asan_shadow_offset == NULL)
|
&& ((targetm.asan_shadow_offset == NULL)
|
||||||
|
|| (targetm.asan_shadow_offset () == 0)))
|
||||||
{
|
{
|
||||||
warning_at (UNKNOWN_LOCATION, 0,
|
warning_at (UNKNOWN_LOCATION, 0,
|
||||||
"%<-fsanitize=address%> not supported for this target");
|
"%<-fsanitize=address%> not supported for this target");
|
||||||
|
Loading…
Reference in New Issue
Block a user