27 #if (HAVE_LIBIMAGEHLP != 1)
28 #error "libimagehlp.a should be present"
31 #pragma comment(lib, "dbghelp.lib")
46 static BOOL CALLBACK ELM_Callback(WIN32_ELMCB_PCSTR ModuleName,
53 if (stricmp(ModuleName,
"msvci70") != 0 &&
54 stricmp(ModuleName,
"msvcirt") != 0 &&
55 stricmp(ModuleName,
"msvcp50") != 0 &&
56 stricmp(ModuleName,
"msvcp60") != 0 &&
57 stricmp(ModuleName,
"msvcp70") != 0 &&
58 stricmp(ModuleName,
"msvcr70") != 0 &&
62 stricmp(ModuleName,
"msvcrt") != 0 &&
64 stricmp(ModuleName,
"msvcrt20") != 0 &&
65 stricmp(ModuleName,
"msvcrt40") != 0) {
73 std::string *errMsg) {
81 EnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0);
87 SmallVector<wchar_t, MAX_PATH> filenameUnicode;
89 SetLastError(ec.value());
90 MakeErrMsg(errMsg, std::string(filename) +
": Can't convert to UTF-16: ");
91 return DynamicLibrary();
94 HMODULE a_handle = LoadLibraryW(filenameUnicode.data());
97 MakeErrMsg(errMsg, std::string(filename) +
": Can't open : ");
98 return DynamicLibrary();
107 FreeLibrary(a_handle);
109 return DynamicLibrary(a_handle);
114 #define EXPLICIT_SYMBOL(SYM) \
115 extern "C" { extern void *SYM; }
116 #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) EXPLICIT_SYMBOL(SYMTO)
120 #undef EXPLICIT_SYMBOL
121 #undef EXPLICIT_SYMBOL2
138 FARPROC ptr = GetProcAddress((HMODULE)*
I, symbolName);
145 #define EXPLICIT_SYMBOL(SYM) \
146 if (!strcmp(symbolName, #SYM)) return (void*)&SYM;
147 #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) \
148 if (!strcmp(symbolName, #SYMFROM)) return (void*)&SYMTO;
154 #undef EXPLICIT_SYMBOL
155 #undef EXPLICIT_SYMBOL2
166 return (
void *)(
intptr_t)GetProcAddress((HMODULE)Data, symbolName);
static void * SearchForAddressOfSymbol(const char *symbolName)
Search through libraries for address of a symbol.
error_code UTF8ToUTF16(StringRef utf8, SmallVectorImpl< wchar_t > &utf16)
static llvm::ManagedStatic< llvm::sys::SmartMutex< true > > SymbolsMutex
void * getAddressOfSymbol(const char *symbolName)
static DenseSet< void * > * OpenedHandles
static ManagedStatic< sys::SmartRWMutex< true > > Lock
static llvm::ManagedStatic< llvm::StringMap< void * > > ExplicitSymbols
bool isValid()
Returns true if the object refers to a valid library.
bool MakeErrMsg(std::string *ErrMsg, const std::string &prefix)
static DynamicLibrary getPermanentLibrary(const char *filename, std::string *errMsg=0)
Open a dynamic library permanently.
const StringRef filename(StringRef path)
Get filename.