From 85046901b8ab3c447889338f03a1fd2805198ad7 Mon Sep 17 00:00:00 2001 From: Jeff Cohen Date: Mon, 30 Jan 2006 04:33:51 +0000 Subject: [PATCH] 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 --- include/llvm/System/DynamicLibrary.h | 14 ++++++++++++++ lib/System/DynamicLibrary.cpp | 15 +++++++++++++++ lib/System/Win32/DynamicLibrary.inc | 6 ++++++ 3 files changed, 35 insertions(+) diff --git a/include/llvm/System/DynamicLibrary.h b/include/llvm/System/DynamicLibrary.h index 5edbfd6f22f..1aea0460a22 100644 --- a/include/llvm/System/DynamicLibrary.h +++ b/include/llvm/System/DynamicLibrary.h @@ -26,6 +26,9 @@ namespace sys { /// operating system interface, this class provides a portable interface that /// allows dynamic libraries to be loaded and and searched for externally /// defined symbols. This is typically used to provide "plug-in" support. + /// It also allows for symbols to be defined which don't live in any library, + /// but rather the main program itself, useful on Windows where the main + /// executable cannot be searched. /// @since 1.4 /// @brief Portable dynamic library abstraction. class DynamicLibrary { @@ -81,6 +84,17 @@ namespace sys { return SearchForAddressOfSymbol(symbolName.c_str()); } + /// This functions permanently adds the symbol \p symbolName with the + /// value \p symbolValue. These symbols are searched before any + /// libraries. + /// @brief Add searchable symbol/value pair. + static void AddSymbol(const char* symbolName, void *symbolValue); + + /// @brief Convenience function for C++ophiles. + static void AddSymbol(const std::string& symbolName, void *symbolValue) { + AddSymbol(symbolName.c_str(), symbolValue); + } + /// @} /// @name Accessors /// @{ diff --git a/lib/System/DynamicLibrary.cpp b/lib/System/DynamicLibrary.cpp index 18894cbc87d..0c179fc2f7e 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 + +// Collection of symbol name/value pairs to be searched prior to any libraries. +static std::map 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::iterator I = g_symbols.find(symbolName); + if (I != g_symbols.end()) + return I->second; + + // Now search the libraries. for (std::vector::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 1492138682f..310d3dc8359 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::iterator I = g_symbols.find(symbolName); + if (I != g_symbols.end()) + return I->second; + + // Now search the libraries. for (std::vector::iterator I = OpenedHandles.begin(), E = OpenedHandles.end(); I != E; ++I) { FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName); -- 2.34.1