summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/DynamicLibrary.cpp
diff options
context:
space:
mode:
authorFrederich Munch <colsebas@hotmail.com>2017-05-26 19:43:23 +0000
committerFrederich Munch <colsebas@hotmail.com>2017-05-26 19:43:23 +0000
commit8c3735e59718499023f4281dd3403e3aeeb860d6 (patch)
tree3315ec8044f3ec99e4b8f6280e35de17a7b3a439 /llvm/lib/Support/DynamicLibrary.cpp
parentfedd33f155065c60c1d3b27650b01b9105952308 (diff)
downloadbcm5719-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.cpp11
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);
}
OpenPOWER on IntegriCloud