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

Reply via email to