diff --git a/llvm/lib/Support/PluginLoader.cpp b/llvm/lib/Support/PluginLoader.cpp --- a/llvm/lib/Support/PluginLoader.cpp +++ b/llvm/lib/Support/PluginLoader.cpp @@ -13,34 +13,46 @@ #define DONT_GET_PLUGIN_LOADER_OPTION #include "llvm/Support/PluginLoader.h" #include "llvm/Support/DynamicLibrary.h" -#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Mutex.h" #include "llvm/Support/raw_ostream.h" #include using namespace llvm; -static ManagedStatic > Plugins; -static ManagedStatic > PluginsLock; +namespace { + +struct Plugins { + sys::SmartMutex Lock; + std::vector List; +}; + +Plugins &getPlugins() { + static Plugins P; + return P; +} + +} // anonymous namespace void PluginLoader::operator=(const std::string &Filename) { - sys::SmartScopedLock Lock(*PluginsLock); + auto &P = getPlugins(); + sys::SmartScopedLock Lock(P.Lock); std::string Error; if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) { errs() << "Error opening '" << Filename << "': " << Error << "\n -load request ignored.\n"; } else { - Plugins->push_back(Filename); + P.List.push_back(Filename); } } unsigned PluginLoader::getNumPlugins() { - sys::SmartScopedLock Lock(*PluginsLock); - return Plugins.isConstructed() ? Plugins->size() : 0; + auto &P = getPlugins(); + sys::SmartScopedLock Lock(P.Lock); + return P.List.size(); } std::string &PluginLoader::getPlugin(unsigned num) { - sys::SmartScopedLock Lock(*PluginsLock); - assert(Plugins.isConstructed() && num < Plugins->size() && - "Asking for an out of bounds plugin"); - return (*Plugins)[num]; + auto &P = getPlugins(); + sys::SmartScopedLock Lock(P.Lock); + assert(num < P.List.size() && "Asking for an out of bounds plugin"); + return P.List[num]; }