Switch to dynamic offset so that we can support Sv39, Sv48, and Sv57 at the same time without building multiple libasan versions!
[1] https://github.com/llvm/llvm-project/commit/da0c8b275564f814a53a5c19497669ae2d99538d gcc/ChangeLog: * config/riscv/riscv.cc (riscv_asan_shadow_offset): Use dynamic offset for RV64. (riscv_asan_dynamic_shadow_offset_p): New. --- gcc/config/riscv/riscv.cc | 15 +++++++++++---- gcc/testsuite/g++.dg/asan/asan_test.cc | 3 +++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 4ee04776a60e..b983186276a4 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -11191,11 +11191,18 @@ riscv_gpr_save_operation_p (rtx op) static unsigned HOST_WIDE_INT riscv_asan_shadow_offset (void) { - /* We only have libsanitizer support for RV64 at present. + /* This number must match ASAN_SHADOW_OFFSET_CONST in the file + libsanitizer/asan/asan_mapping.h, we use 0 here because RV64 + using dynamic shadow offset, and RV32 isn't support yet. */ + return 0; +} + +/* Implement TARGET_ASAN_DYNAMIC_SHADOW_OFFSET_P. */ - This number must match ASAN_SHADOW_OFFSET_CONST in the file - libsanitizer/asan/asan_mapping.h. */ - return TARGET_64BIT ? HOST_WIDE_INT_UC (0xd55550000) : 0; +static bool +riscv_asan_dynamic_shadow_offset_p (void) +{ + return TARGET_64BIT; } /* Implement TARGET_MANGLE_TYPE. */ diff --git a/gcc/testsuite/g++.dg/asan/asan_test.cc b/gcc/testsuite/g++.dg/asan/asan_test.cc index 0d976801cf19..65580afd934b 100644 --- a/gcc/testsuite/g++.dg/asan/asan_test.cc +++ b/gcc/testsuite/g++.dg/asan/asan_test.cc @@ -932,6 +932,9 @@ TEST(AddressSanitizer, ShadowGapTest) { #else # if defined(__powerpc64__) char *addr = (char*)0x024000800000; +# elif defined(__riscv) && __riscv_xlen == 64 + extern void *__asan_shadow_memory_dynamic_address; + char *addr = (char*)__asan_shadow_memory_dynamic_address + 0x1000; # else char *addr = (char*)0x0000100000080000; # endif -- 2.34.1