diff options
author | Frederich Munch <colsebas@hotmail.com> | 2017-05-26 19:43:23 +0000 |
---|---|---|
committer | Frederich Munch <colsebas@hotmail.com> | 2017-05-26 19:43:23 +0000 |
commit | 8c3735e59718499023f4281dd3403e3aeeb860d6 (patch) | |
tree | 3315ec8044f3ec99e4b8f6280e35de17a7b3a439 /llvm/lib/Support/DynamicLibrary.cpp | |
parent | fedd33f155065c60c1d3b27650b01b9105952308 (diff) | |
download | bcm5719-llvm-8c3735e59718499023f4281dd3403e3aeeb860d6.tar.gz bcm5719-llvm-8c3735e59718499023f4281dd3403e3aeeb860d6.zip |
Fix the ManagedStatic list ordering when using DynamicLibrary::addPermanentLibrary.
Summary:
r295737 included a fix for leaking libraries loaded via. DynamicLibrary::addPermanentLibrary.
This created a problem where static constructors in a library could insert llvm::ManagedStatic objects before DynamicLibrary would register it's own ManagedStatic, meaning a crash could occur at shutdown.
r301562 exasperated this problem by cleaning up the DynamicLibrary ManagedStatic during llvm_shutdown.
Reviewers: v.g.vassilev, lhames, efriedma
Reviewed By: efriedma
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D33581
llvm-svn: 304027
Diffstat (limited to 'llvm/lib/Support/DynamicLibrary.cpp')
-rw-r--r-- | llvm/lib/Support/DynamicLibrary.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Support/DynamicLibrary.cpp b/llvm/lib/Support/DynamicLibrary.cpp index 1541a572630..9398789cea8 100644 --- a/llvm/lib/Support/DynamicLibrary.cpp +++ b/llvm/lib/Support/DynamicLibrary.cpp @@ -127,10 +127,15 @@ void DynamicLibrary::AddSymbol(StringRef SymbolName, void *SymbolValue) { DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *FileName, std::string *Err) { - SmartScopedLock<true> Lock(*SymbolsMutex); + // Force OpenedHandles to be added into the ManagedStatic list before any + // ManagedStatic can be added from static constructors in HandleSet::DLOpen. + HandleSet& HS = *OpenedHandles; + void *Handle = HandleSet::DLOpen(FileName, Err); - if (Handle != &Invalid) - OpenedHandles->AddLibrary(Handle, /*IsProcess*/ FileName == nullptr); + if (Handle != &Invalid) { + SmartScopedLock<true> Lock(*SymbolsMutex); + HS.AddLibrary(Handle, /*IsProcess*/ FileName == nullptr); + } return DynamicLibrary(Handle); } |