Index: include/llvm/Support/DynamicLibrary.h =================================================================== --- include/llvm/Support/DynamicLibrary.h +++ include/llvm/Support/DynamicLibrary.h @@ -68,6 +68,8 @@ static DynamicLibrary getPermanentLibrary(const char *filename, std::string *errMsg = nullptr); + static DynamicLibrary addPermanentLibrary(void *handle); + /// This function permanently loads the dynamic library at the given path. /// Use this instead of getPermanentLibrary() when you won't need to get /// symbols from the library itself. Index: lib/Support/DynamicLibrary.cpp =================================================================== --- lib/Support/DynamicLibrary.cpp +++ lib/Support/DynamicLibrary.cpp @@ -69,7 +69,10 @@ if (!filename) handle = RTLD_DEFAULT; #endif + return addPermanentLibrary(handle); +} +DynamicLibrary DynamicLibrary::addPermanentLibrary(void *handle) { if (!OpenedHandles) OpenedHandles = new DenseSet(); Index: lib/Support/Windows/DynamicLibrary.inc =================================================================== --- lib/Support/Windows/DynamicLibrary.inc +++ lib/Support/Windows/DynamicLibrary.inc @@ -179,4 +179,17 @@ return (void *)(intptr_t)GetProcAddress((HMODULE)Data, symbolName); } +DynamicLibrary DynamicLibrary::addPermanentLibrary(void *handle) { + if (OpenedHandles == 0) + OpenedHandles = new DenseSet(); + + // If we've already loaded this library, dlclose() the handle in order to + // keep the internal refcount at +1. + if (!OpenedHandles->insert((const HMODULE)handle).second) + FreeLibrary((HMODULE)handle); + + return DynamicLibrary((HMODULE)handle); +} + + }