34 typedef BOOL (WINAPI *fpEnumerateLoadedModules)(HANDLE,PENUMLOADED_MODULES_CALLBACK64,PVOID);
35 static fpEnumerateLoadedModules fEnumerateLoadedModules;
38 static bool loadDebugHelp(
void) {
39 HMODULE hLib = ::LoadLibraryW(
L"Dbghelp.dll");
41 fEnumerateLoadedModules = (fpEnumerateLoadedModules)
42 ::GetProcAddress(hLib,
"EnumerateLoadedModules64");
44 return fEnumerateLoadedModules != 0;
48 ELM_Callback(PCSTR ModuleName, DWORD64 ModuleBase,
49 ULONG ModuleSize, PVOID UserContext) {
55 std::string *errMsg) {
63 if (!fEnumerateLoadedModules) {
64 if (!loadDebugHelp()) {
65 assert(
false &&
"These APIs should always be available");
70 fEnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0);
76 SmallVector<wchar_t, MAX_PATH> filenameUnicode;
78 SetLastError(ec.value());
79 MakeErrMsg(errMsg, std::string(filename) +
": Can't convert to UTF-16");
83 HMODULE a_handle = LoadLibraryW(filenameUnicode.data());
86 MakeErrMsg(errMsg, std::string(filename) +
": Can't open");
96 FreeLibrary(a_handle);
103 #define EXPLICIT_SYMBOL(SYM) \
104 extern "C" { extern void *SYM; }
105 #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) EXPLICIT_SYMBOL(SYMTO)
113 #define INLINE_DEF_SYMBOL1(TYP, SYM) \
114 extern "C" TYP inline_##SYM(TYP _X) { return SYM(_X); }
115 #define INLINE_DEF_SYMBOL2(TYP, SYM) \
116 extern "C" TYP inline_##SYM(TYP _X, TYP _Y) { return SYM(_X, _Y); }
121 #undef EXPLICIT_SYMBOL
122 #undef EXPLICIT_SYMBOL2
123 #undef INLINE_DEF_SYMBOL1
124 #undef INLINE_DEF_SYMBOL2
141 FARPROC ptr = GetProcAddress((HMODULE)*
I, symbolName);
148 #define EXPLICIT_SYMBOL(SYM) \
149 if (!strcmp(symbolName, #SYM)) \
151 #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) \
152 if (!strcmp(symbolName, #SYMFROM)) \
153 return (void *)&SYMTO;
156 #define INLINE_DEF_SYMBOL1(TYP, SYM) \
157 if (!strcmp(symbolName, #SYM)) \
158 return (void *)&inline_##SYM;
159 #define INLINE_DEF_SYMBOL2(TYP, SYM) INLINE_DEF_SYMBOL1(TYP, SYM)
166 #undef EXPLICIT_SYMBOL
167 #undef EXPLICIT_SYMBOL2
168 #undef INLINE_DEF_SYMBOL1
169 #undef INLINE_DEF_SYMBOL2
179 return (
void *)(
intptr_t)GetProcAddress((HMODULE)Data, symbolName);
static void * SearchForAddressOfSymbol(const char *symbolName)
This function will search through all previously loaded dynamic libraries for the symbol symbolName...
DynamicLibrary(void *data=&Invalid)
static llvm::ManagedStatic< llvm::sys::SmartMutex< true > > SymbolsMutex
void * getAddressOfSymbol(const char *symbolName)
Searches through the library for the symbol symbolName.
static DenseSet< void * > * OpenedHandles
bool isValid() const
Returns true if the object refers to a valid library.
static GCRegistry::Add< CoreCLRGC > E("coreclr","CoreCLR-compatible GC")
StringRef filename(StringRef path)
Get filename.
std::error_code UTF8ToUTF16(StringRef utf8, SmallVectorImpl< wchar_t > &utf16)
static llvm::ManagedStatic< llvm::StringMap< void * > > ExplicitSymbols
static DynamicLibrary getPermanentLibrary(const char *filename, std::string *errMsg=nullptr)
This function permanently loads the dynamic library at the given path.
bool MakeErrMsg(std::string *ErrMsg, const std::string &prefix)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())