 +
 +
  #endif // LLVM_ON_WIN32
-Index: lib/Support/CMakeLists.txt
-===================================================================
---- lib/Support/CMakeLists.txt	(revision 167609)
-+++ lib/Support/CMakeLists.txt	(working copy)
-@@ -80,6 +80,7 @@ add_llvm_library(LLVMSupport
-   Threading.cpp
-   TimeValue.cpp
-   Valgrind.cpp
-+  Unix/DynamicLibrary.inc
-   Unix/Host.inc
-   Unix/Memory.inc
-   Unix/Mutex.inc
-Index: lib/Support/Windows/DynamicLibrary.inc
-===================================================================
---- lib/Support/Windows/DynamicLibrary.inc	(revision 167609)
-+++ lib/Support/Windows/DynamicLibrary.inc	(working copy)
-@@ -1,4 +1,4 @@
--//===- Win32/DynamicLibrary.cpp - Win32 DL Implementation -------*- C++ -*-===//
-+//===- Windows/DynamicLibrary.cpp - Win32 DL Implementation -----*- C++ -*-===//
- //
- //                     The LLVM Compiler Infrastructure
- //
-@@ -32,15 +32,9 @@
- #endif
- 
- namespace llvm {
-+
- using namespace sys;
- 
--//===----------------------------------------------------------------------===//
--//=== WARNING: Implementation here must contain only Win32 specific code
--//===          and must not be UNIX code.
--//===----------------------------------------------------------------------===//
--
--static DenseSet<HMODULE> *OpenedHandles;
--
- extern "C" {
- 
-   static BOOL CALLBACK ELM_Callback(WIN32_ELMCB_PCSTR ModuleName,
-@@ -69,14 +63,11 @@ extern "C" {
-   }
- }
- 
--DynamicLibrary DynamicLibrary::getPermanentLibrary(const char *filename,
--                                                   std::string *errMsg) {
--  SmartScopedLock<true> lock(getMutex());
--
-+void *OpenLibraryImpl(const char *filename, std::string *errMsg) {
-   if (!filename) {
-     // When no file is specified, enumerate all DLLs and EXEs in the process.
-     if (OpenedHandles == 0)
--      OpenedHandles = new DenseSet<HMODULE>();
-+      OpenedHandles = new DenseMap<void *, unsigned>();
- 
-     EnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0);
-     // Dummy library that represents "search all handles".
-@@ -88,65 +79,32 @@ extern "C" {
- 
-   if (a_handle == 0) {
-     MakeErrMsg(errMsg, std::string(filename) + ": Can't open : ");
--    return DynamicLibrary();
-+    return NULL;
-   }
- 
--  if (OpenedHandles == 0)
--    OpenedHandles = new DenseSet<HMODULE>();
-+  return (void *) a_handle;
-+}
- 
--  // If we've already loaded this library, FreeLibrary() the handle in order to
--  // keep the internal refcount at +1.
--  if (!OpenedHandles->insert(a_handle).second)
--    FreeLibrary(a_handle);
-+void CloseLibraryImpl(void *dlhandle) {
-+  CloseLibrary((HMODULE)dlhandle);
-+}
- 
--  return DynamicLibrary(a_handle);
-+void *GetAddressOfSymbolImpl(void *dlHandle, const char *symbolName) {
-+  return (void *)(intptr_t) GetProcAddress((HMODULE)*dlhandle, symbolName);
- }
- 
--// Stack probing routines are in the support library (e.g. libgcc), but we don't
--// have dynamic linking on windows. Provide a hook.
-+void PopulateSpecialSymbolsImpl(StringMap<void *>& symMap) {
-+
- #define EXPLICIT_SYMBOL(SYM)                    \
--  extern "C" { extern void *SYM; }
--#define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) EXPLICIT_SYMBOL(SYMTO)
-+  extern "C" void *SYM; symMap[#SYM] = &SYM
-+#define EXPLICIT_SYMBOL2(SYMFROM, SYMTO)        \
-+  symMap[#SYMFROM] = &SYMTO
- 
- #include "explicit_symbols.inc"
- 
- #undef EXPLICIT_SYMBOL
- #undef EXPLICIT_SYMBOL2
- 
--void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) {
--  SmartScopedLock<true> Lock(getMutex());
--
--  // First check symbols added via AddSymbol().
--  if (ExplicitSymbols) {
--    StringMap<void *>::iterator i = ExplicitSymbols->find(symbolName);
--
--    if (i != ExplicitSymbols->end())
--      return i->second;
--  }
--
--  // Now search the libraries.
--  if (OpenedHandles) {
--    for (DenseSet<HMODULE>::iterator I = OpenedHandles->begin(),
--         E = OpenedHandles->end(); I != E; ++I) {
--      FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName);
--      if (ptr) {
--        return (void *)(intptr_t)ptr;
--      }
--    }
--  }
--
--  #define EXPLICIT_SYMBOL(SYM)                    \
--    if (!strcmp(symbolName, #SYM)) return (void*)&SYM;
--  #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO)        \
--    if (!strcmp(symbolName, #SYMFROM)) return (void*)&SYMTO;
--
--  {
--    #include "explicit_symbols.inc"
--  }
--
--  #undef EXPLICIT_SYMBOL
--  #undef EXPLICIT_SYMBOL2
--
-   return 0;
- }
- 

-  if (errMsg) *errMsg = "dlopen() not supported on this platform";
-  return DynamicLibrary();
+void* DynamicLibrary::getAddressOfSymbol(const char *symbolName) {
+  return GetAddressOfSymbolImpl(Data, symbolName);
 }
 
-void *DynamicLibrary::getAddressOfSymbol(const char *symbolName) {

+struct ExplicitSymbolHolder {
+  ExplicitSymbolHolder() {
+    PopulateSpecialSymbolsImpl(Map);
+  }
 
+  // Symbol name/value pairs to be searched prior to any libraries.
+  StringMap<void *> Map;
+};
