From 1a4663516b6b2e552e038b8e6fc2a0d9f0574f26 Mon Sep 17 00:00:00 2001 From: Jeff Cohen Date: Fri, 24 Dec 2004 07:57:09 +0000 Subject: [PATCH] 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 --- lib/System/DynamicLibrary.cpp | 14 +++++ lib/System/Win32/DynamicLibrary.cpp | 89 +++++++++++++++++++++++------ lib/System/Win32/DynamicLibrary.inc | 89 +++++++++++++++++++++++------ win32/System/System.vcproj | 18 ------ win32/lli/lli.vcproj | 2 + win32/llvm.sln | 2 +- 6 files changed, 161 insertions(+), 53 deletions(-) diff --git a/lib/System/DynamicLibrary.cpp b/lib/System/DynamicLibrary.cpp index 116e26bcc28..fc3d41316ad 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 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 cc3376eedf9..27078836dd3 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 + +#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 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::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::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 cc3376eedf9..27078836dd3 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 + +#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 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::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::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/win32/System/System.vcproj b/win32/System/System.vcproj index 4de950a605c..10472ed35b7 100644 --- a/win32/System/System.vcproj +++ b/win32/System/System.vcproj @@ -130,21 +130,6 @@ if not exist ..\..\lib\System\platform\TimeValue.cpp echo #include "../win3 - - - - - - - - @@ -177,9 +162,6 @@ if not exist ..\..\lib\System\platform\TimeValue.cpp echo #include "../win3 - - diff --git a/win32/lli/lli.vcproj b/win32/lli/lli.vcproj index 155c55f0b9b..904b76f0532 100644 --- a/win32/lli/lli.vcproj +++ b/win32/lli/lli.vcproj @@ -38,6 +38,7 @@ Name="VCLinkerTool" OutputFile="$(OutDir)/lli.exe" LinkIncremental="2" + ForceSymbolReferences="_X86TargetMachineModule" GenerateDebugInformation="TRUE" ProgramDatabaseFile="$(OutDir)/lli.pdb" SubSystem="1" @@ -88,6 +89,7 @@ Name="VCLinkerTool" OutputFile="$(OutDir)/lli.exe" LinkIncremental="1" + ForceSymbolReferences="_X86TargetMachineModule" GenerateDebugInformation="TRUE" SubSystem="1" OptimizeReferences="2" diff --git a/win32/llvm.sln b/win32/llvm.sln index e919792e4ac..c074a61db59 100644 --- a/win32/llvm.sln +++ b/win32/llvm.sln @@ -72,6 +72,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Configure", "Configure\Conf EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lli", "lli\lli.vcproj", "{FB6FFD68-C1E4-4DCF-AB02-36D205D5263E}" ProjectSection(ProjectDependencies) = postProject + {0622E827-8464-489D-8B1C-B0B496F35C08} = {0622E827-8464-489D-8B1C-B0B496F35C08} {28AA9146-3482-4F41-9CC6-407B1D258508} = {28AA9146-3482-4F41-9CC6-407B1D258508} {F1EFF064-8869-4DFF-8E1A-CD8F4A5F8D61} = {F1EFF064-8869-4DFF-8E1A-CD8F4A5F8D61} {059FBAB8-C76D-48A0-AA75-3C57BD3EAFE4} = {059FBAB8-C76D-48A0-AA75-3C57BD3EAFE4} @@ -93,7 +94,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llc", "llc\llc.vcproj", "{A {059FBAB8-C76D-48A0-AA75-3C57BD3EAFE4} = {059FBAB8-C76D-48A0-AA75-3C57BD3EAFE4} {45CD78D7-C5D9-47FE-AD12-F3251EEDAFFB} = {45CD78D7-C5D9-47FE-AD12-F3251EEDAFFB} {0F8407F3-FA23-4CF1-83A9-DCBE0B361489} = {0F8407F3-FA23-4CF1-83A9-DCBE0B361489} - {144EEBF6-8C9B-4473-B715-2C821666AF6C} = {144EEBF6-8C9B-4473-B715-2C821666AF6C} EndProjectSection EndProject Global