[RISC-V] Add support for AddressSanitizer on RISC-V GCC
From: cooper.joshua gcc/ * config/riscv/riscv.c (asan_shadow_offset): Implement the offset of asan shadow memory for risc-v. (asan_shadow_offset): new macro definition. libsanitizer/ * sanitizer_common/sanitizer_common.h (ModuleArch): New enumerator. (ModuleArchToString): New architecture option. * sanitizer_common/sanitizer_platform.h: New macro definition. * sanitizer_common/sanitizer_symbolizer_libcdep.cpp (GetArgV): New architecture option. --- gcc/config/riscv/riscv.c | 11 +++ libsanitizer/sanitizer_common/sanitizer_common.h | 5 - libsanitizer/sanitizer_common/sanitizer_platform.h| 6 ++ .../sanitizer_common/sanitizer_symbolizer_libcdep.cpp | 2 ++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index bfb3885..05669c2 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -5245,6 +5245,14 @@ riscv_gpr_save_operation_p (rtx op)linux.alibaba return true; } +/* Implement TARGET_ASAN_SHADOW_OFFSET. */ + +static unsigned HOST_WIDE_INT +riscv_asan_shadow_offset (void) +{ + return HOST_WIDE_INT_UC (0x1000); +} + /* Initialize the GCC target structure. */ #undef TARGET_ASM_ALIGNED_HI_OP #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" @@ -5428,6 +5436,9 @@ riscv_gpr_save_operation_p (rtx op) #undef TARGET_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; #include "gt-riscv.h" diff --git a/libsanitizer/sanitizer_common/sanitizer_common.h b/libsanitizer/sanitizer_common/sanitizer_common.h index ac16e0e..ea7dff7 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common.h +++ b/libsanitizer/sanitizer_common/sanitizer_common.h @@ -649,7 +649,8 @@ enum ModuleArch { kModuleArchARMV7, kModuleArchARMV7S, kModuleArchARMV7K, - kModuleArchARM64 + kModuleArchARM64, + kModuleArchRISCV }; // Opens the file 'file_name" and reads up to 'max_len' bytes. @@ -693,6 +694,8 @@ inline const char *ModuleArchToString(ModuleArch arch) { return "armv7k"; case kModuleArchARM64: return "arm64"; +case kModuleArchRISCV: + return "riscv"; } CHECK(0 && "Invalid module arch"); return ""; diff --git a/libsanitizer/sanitizer_common/sanitizer_platform.h b/libsanitizer/sanitizer_common/sanitizer_platform.h index c68bfa2..bf52490 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform.h +++ b/libsanitizer/sanitizer_common/sanitizer_platform.h @@ -126,6 +126,12 @@ # define FIRST_32_SECOND_64(a, b) (a) #endif +#if defined(__riscv__) +# define SANITIZER_RISCV 1 +#else +# define SANITIZER_RISCV 0 +#endif + #if defined(__x86_64__) && !defined(_LP64) # define SANITIZER_X32 1 #else diff --git a/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp index 490c6fe..408f57d 100644 --- a/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp @@ -270,6 +270,8 @@ class LLVMSymbolizerProcess : public SymbolizerProcess { const char* const kSymbolizerArch = "--default-arch=s390x"; #elif defined(__s390__) const char* const kSymbolizerArch = "--default-arch=s390"; +#elif defined(__riscv__) +const char* const kSymbolizerArch = "--default-arch=riscv"; #else const char* const kSymbolizerArch = "--default-arch=unknown"; #endif -- 2.7.4
[RISC-V] Add support for AddressSanitizer on RISC-V GCC
From: shaj gcc/ * config/riscv/riscv.c (asan_shadow_offset): Implement the offset of asan shadow memory for risc-v. (asan_shadow_offset): new macro definition. libsanitizer/ * sanitizer_common/sanitizer_common.h (ModuleArch): New enumerator. (ModuleArchToString): New architecture option. * sanitizer_common/sanitizer_platform.h: New macro definition. * sanitizer_common/sanitizer_symbolizer_libcdep.cpp (GetArgV): New architecture option. --- gcc/config/riscv/riscv.c | 11 +++ libsanitizer/sanitizer_common/sanitizer_common.h | 5 - libsanitizer/sanitizer_common/sanitizer_platform.h| 6 ++ .../sanitizer_common/sanitizer_symbolizer_libcdep.cpp | 2 ++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index bfb3885..05669c2 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -5245,6 +5245,14 @@ riscv_gpr_save_operation_p (rtx op) return true; } +/* Implement TARGET_ASAN_SHADOW_OFFSET. */ + +static unsigned HOST_WIDE_INT +riscv_asan_shadow_offset (void) +{ + return HOST_WIDE_INT_UC (0x1000); +} + /* Initialize the GCC target structure. */ #undef TARGET_ASM_ALIGNED_HI_OP #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" @@ -5428,6 +5436,9 @@ riscv_gpr_save_operation_p (rtx op) #undef TARGET_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; #include "gt-riscv.h" diff --git a/libsanitizer/sanitizer_common/sanitizer_common.h b/libsanitizer/sanitizer_common/sanitizer_common.h index ac16e0e..ea7dff7 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common.h +++ b/libsanitizer/sanitizer_common/sanitizer_common.h @@ -649,7 +649,8 @@ enum ModuleArch { kModuleArchARMV7, kModuleArchARMV7S, kModuleArchARMV7K, - kModuleArchARM64 + kModuleArchARM64, + kModuleArchRISCV }; // Opens the file 'file_name" and reads up to 'max_len' bytes. @@ -693,6 +694,8 @@ inline const char *ModuleArchToString(ModuleArch arch) { return "armv7k"; case kModuleArchARM64: return "arm64"; +case kModuleArchRISCV: + return "riscv"; } CHECK(0 && "Invalid module arch"); return ""; diff --git a/libsanitizer/sanitizer_common/sanitizer_platform.h b/libsanitizer/sanitizer_common/sanitizer_platform.h index c68bfa2..bf52490 100644 --- a/libsanitizer/sanitizer_common/sanitizer_platform.h +++ b/libsanitizer/sanitizer_common/sanitizer_platform.h @@ -126,6 +126,12 @@ # define FIRST_32_SECOND_64(a, b) (a) #endif +#if defined(__riscv__) +# define SANITIZER_RISCV 1 +#else +# define SANITIZER_RISCV 0 +#endif + #if defined(__x86_64__) && !defined(_LP64) # define SANITIZER_X32 1 #else diff --git a/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp index 490c6fe..408f57d 100644 --- a/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_symbolizer_libcdep.cpp @@ -270,6 +270,8 @@ class LLVMSymbolizerProcess : public SymbolizerProcess { const char* const kSymbolizerArch = "--default-arch=s390x"; #elif defined(__s390__) const char* const kSymbolizerArch = "--default-arch=s390"; +#elif defined(__riscv__) +const char* const kSymbolizerArch = "--default-arch=riscv"; #else const char* const kSymbolizerArch = "--default-arch=unknown"; #endif -- 2.7.4