Changeset View
Changeset View
Standalone View
Standalone View
lib/Support/DynamicLibrary.cpp
Show All 14 Lines | |||||
#include "llvm/Support/DynamicLibrary.h" | #include "llvm/Support/DynamicLibrary.h" | ||||
#include "llvm-c/Support.h" | #include "llvm-c/Support.h" | ||||
#include "llvm/ADT/DenseSet.h" | #include "llvm/ADT/DenseSet.h" | ||||
#include "llvm/ADT/StringMap.h" | #include "llvm/ADT/StringMap.h" | ||||
#include "llvm/Config/config.h" | #include "llvm/Config/config.h" | ||||
#include "llvm/Support/ManagedStatic.h" | #include "llvm/Support/ManagedStatic.h" | ||||
#include "llvm/Support/Mutex.h" | #include "llvm/Support/Mutex.h" | ||||
#include "llvm/Support/MutexGuard.h" | |||||
#include <cstdio> | #include <cstdio> | ||||
#include <cstring> | #include <cstring> | ||||
// Collection of symbol name/value pairs to be searched prior to any libraries. | // Collection of symbol name/value pairs to be searched prior to any libraries. | ||||
static llvm::ManagedStatic<llvm::StringMap<void *> > ExplicitSymbols; | static llvm::ManagedStatic<llvm::StringMap<void *> > ExplicitSymbols; | ||||
static llvm::ManagedStatic<llvm::sys::SmartMutex<true> > SymbolsMutex; | static llvm::ManagedStatic<llvm::sys::RecursiveDebugMutex> SymbolsMutex; | ||||
void llvm::sys::DynamicLibrary::AddSymbol(StringRef symbolName, | void llvm::sys::DynamicLibrary::AddSymbol(StringRef symbolName, | ||||
void *symbolValue) { | void *symbolValue) { | ||||
SmartScopedLock<true> lock(*SymbolsMutex); | llvm::MutexGuard lock(*SymbolsMutex); | ||||
(*ExplicitSymbols)[symbolName] = symbolValue; | (*ExplicitSymbols)[symbolName] = symbolValue; | ||||
} | } | ||||
char llvm::sys::DynamicLibrary::Invalid = 0; | char llvm::sys::DynamicLibrary::Invalid = 0; | ||||
#ifdef LLVM_ON_WIN32 | #ifdef LLVM_ON_WIN32 | ||||
#include "Windows/DynamicLibrary.inc" | #include "Windows/DynamicLibrary.inc" | ||||
Show All 9 Lines | |||||
//=== WARNING: Implementation here must contain only TRULY operating system | //=== WARNING: Implementation here must contain only TRULY operating system | ||||
//=== independent code. | //=== independent code. | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
static DenseSet<void *> *OpenedHandles = nullptr; | static DenseSet<void *> *OpenedHandles = nullptr; | ||||
DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename, | DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename, | ||||
std::string *errMsg) { | std::string *errMsg) { | ||||
SmartScopedLock<true> lock(*SymbolsMutex); | llvm::MutexGuard lock(*SymbolsMutex); | ||||
void *handle = dlopen(filename, RTLD_LAZY|RTLD_GLOBAL); | void *handle = dlopen(filename, RTLD_LAZY|RTLD_GLOBAL); | ||||
if (!handle) { | if (!handle) { | ||||
if (errMsg) *errMsg = dlerror(); | if (errMsg) *errMsg = dlerror(); | ||||
return DynamicLibrary(); | return DynamicLibrary(); | ||||
} | } | ||||
#ifdef __CYGWIN__ | #ifdef __CYGWIN__ | ||||
Show All 37 Lines | |||||
#endif | #endif | ||||
namespace llvm { | namespace llvm { | ||||
void *SearchForAddressOfSpecialSymbol(const char* symbolName); | void *SearchForAddressOfSpecialSymbol(const char* symbolName); | ||||
} | } | ||||
void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) { | void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) { | ||||
SmartScopedLock<true> Lock(*SymbolsMutex); | llvm::MutexGuard lock(*SymbolsMutex); | ||||
// First check symbols added via AddSymbol(). | // First check symbols added via AddSymbol(). | ||||
if (ExplicitSymbols.isConstructed()) { | if (ExplicitSymbols.isConstructed()) { | ||||
StringMap<void *>::iterator i = ExplicitSymbols->find(symbolName); | StringMap<void *>::iterator i = ExplicitSymbols->find(symbolName); | ||||
if (i != ExplicitSymbols->end()) | if (i != ExplicitSymbols->end()) | ||||
return i->second; | return i->second; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 60 Lines • Show Last 20 Lines |