re PR sanitizer/80953 (Support libsanitizer on Solaris)
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 13 Mar 2019 09:11:46 +0000 (09:11 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 13 Mar 2019 09:11:46 +0000 (09:11 +0000)
PR sanitizer/80953
Merge from LLVM revision 355978
* sanitizer_common/sanitizer_allocator_primary32.h
(class SizeClassAllocator32): Assert that kSpaceSize is power of 2 if
SANITIZER_SIGN_EXTENDED_ADDRESSES is set.
(PointerIsMine): Deal with SANITIZER_SIGN_EXTENDED_ADDRESSES.
(ComputeRegionId): Likewise.
* sanitizer_common/sanitizer_linux.cc (GetMaxVirtualAddress): Return
appropriate value for SPARC 64-bit.
* sanitizer_common/sanitizer_platform.h (SANITIZER_MMAP_RANGE_SIZE):
Define for SPARC.
(SANITIZER_SIGN_EXTENDED_ADDRESSES): Define to 1 for SPARC 64-bit.

From-SVN: r269639

libsanitizer/ChangeLog
libsanitizer/sanitizer_common/sanitizer_allocator_primary32.h
libsanitizer/sanitizer_common/sanitizer_linux.cc
libsanitizer/sanitizer_common/sanitizer_platform.h

index 3293fe04d4aea586b1c13421f5066f8c49677b17..65df77e742f195b17fe605a966e649ae8291a392 100644 (file)
@@ -1,3 +1,18 @@
+2019-03-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR sanitizer/80953
+       Merge from LLVM revision 355978
+       * sanitizer_common/sanitizer_allocator_primary32.h
+       (class SizeClassAllocator32): Assert that kSpaceSize is power of 2 if
+       SANITIZER_SIGN_EXTENDED_ADDRESSES is set.
+       (PointerIsMine): Deal with SANITIZER_SIGN_EXTENDED_ADDRESSES.
+       (ComputeRegionId): Likewise.
+       * sanitizer_common/sanitizer_linux.cc (GetMaxVirtualAddress): Return
+       appropriate value for SPARC 64-bit.
+       * sanitizer_common/sanitizer_platform.h (SANITIZER_MMAP_RANGE_SIZE):
+       Define for SPARC.
+       (SANITIZER_SIGN_EXTENDED_ADDRESSES): Define to 1 for SPARC 64-bit.
+
 2019-03-13  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR sanitizer/80953
index bdea498fb5ecc3d40ea54b266d7edecd7349831d..de16cf2915113df9592ef1411b3dbd8491555733 100644 (file)
@@ -54,6 +54,9 @@ class SizeClassAllocator32 {
   typedef typename Params::ByteMap ByteMap;
   typedef typename Params::MapUnmapCallback MapUnmapCallback;
 
+  COMPILER_CHECK(!SANITIZER_SIGN_EXTENDED_ADDRESSES ||
+                 (kSpaceSize & (kSpaceSize - 1)) == 0);
+
   static const bool kRandomShuffleChunks = Params::kFlags &
       SizeClassAllocator32FlagMasks::kRandomShuffleChunks;
   static const bool kUseSeparateSizeClassForBatch = Params::kFlags &
@@ -175,6 +178,8 @@ class SizeClassAllocator32 {
 
   bool PointerIsMine(const void *p) {
     uptr mem = reinterpret_cast<uptr>(p);
+    if (SANITIZER_SIGN_EXTENDED_ADDRESSES)
+      mem &= (kSpaceSize - 1);
     if (mem < kSpaceBeg || mem >= kSpaceBeg + kSpaceSize)
       return false;
     return GetSizeClass(p) != 0;
@@ -267,6 +272,8 @@ class SizeClassAllocator32 {
   COMPILER_CHECK(sizeof(SizeClassInfo) % kCacheLineSize == 0);
 
   uptr ComputeRegionId(uptr mem) {
+    if (SANITIZER_SIGN_EXTENDED_ADDRESSES)
+      mem &= (kSpaceSize - 1);
     const uptr res = mem >> kRegionSizeLog;
     CHECK_LT(res, kNumPossibleRegions);
     return res;
index 84c81a4eea91bd45e397e30c31acdc46294efa69..dc1e98496799184b91d38dab0938603f411dd6e6 100644 (file)
@@ -1064,6 +1064,8 @@ uptr GetMaxVirtualAddress() {
   return (1ULL << 40) - 1;  // 0x000000ffffffffffUL;
 # elif defined(__s390x__)
   return (1ULL << 53) - 1;  // 0x001fffffffffffffUL;
+# elif defined(__sparc__)
+  return ~(uptr)0;
 # else
   return (1ULL << 47) - 1;  // 0x00007fffffffffffUL;
 # endif
index 192667989f487ab1673ca70687fe7c2e7cd5f1ee..cc72d528713857fd14c2e0813936c82e7523ae40 100644 (file)
 # else
 #  define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 48)
 # endif
+#elif defined(__sparc__)
+# define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 52)
 #else
 # define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
 #endif
 
+// Whether the addresses are sign-extended from the VMA range to the word.
+// The SPARC64 Linux port implements this to split the VMA space into two
+// non-contiguous halves with a huge hole in the middle.
+#if defined(__sparc__) && SANITIZER_WORDSIZE == 64
+# define SANITIZER_SIGN_EXTENDED_ADDRESSES 1
+#else
+# define SANITIZER_SIGN_EXTENDED_ADDRESSES 0
+#endif
+
 // The AArch64 linux port uses the canonical syscall set as mandated by
 // the upstream linux community for all new ports. Other ports may still
 // use legacy syscalls.