[compiler-rt] r298848 - Use pthreads for thread-local lsan allocator cache on darwin
Francis Ricci via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 27 15:40:33 PDT 2017
This build should succeed:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/1177
On Mon, Mar 27, 2017 at 6:39 PM, Francis Ricci <francisjricci at gmail.com> wrote:
> Yes, should be fixed by: r298878
>
>
> On Mon, Mar 27, 2017, 6:37 PM Vitaly Buka <vitalybuka at google.com> wrote:
>>
>> 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
More information about the llvm-commits
mailing list