diff --git a/llvm/lib/Support/ManagedStatic.cpp b/llvm/lib/Support/ManagedStatic.cpp --- a/llvm/lib/Support/ManagedStatic.cpp +++ b/llvm/lib/Support/ManagedStatic.cpp @@ -18,16 +18,10 @@ using namespace llvm; static const ManagedStaticBase *StaticList = nullptr; -static std::recursive_mutex *ManagedStaticMutex = nullptr; -static llvm::once_flag mutex_init_flag; - -static void initializeMutex() { - ManagedStaticMutex = new std::recursive_mutex(); -} static std::recursive_mutex *getManagedStaticMutex() { - llvm::call_once(mutex_init_flag, initializeMutex); - return ManagedStaticMutex; + static std::recursive_mutex m; + return &m; } void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(), @@ -75,9 +69,10 @@ } /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables. +/// IMPORTANT: it's only safe to call llvm_shutdown() in single thread, +/// without any other threads executing LLVM APIs. +/// llvm_shutdown() should be the last use of LLVM APIs. void llvm::llvm_shutdown() { - std::lock_guard Lock(*getManagedStaticMutex()); - while (StaticList) StaticList->destroy(); }