X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FDynamicLibrary.cpp;h=d2b551e8a0a61bc85c8186d2d2e1e90af3a49752;hb=52fa0d066a8fb81716713b85841b1aa031dbf8fc;hp=d40439a1f37a26b83dfadccbba03af8a3f554261;hpb=d04a8d4b33ff316ca4cf961e06c9e312eff8e64f;p=oota-llvm.git diff --git a/lib/Support/DynamicLibrary.cpp b/lib/Support/DynamicLibrary.cpp index d40439a1f37..d2b551e8a0a 100644 --- a/lib/Support/DynamicLibrary.cpp +++ b/lib/Support/DynamicLibrary.cpp @@ -7,46 +7,29 @@ // //===----------------------------------------------------------------------===// // -// This header file implements the operating system DynamicLibrary concept. +// This file implements the operating system DynamicLibrary concept. // // FIXME: This file leaks ExplicitSymbols and OpenedHandles! // //===----------------------------------------------------------------------===// #include "llvm/Support/DynamicLibrary.h" +#include "llvm-c/Support.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringMap.h" #include "llvm/Config/config.h" +#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Mutex.h" #include #include // Collection of symbol name/value pairs to be searched prior to any libraries. -static llvm::StringMap *ExplicitSymbols = 0; - -namespace { - -struct ExplicitSymbolsDeleter { - ~ExplicitSymbolsDeleter() { - delete ExplicitSymbols; - } -}; - -} - -static ExplicitSymbolsDeleter Dummy; - - -static llvm::sys::SmartMutex& getMutex() { - static llvm::sys::SmartMutex HandlesMutex; - return HandlesMutex; -} +static llvm::ManagedStatic > ExplicitSymbols; +static llvm::ManagedStatic > SymbolsMutex; void llvm::sys::DynamicLibrary::AddSymbol(StringRef symbolName, void *symbolValue) { - SmartScopedLock lock(getMutex()); - if (ExplicitSymbols == 0) - ExplicitSymbols = new llvm::StringMap(); + SmartScopedLock lock(*SymbolsMutex); (*ExplicitSymbols)[symbolName] = symbolValue; } @@ -68,14 +51,14 @@ using namespace llvm::sys; //=== independent code. //===----------------------------------------------------------------------===// -static DenseSet *OpenedHandles = 0; +static DenseSet *OpenedHandles = nullptr; DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename, std::string *errMsg) { - SmartScopedLock lock(getMutex()); + SmartScopedLock lock(*SymbolsMutex); void *handle = dlopen(filename, RTLD_LAZY|RTLD_GLOBAL); - if (handle == 0) { + if (!handle) { if (errMsg) *errMsg = dlerror(); return DynamicLibrary(); } @@ -83,11 +66,11 @@ DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename, #ifdef __CYGWIN__ // Cygwin searches symbols only in the main // with the handle of dlopen(NULL, RTLD_GLOBAL). - if (filename == NULL) + if (!filename) handle = RTLD_DEFAULT; #endif - if (OpenedHandles == 0) + if (!OpenedHandles) OpenedHandles = new DenseSet(); // If we've already loaded this library, dlclose() the handle in order to @@ -100,7 +83,7 @@ DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename, void *DynamicLibrary::getAddressOfSymbol(const char *symbolName) { if (!isValid()) - return NULL; + return nullptr; return dlsym(Data, symbolName); } @@ -126,10 +109,10 @@ void *SearchForAddressOfSpecialSymbol(const char* symbolName); } void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) { - SmartScopedLock Lock(getMutex()); + SmartScopedLock Lock(*SymbolsMutex); // First check symbols added via AddSymbol(). - if (ExplicitSymbols) { + if (ExplicitSymbols.isConstructed()) { StringMap::iterator i = ExplicitSymbols->find(symbolName); if (i != ExplicitSymbols->end()) @@ -183,7 +166,15 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) { #endif #undef EXPLICIT_SYMBOL - return 0; + return nullptr; } #endif // LLVM_ON_WIN32 + +//===----------------------------------------------------------------------===// +// C API. +//===----------------------------------------------------------------------===// + +LLVMBool LLVMLoadLibraryPermanently(const char* Filename) { + return llvm::sys::DynamicLibrary::LoadLibraryPermanently(Filename); +}