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 | 039b4abf6c3be75a0f50f7ec00f431778ce334f2 (patch) | |
tree | 1ec43be1aaa9ab97cf47084c874cc91184be4ee8 | |
parent | c81ccb488a5f7c4185c2c134b399cca515f538ec (diff) | |
download | bcm5719-llvm-039b4abf6c3be75a0f50f7ec00f431778ce334f2.tar.gz bcm5719-llvm-039b4abf6c3be75a0f50f7ec00f431778ce334f2.zip |
Eliminate use of ltdl.c when doing a VC++ build. Because libtool isn't used,
ltdl's LGPL license would infect all of LLVM.
llvm-svn: 19137
-rw-r--r-- | llvm/lib/System/DynamicLibrary.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/System/Win32/DynamicLibrary.cpp | 89 | ||||
-rw-r--r-- | llvm/win32/System/System.vcproj | 18 | ||||
-rw-r--r-- | llvm/win32/lli/lli.vcproj | 2 | ||||
-rw-r--r-- | llvm/win32/llvm.sln | 2 |
5 files changed, 89 insertions, 36 deletions
diff --git a/llvm/lib/System/DynamicLibrary.cpp b/llvm/lib/System/DynamicLibrary.cpp index 116e26bcc28..fc3d41316ad 100644 --- a/llvm/lib/System/DynamicLibrary.cpp +++ b/llvm/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/llvm/lib/System/Win32/DynamicLibrary.cpp b/llvm/lib/System/Win32/DynamicLibrary.cpp index cc3376eedf9..27078836dd3 100644 --- a/llvm/lib/System/Win32/DynamicLibrary.cpp +++ b/llvm/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/llvm/win32/System/System.vcproj b/llvm/win32/System/System.vcproj index 4de950a605c..10472ed35b7 100644 --- a/llvm/win32/System/System.vcproj +++ b/llvm/win32/System/System.vcproj @@ -131,21 +131,6 @@ if not exist ..\..\lib\System\platform\TimeValue.cpp echo #include "../win3 RelativePath="..\..\lib\System\DynamicLibrary.cpp"> </File> <File - RelativePath="..\..\lib\System\ltdl.c"> - <FileConfiguration - Name="Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="__WINDOWS__"/> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32"> - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="__WINDOWS__"/> - </FileConfiguration> - </File> - <File RelativePath="..\..\lib\System\MappedFile.cpp"> </File> <File @@ -178,9 +163,6 @@ if not exist ..\..\lib\System\platform\TimeValue.cpp echo #include "../win3 RelativePath="..\..\include\llvm\System\DynamicLibrary.h"> </File> <File - RelativePath="..\..\lib\System\ltdl.h"> - </File> - <File RelativePath="..\..\include\llvm\System\MappedFile.h"> </File> <File diff --git a/llvm/win32/lli/lli.vcproj b/llvm/win32/lli/lli.vcproj index 155c55f0b9b..904b76f0532 100644 --- a/llvm/win32/lli/lli.vcproj +++ b/llvm/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/llvm/win32/llvm.sln b/llvm/win32/llvm.sln index e919792e4ac..c074a61db59 100644 --- a/llvm/win32/llvm.sln +++ b/llvm/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 |