summaryrefslogtreecommitdiff
path: root/lib/System
diff options
context:
space:
mode:
authorJeff Cohen <jeffc@jolt-lang.org>2006-01-30 04:33:51 +0000
committerJeff Cohen <jeffc@jolt-lang.org>2006-01-30 04:33:51 +0000
commit85046901b8ab3c447889338f03a1fd2805198ad7 (patch)
tree25ecdfcb9e2ac7c3e14781e3a9e00ea714a2fffb /lib/System
parent0e753d617be1ff6a9ac0f894da9d2544e2489850 (diff)
downloadllvm-85046901b8ab3c447889338f03a1fd2805198ad7.tar.gz
llvm-85046901b8ab3c447889338f03a1fd2805198ad7.tar.bz2
llvm-85046901b8ab3c447889338f03a1fd2805198ad7.tar.xz
Add AddSymbol() method to DynamicLibrary to work around Windows limitation
of being unable to search for symbols in an EXE. It will also allow other existing hacks to be improved. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25805 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System')
-rw-r--r--lib/System/DynamicLibrary.cpp15
-rw-r--r--lib/System/Win32/DynamicLibrary.inc6
2 files changed, 21 insertions, 0 deletions
diff --git a/lib/System/DynamicLibrary.cpp b/lib/System/DynamicLibrary.cpp
index 18894cbc87..0c179fc2f7 100644
--- a/lib/System/DynamicLibrary.cpp
+++ b/lib/System/DynamicLibrary.cpp
@@ -13,6 +13,14 @@
#include "llvm/System/DynamicLibrary.h"
#include "llvm/Config/config.h"
+#include <map>
+
+// Collection of symbol name/value pairs to be searched prior to any libraries.
+static std::map<std::string, void *> g_symbols;
+
+void llvm::sys::DynamicLibrary::AddSymbol(const char* symbolName, void *symbolValue) {
+ g_symbols[symbolName] = symbolValue;
+}
// 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
@@ -107,6 +115,13 @@ void DynamicLibrary::LoadLibraryPermanently(const char* filename) {
void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
check_ltdl_initialization();
+
+ // First check symbols added via AddSymbol().
+ std::map<std::string, void *>::iterator I = g_symbols.find(symbolName);
+ if (I != g_symbols.end())
+ return I->second;
+
+ // Now search the libraries.
for (std::vector<lt_dlhandle>::iterator I = OpenedHandles.begin(),
E = OpenedHandles.end(); I != E; ++I) {
lt_ptr ptr = lt_dlsym(*I, symbolName);
diff --git a/lib/System/Win32/DynamicLibrary.inc b/lib/System/Win32/DynamicLibrary.inc
index 1492138682..310d3dc835 100644
--- a/lib/System/Win32/DynamicLibrary.inc
+++ b/lib/System/Win32/DynamicLibrary.inc
@@ -107,6 +107,12 @@ void DynamicLibrary::LoadLibraryPermanently(const char* filename) {
}
void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
+ // First check symbols added via AddSymbol().
+ std::map<std::string, void *>::iterator I = g_symbols.find(symbolName);
+ if (I != g_symbols.end())
+ return I->second;
+
+ // Now search the libraries.
for (std::vector<HMODULE>::iterator I = OpenedHandles.begin(),
E = OpenedHandles.end(); I != E; ++I) {
FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName);