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
This commit is contained in:
Frederich Munch 2017-05-26 19:43:23 +00:00
parent fedd33f155
commit 8c3735e597
1 changed files with 8 additions and 3 deletions

View File

@ -127,10 +127,15 @@ void DynamicLibrary::AddSymbol(StringRef SymbolName, void *SymbolValue) {
DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *FileName, DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *FileName,
std::string *Err) { 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); void *Handle = HandleSet::DLOpen(FileName, Err);
if (Handle != &Invalid) if (Handle != &Invalid) {
OpenedHandles->AddLibrary(Handle, /*IsProcess*/ FileName == nullptr); SmartScopedLock<true> Lock(*SymbolsMutex);
HS.AddLibrary(Handle, /*IsProcess*/ FileName == nullptr);
}
return DynamicLibrary(Handle); return DynamicLibrary(Handle);
} }