https://gcc.gnu.org/g:c84a8a274af3163a4042bcfd77dd1988bd1eb0ce

commit r15-5645-gc84a8a274af3163a4042bcfd77dd1988bd1eb0ce
Author: Kito Cheng <kito.ch...@sifive.com>
Date:   Fri Nov 15 12:14:55 2024 +0800

    RISC-V: Use dynamic shadow offset
    
    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.
            (TARGET_ASAN_DYNAMIC_SHADOW_OFFSET_P): New.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/asan/asan_test.cc: Update the testcase for dynamic
            offset.

Diff:
---
 gcc/config/riscv/riscv.cc              | 18 ++++++++++++++----
 gcc/testsuite/g++.dg/asan/asan_test.cc |  3 +++
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 8f5b43e2c245..efdb1d332831 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -11226,11 +11226,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.  */
@@ -13764,6 +13771,9 @@ riscv_use_by_pieces_infrastructure_p (unsigned 
HOST_WIDE_INT size,
 #undef TARGET_ASAN_SHADOW_OFFSET
 #define TARGET_ASAN_SHADOW_OFFSET riscv_asan_shadow_offset
 
+#undef TARGET_ASAN_DYNAMIC_SHADOW_OFFSET_P
+#define TARGET_ASAN_DYNAMIC_SHADOW_OFFSET_P riscv_asan_dynamic_shadow_offset_p
+
 #ifdef TARGET_BIG_ENDIAN_DEFAULT
 #undef  TARGET_DEFAULT_TARGET_FLAGS
 #define TARGET_DEFAULT_TARGET_FLAGS (MASK_BIG_ENDIAN)
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

Reply via email to