diff options
author | Jeff Cohen <jeffc@jolt-lang.org> | 2004-12-24 07:57:09 +0000 |
---|---|---|
committer | Jeff Cohen <jeffc@jolt-lang.org> | 2004-12-24 07:57:09 +0000 |
commit | 1a4663516b6b2e552e038b8e6fc2a0d9f0574f26 (patch) | |
tree | 67f7b877d3318539faa12efe0ee79a704b4dbc20 /lib | |
parent | 3bf6960f3eb10fbc0884f3f84de4522309b0a6cc (diff) |
Eliminate use of ltdl.c when doing a VC++ build. Because libtool isn't used,
ltdl's LGPL license would infect all of LLVM.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19137 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/System/DynamicLibrary.cpp | 14 | ||||
-rw-r--r-- | lib/System/Win32/DynamicLibrary.cpp | 89 | ||||
-rw-r--r-- | lib/System/Win32/DynamicLibrary.inc | 89 |
3 files changed, 158 insertions, 34 deletions
diff --git a/lib/System/DynamicLibrary.cpp b/lib/System/DynamicLibrary.cpp index 116e26bcc2..fc3d41316a 100644 --- a/lib/System/DynamicLibrary.cpp +++ b/lib/System/DynamicLibrary.cpp @@ -12,6 +12,19 @@ //===----------------------------------------------------------------------===// #include "llvm/System/DynamicLibrary.h" + +// It is not possible to use ltdl.c on VC++ builds as the terms of its LGPL +// license and special exception would cause all of LLVM to be placed under +// the LGPL. This is because the exception applies only when libtool is +// used, and obviously libtool is not used with Visual Studio. An entirely +// separate implementation is provided in win32/DynamicLibrary.cpp. + +#ifdef _WIN32 + +#include "win32/DynamicLibrary.cpp" + +#else + #include "ltdl.h" #include <cassert> using namespace llvm; @@ -135,3 +148,4 @@ void *DynamicLibrary::GetAddressOfSymbol(const char *symbolName) { return lt_dlsym((lt_dlhandle) handle, symbolName); } +#endif // _WIN32
\ No newline at end of file diff --git a/lib/System/Win32/DynamicLibrary.cpp b/lib/System/Win32/DynamicLibrary.cpp index cc3376eedf..27078836dd 100644 --- a/lib/System/Win32/DynamicLibrary.cpp +++ b/lib/System/Win32/DynamicLibrary.cpp @@ -2,50 +2,105 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Jeff Cohen and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // -// This file provides the Win32 specific implementation of the DynamicLibrary +// This file provides the Win32 specific implementation of DynamicLibrary. // //===----------------------------------------------------------------------===// #include "Win32.h" +#include <dbghelp.h> + +#pragma comment(lib, "dbghelp.lib") namespace llvm { using namespace sys; //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only Win32 specific code -//=== and must not be UNIX code +//=== and must not be UNIX code. //===----------------------------------------------------------------------===// +static std::vector<HMODULE> OpenedHandles; + +BOOL CALLBACK ELM_Callback(PSTR ModuleName, + ULONG ModuleBase, + ULONG ModuleSize, + PVOID UserContext) +{ + OpenedHandles.push_back((HMODULE)ModuleBase); + return TRUE; +} + DynamicLibrary::DynamicLibrary() : handle(0) { - handle = (void*) GetModuleHandle(NULL); - - if (handle == 0) { - ThrowError("Can't GetModuleHandle: "); - } + handle = GetModuleHandle(NULL); + OpenedHandles.push_back((HMODULE)handle); } DynamicLibrary::DynamicLibrary(const char*filename) : handle(0) { - handle = LoadLibrary(filename); + HMODULE a_handle = LoadLibrary(filename); - if (handle == 0) { - ThrowError("Can't LoadLibrary: "); - } + if (a_handle == 0) + ThrowError(std::string(filename) + ": Can't open : "); + + handle = a_handle; + OpenedHandles.push_back(a_handle); } DynamicLibrary::~DynamicLibrary() { - assert(handle !=0 && "Invalid DynamicLibrary handle"); - if (handle) - FreeLibrary((HMODULE*)handle); + if (handle == 0) + return; + + // GetModuleHandle() does not increment the ref count, so we must not free + // the handle to the executable. + if (handle != GetModuleHandle(NULL)) + FreeLibrary((HMODULE)handle); + handle = 0; + + for (std::vector<HMODULE>::iterator I = OpenedHandles.begin(), + E = OpenedHandles.end(); I != E; ++I) { + if (*I == handle) { + // Note: don't use the swap/pop_back trick here. Order is important. + OpenedHandles.erase(I); + } + } +} + +void DynamicLibrary::LoadLibraryPermanently(const char* filename) { + if (filename) { + HMODULE a_handle = LoadLibrary(filename); + + if (a_handle == 0) + ThrowError(std::string(filename) + ": Can't open : "); + + OpenedHandles.push_back(a_handle); + } else { + // When no file is specified, enumerate all DLLs and EXEs in the + // process. + EnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0); + } + + // Because we don't remember the handles, we will never free them; hence, + // it is loaded permanently. +} + +void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { + for (std::vector<HMODULE>::iterator I = OpenedHandles.begin(), + E = OpenedHandles.end(); I != E; ++I) { + FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName); + if (ptr) + return ptr; + } + + return 0; } void *DynamicLibrary::GetAddressOfSymbol(const char *symbolName) { - assert(handle !=0 && "Invalid DynamicLibrary handle"); - return (void*) GetProcAddress((HMODULE*)handle, symbolName); + assert(handle != 0 && "Invalid DynamicLibrary handle"); + return GetProcAddress((HMODULE)handle, symbolName); } } diff --git a/lib/System/Win32/DynamicLibrary.inc b/lib/System/Win32/DynamicLibrary.inc index cc3376eedf..27078836dd 100644 --- a/lib/System/Win32/DynamicLibrary.inc +++ b/lib/System/Win32/DynamicLibrary.inc @@ -2,50 +2,105 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Jeff Cohen and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // -// This file provides the Win32 specific implementation of the DynamicLibrary +// This file provides the Win32 specific implementation of DynamicLibrary. // //===----------------------------------------------------------------------===// #include "Win32.h" +#include <dbghelp.h> + +#pragma comment(lib, "dbghelp.lib") namespace llvm { using namespace sys; //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only Win32 specific code -//=== and must not be UNIX code +//=== and must not be UNIX code. //===----------------------------------------------------------------------===// +static std::vector<HMODULE> OpenedHandles; + +BOOL CALLBACK ELM_Callback(PSTR ModuleName, + ULONG ModuleBase, + ULONG ModuleSize, + PVOID UserContext) +{ + OpenedHandles.push_back((HMODULE)ModuleBase); + return TRUE; +} + DynamicLibrary::DynamicLibrary() : handle(0) { - handle = (void*) GetModuleHandle(NULL); - - if (handle == 0) { - ThrowError("Can't GetModuleHandle: "); - } + handle = GetModuleHandle(NULL); + OpenedHandles.push_back((HMODULE)handle); } DynamicLibrary::DynamicLibrary(const char*filename) : handle(0) { - handle = LoadLibrary(filename); + HMODULE a_handle = LoadLibrary(filename); - if (handle == 0) { - ThrowError("Can't LoadLibrary: "); - } + if (a_handle == 0) + ThrowError(std::string(filename) + ": Can't open : "); + + handle = a_handle; + OpenedHandles.push_back(a_handle); } DynamicLibrary::~DynamicLibrary() { - assert(handle !=0 && "Invalid DynamicLibrary handle"); - if (handle) - FreeLibrary((HMODULE*)handle); + if (handle == 0) + return; + + // GetModuleHandle() does not increment the ref count, so we must not free + // the handle to the executable. + if (handle != GetModuleHandle(NULL)) + FreeLibrary((HMODULE)handle); + handle = 0; + + for (std::vector<HMODULE>::iterator I = OpenedHandles.begin(), + E = OpenedHandles.end(); I != E; ++I) { + if (*I == handle) { + // Note: don't use the swap/pop_back trick here. Order is important. + OpenedHandles.erase(I); + } + } +} + +void DynamicLibrary::LoadLibraryPermanently(const char* filename) { + if (filename) { + HMODULE a_handle = LoadLibrary(filename); + + if (a_handle == 0) + ThrowError(std::string(filename) + ": Can't open : "); + + OpenedHandles.push_back(a_handle); + } else { + // When no file is specified, enumerate all DLLs and EXEs in the + // process. + EnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0); + } + + // Because we don't remember the handles, we will never free them; hence, + // it is loaded permanently. +} + +void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { + for (std::vector<HMODULE>::iterator I = OpenedHandles.begin(), + E = OpenedHandles.end(); I != E; ++I) { + FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName); + if (ptr) + return ptr; + } + + return 0; } void *DynamicLibrary::GetAddressOfSymbol(const char *symbolName) { - assert(handle !=0 && "Invalid DynamicLibrary handle"); - return (void*) GetProcAddress((HMODULE*)handle, symbolName); + assert(handle != 0 && "Invalid DynamicLibrary handle"); + return GetProcAddress((HMODULE)handle, symbolName); } } |