diff --git a/llvm/unittests/ADT/ConcurrentHashtableTest.cpp b/llvm/unittests/ADT/ConcurrentHashtableTest.cpp --- a/llvm/unittests/ADT/ConcurrentHashtableTest.cpp +++ b/llvm/unittests/ADT/ConcurrentHashtableTest.cpp @@ -36,19 +36,27 @@ std::array ExtraData; }; -static thread_local BumpPtrAllocator ThreadLocalAllocator; +static LLVM_THREAD_LOCAL BumpPtrAllocator *ThreadLocalAllocator = nullptr; class PerThreadAllocator : public AllocatorBase { public: inline LLVM_ATTRIBUTE_RETURNS_NONNULL void *Allocate(size_t Size, size_t Alignment) { - return ThreadLocalAllocator.Allocate(Size, Align(Alignment)); + return getAllocatorPtr()->Allocate(Size, Align(Alignment)); } - inline size_t getBytesAllocated() const { - return ThreadLocalAllocator.getBytesAllocated(); + inline size_t getBytesAllocated() { + return getAllocatorPtr()->getBytesAllocated(); } // Pull in base class overloads. using AllocatorBase::Allocate; + +protected: + BumpPtrAllocator *getAllocatorPtr() { + if (ThreadLocalAllocator == nullptr) + ThreadLocalAllocator = new BumpPtrAllocator(); + + return ThreadLocalAllocator; + } } Allocator; TEST(ConcurrentHashTableTest, AddStringEntries) {