[compiler-rt] r298848 - Use pthreads for thread-local lsan allocator cache on darwin

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 27 15:37:12 PDT 2017


The patch is probably responsible for

http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/1175/steps/64-bit%20check-asan-dynamic/logs/stdio

FAIL: AddressSanitizer-i386-linux-dynamic ::
TestCases/Linux/asan_dlopen_test.cc (431 of 1202)
******************** TEST 'AddressSanitizer-i386-linux-dynamic ::
TestCases/Linux/asan_dlopen_test.cc' FAILED ********************
Script:
--
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/./bin/clang
--driver-mode=g++ -m32
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/asan/TestCases/Linux/asan_dlopen_test.cc
-DRT=\"libclang_rt.asan-i386.so\" -o
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/tools/clang/runtime/compiler-rt-bins/test/asan/I386LinuxDynamicConfig/TestCases/Linux/Output/asan_dlopen_test.cc.tmp
-ldl
not  /mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/tools/clang/runtime/compiler-rt-bins/test/asan/I386LinuxDynamicConfig/TestCases/Linux/Output/asan_dlopen_test.cc.tmp
2>&1 | FileCheck
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/asan/TestCases/Linux/asan_dlopen_test.cc
--
Exit Code: 2

Command Output (stderr):
--
FileCheck error: '-' is empty.
FileCheck command line:  FileCheck
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/asan/TestCases/Linux/asan_dlopen_test.cc
--

********************
Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60..
FAIL: AddressSanitizer-x86_64-linux-dynamic ::
TestCases/Linux/asan_dlopen_test.cc (827 of 1202)
******************** TEST 'AddressSanitizer-x86_64-linux-dynamic ::
TestCases/Linux/asan_dlopen_test.cc' FAILED ********************
Script:
--
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/./bin/clang
--driver-mode=g++ -m64
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/asan/TestCases/Linux/asan_dlopen_test.cc
-DRT=\"libclang_rt.asan-x86_64.so\" -o
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/tools/clang/runtime/compiler-rt-bins/test/asan/X86_64LinuxDynamicConfig/TestCases/Linux/Output/asan_dlopen_test.cc.tmp
-ldl
not  /mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm_build64/tools/clang/runtime/compiler-rt-bins/test/asan/X86_64LinuxDynamicConfig/TestCases/Linux/Output/asan_dlopen_test.cc.tmp
2>&1 | FileCheck
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/asan/TestCases/Linux/asan_dlopen_test.cc
--
Exit Code: 2

Command Output (stderr):
--
FileCheck error: '-' is empty.
FileCheck command line:  FileCheck
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/projects/compiler-rt/test/asan/TestCases/Linux/asan_dlopen_test.cc

--

********************
Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90..
Testing Time: 26.66s
********************


On Mon, Mar 27, 2017 at 7:20 AM Francis Ricci via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: fjricci
> Date: Mon Mar 27 09:07:50 2017
> New Revision: 298848
>
> URL: http://llvm.org/viewvc/llvm-project?rev=298848&view=rev
> Log:
> Use pthreads for thread-local lsan allocator cache on darwin
>
> Summary:
> This patch allows us to move away from using __thread on darwin,
> which is requiring for building lsan for darwin on ios version 7
> and on iossim i386.
>
> Reviewers: kubamracek, kcc
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D31291
>
> Modified:
>     compiler-rt/trunk/lib/lsan/lsan_allocator.cc
>     compiler-rt/trunk/lib/lsan/lsan_allocator.h
>     compiler-rt/trunk/lib/lsan/lsan_common_linux.cc
>     compiler-rt/trunk/lib/lsan/lsan_common_mac.cc
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_allocator.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_allocator.cc?rev=298848&r1=298847&r2=298848&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_allocator.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_allocator.cc Mon Mar 27 09:07:50 2017
> @@ -24,54 +24,18 @@
>  extern "C" void *memset(void *ptr, int value, uptr num);
>
>  namespace __lsan {
> -
> -struct ChunkMetadata {
> -  u8 allocated : 8;  // Must be first.
> -  ChunkTag tag : 2;
> -#if SANITIZER_WORDSIZE == 64
> -  uptr requested_size : 54;
> -#else
> -  uptr requested_size : 32;
> -  uptr padding : 22;
> -#endif
> -  u32 stack_trace_id;
> -};
> -
> -#if defined(__mips64) || defined(__aarch64__) || defined(__i386__)
>  #if defined(__i386__)
>  static const uptr kMaxAllowedMallocSize = 1UL << 30;
> -#else
> +#elif defined(__mips64) || defined(__aarch64__)
>  static const uptr kMaxAllowedMallocSize = 4UL << 30;
> -#endif
> -static const uptr kRegionSizeLog = 20;
> -static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >>
> kRegionSizeLog;
> -typedef TwoLevelByteMap<(kNumRegions >> 12), 1 << 12> ByteMap;
> -typedef CompactSizeClassMap SizeClassMap;
> -typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE,
> -    sizeof(ChunkMetadata), SizeClassMap, kRegionSizeLog, ByteMap>
> -    PrimaryAllocator;
>  #else
>  static const uptr kMaxAllowedMallocSize = 8UL << 30;
> -
> -struct AP64 {  // Allocator64 parameters. Deliberately using a short name.
> -  static const uptr kSpaceBeg = 0x600000000000ULL;
> -  static const uptr kSpaceSize =  0x40000000000ULL; // 4T.
> -  static const uptr kMetadataSize = sizeof(ChunkMetadata);
> -  typedef DefaultSizeClassMap SizeClassMap;
> -  typedef NoOpMapUnmapCallback MapUnmapCallback;
> -  static const uptr kFlags = 0;
> -};
> -
> -typedef SizeClassAllocator64<AP64> PrimaryAllocator;
>  #endif
> -typedef SizeClassAllocatorLocalCache<PrimaryAllocator> AllocatorCache;
>  typedef LargeMmapAllocator<> SecondaryAllocator;
>  typedef CombinedAllocator<PrimaryAllocator, AllocatorCache,
>            SecondaryAllocator> Allocator;
>
>  static Allocator allocator;
> -static THREADLOCAL AllocatorCache allocator_cache;
> -AllocatorCache *GetAllocatorCache() { return &allocator_cache; }
>
>  void InitializeAllocator() {
>    allocator.InitLinkerInitialized(
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_allocator.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_allocator.h?rev=298848&r1=298847&r2=298848&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_allocator.h (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_allocator.h Mon Mar 27 09:07:50 2017
> @@ -15,8 +15,10 @@
>  #ifndef LSAN_ALLOCATOR_H
>  #define LSAN_ALLOCATOR_H
>
> +#include "sanitizer_common/sanitizer_allocator.h"
>  #include "sanitizer_common/sanitizer_common.h"
>  #include "sanitizer_common/sanitizer_internal_defs.h"
> +#include "lsan_common.h"
>
>  namespace __lsan {
>
> @@ -34,6 +36,41 @@ void GetAllocatorCacheRange(uptr *begin,
>  void AllocatorThreadFinish();
>  void InitializeAllocator();
>
> +struct ChunkMetadata {
> +  u8 allocated : 8;  // Must be first.
> +  ChunkTag tag : 2;
> +#if SANITIZER_WORDSIZE == 64
> +  uptr requested_size : 54;
> +#else
> +  uptr requested_size : 32;
> +  uptr padding : 22;
> +#endif
> +  u32 stack_trace_id;
> +};
> +
> +#if defined(__mips64) || defined(__aarch64__) || defined(__i386__)
> +static const uptr kRegionSizeLog = 20;
> +static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >>
> kRegionSizeLog;
> +typedef TwoLevelByteMap<(kNumRegions >> 12), 1 << 12> ByteMap;
> +typedef CompactSizeClassMap SizeClassMap;
> +typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE,
> +    sizeof(ChunkMetadata), SizeClassMap, kRegionSizeLog, ByteMap>
> +    PrimaryAllocator;
> +#elif defined(__x86_64__)
> +struct AP64 {  // Allocator64 parameters. Deliberately using a short name.
> +  static const uptr kSpaceBeg = 0x600000000000ULL;
> +  static const uptr kSpaceSize =  0x40000000000ULL; // 4T.
> +  static const uptr kMetadataSize = sizeof(ChunkMetadata);
> +  typedef DefaultSizeClassMap SizeClassMap;
> +  typedef NoOpMapUnmapCallback MapUnmapCallback;
> +  static const uptr kFlags = 0;
> +};
> +
> +typedef SizeClassAllocator64<AP64> PrimaryAllocator;
> +#endif
> +typedef SizeClassAllocatorLocalCache<PrimaryAllocator> AllocatorCache;
> +
> +AllocatorCache *GetAllocatorCache();
>  }  // namespace __lsan
>
>  #endif  // LSAN_ALLOCATOR_H
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_common_linux.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common_linux.cc?rev=298848&r1=298847&r2=298848&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_common_linux.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_common_linux.cc Mon Mar 27 09:07:50
> 2017
> @@ -22,6 +22,7 @@
>  #include "sanitizer_common/sanitizer_flags.h"
>  #include "sanitizer_common/sanitizer_linux.h"
>  #include "sanitizer_common/sanitizer_stackdepot.h"
> +#include "lsan_allocator.h"
>
>  namespace __lsan {
>
> @@ -38,6 +39,9 @@ static THREADLOCAL u32 current_thread_ti
>  u32 GetCurrentThread() { return current_thread_tid; }
>  void SetCurrentThread(u32 tid) { current_thread_tid = tid; }
>
> +static THREADLOCAL AllocatorCache allocator_cache;
> +AllocatorCache *GetAllocatorCache() { return &allocator_cache; }
> +
>  __attribute__((tls_model("initial-exec")))
>  THREADLOCAL int disable_counter;
>  bool DisabledInThisThread() { return disable_counter > 0; }
>
> Modified: compiler-rt/trunk/lib/lsan/lsan_common_mac.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common_mac.cc?rev=298848&r1=298847&r2=298848&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/lsan/lsan_common_mac.cc (original)
> +++ compiler-rt/trunk/lib/lsan/lsan_common_mac.cc Mon Mar 27 09:07:50 2017
> @@ -12,12 +12,14 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>
> -#include "sanitizer_common/sanitizer_allocator_internal.h"
>  #include "sanitizer_common/sanitizer_platform.h"
>  #include "lsan_common.h"
>
>  #if CAN_SANITIZE_LEAKS && SANITIZER_MAC
>
> +#include "sanitizer_common/sanitizer_allocator_internal.h"
> +#include "lsan_allocator.h"
> +
>  #include <pthread.h>
>
>  namespace __lsan {
> @@ -25,6 +27,7 @@ namespace __lsan {
>  typedef struct {
>    int disable_counter;
>    u32 current_thread_id;
> +  AllocatorCache cache;
>  } thread_local_data_t;
>
>  static pthread_key_t key;
> @@ -40,6 +43,7 @@ static thread_local_data_t *get_tls_val(
>      ptr = (thread_local_data_t *)InternalAlloc(sizeof(*ptr));
>      ptr->disable_counter = 0;
>      ptr->current_thread_id = kInvalidTid;
> +    ptr->cache = AllocatorCache();
>      pthread_setspecific(key, ptr);
>    }
>
> @@ -62,6 +66,8 @@ u32 GetCurrentThread() { return get_tls_
>
>  void SetCurrentThread(u32 tid) { get_tls_val()->current_thread_id = tid; }
>
> +AllocatorCache *GetAllocatorCache() { return &get_tls_val()->cache; }
> +
>  void InitializePlatformSpecificModules() {
>    CHECK(0 && "unimplemented");
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170327/4a07af90/attachment-0001.html>


More information about the llvm-commits mailing list