diff --git a/llvm/include/llvm/DWARFLinkerParallel/StringPool.h b/llvm/include/llvm/DWARFLinkerParallel/StringPool.h --- a/llvm/include/llvm/DWARFLinkerParallel/StringPool.h +++ b/llvm/include/llvm/DWARFLinkerParallel/StringPool.h @@ -27,14 +27,21 @@ 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)); } // Pull in base class overloads. using AllocatorBase::Allocate; private: - static thread_local BumpPtrAllocator ThreadLocalAllocator; + BumpPtrAllocator *getAllocatorPtr() { + if (ThreadLocalAllocator == nullptr) + ThreadLocalAllocator = new BumpPtrAllocator(); + + return ThreadLocalAllocator; + } + + static LLVM_THREAD_LOCAL BumpPtrAllocator *ThreadLocalAllocator; }; class StringPoolEntryInfo { diff --git a/llvm/lib/DWARFLinkerParallel/StringPool.cpp b/llvm/lib/DWARFLinkerParallel/StringPool.cpp --- a/llvm/lib/DWARFLinkerParallel/StringPool.cpp +++ b/llvm/lib/DWARFLinkerParallel/StringPool.cpp @@ -8,5 +8,5 @@ #include "llvm/DWARFLinkerParallel/StringPool.h" -thread_local llvm::BumpPtrAllocator - llvm::dwarflinker_parallel::PerThreadStringAllocator::ThreadLocalAllocator; +LLVM_THREAD_LOCAL llvm::BumpPtrAllocator + *llvm::dwarflinker_parallel::PerThreadStringAllocator::ThreadLocalAllocator;