Add AddSymbol() method to DynamicLibrary to work around Windows limitation
authorJeff Cohen <jeffc@jolt-lang.org>
Mon, 30 Jan 2006 04:33:51 +0000 (04:33 +0000)
committerJeff Cohen <jeffc@jolt-lang.org>
Mon, 30 Jan 2006 04:33:51 +0000 (04:33 +0000)
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
lib/System/DynamicLibrary.cpp
lib/System/Win32/DynamicLibrary.inc

index 5edbfd6f22f7d76adc363c9d37a12393caa8fdab..1aea0460a22826d6cf2acadf7fe173b4d8158538 100644 (file)
@@ -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
     /// @{
index 18894cbc87d5f578f0b3e86d0f46787eb45a3f25..0c179fc2f7eb4045e21f9526afd089191102d5fe 100644 (file)
 
 #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);
index 1492138682f9f2bf9e61422f8667d5df10b01d2b..310d3dc83590a5345301efa204d7acc7cee128e5 100644 (file)
@@ -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);