14 #include "llvm/Config/config.h"
24 #ifdef HAVE_SYS_STAT_H
36 #if (defined(__GNUC__) && !defined(__ARM_EABI__) && !defined(__ia64__) && \
37 !defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__))
38 #define HAVE_EHTABLE_SUPPORT 1
40 #define HAVE_EHTABLE_SUPPORT 0
43 #if HAVE_EHTABLE_SUPPORT
52 static bool Searched =
false;
53 static void((*rf)(
void *)) = 0;
65 static bool Searched =
false;
66 static void((*df)(
void *)) = 0;
71 "__deregister_frame");
80 static const char *processFDE(
const char *Entry,
bool isDeregister) {
81 const char *
P = Entry;
102 const char *P = (
const char *)Addr;
103 const char *
End = P + Size;
105 P = processFDE(P,
false);
111 const char *P = (
const char *)Addr;
112 const char *End = P + Size;
114 P = processFDE(P,
true);
144 #if defined(__BIONIC__) && defined(__arm__)
151 #define ARM_MATH_IMPORTS(PP) \
185 PP(__aeabi_idivmod) \
189 PP(__aeabi_ldivmod) \
196 PP(__aeabi_uidivmod) \
206 #define ARM_MATH_DECL(name) extern "C" void name();
207 ARM_MATH_IMPORTS(ARM_MATH_DECL)
211 #if defined(__linux__) && defined(__GLIBC__) && \
212 (defined(__i386__) || defined(__x86_64__))
221 #if defined(__linux__) && defined(__GLIBC__)
231 if (Name ==
"stat")
return (uint64_t)&stat;
232 if (Name ==
"fstat")
return (uint64_t)&fstat;
233 if (Name ==
"lstat")
return (uint64_t)&lstat;
234 if (Name ==
"stat64")
return (uint64_t)&stat64;
235 if (Name ==
"fstat64")
return (uint64_t)&fstat64;
236 if (Name ==
"lstat64")
return (uint64_t)&lstat64;
237 if (Name ==
"atexit")
return (uint64_t)&atexit;
238 if (Name ==
"mknod")
return (uint64_t)&mknod;
240 #if defined(__i386__) || defined(__x86_64__)
242 if (&__morestack && Name ==
"__morestack")
243 return (uint64_t)&__morestack;
245 #endif // __linux__ && __GLIBC__
248 #if defined(__BIONIC__) && defined(__arm__)
249 if (Name.compare(0, 8,
"__aeabi_") == 0) {
252 #define ARM_MATH_CHECK(fn) if (Name == #fn) return (uint64_t)&fn;
253 ARM_MATH_IMPORTS(ARM_MATH_CHECK)
254 #undef ARM_MATH_CHECK
264 if (Name ==
"__main")
return (uint64_t)&
jit_noop;
266 const char *NameStr = Name.c_str();
271 if (NameStr[0] ==
'_')
279 bool AbortOnFailure) {
282 if (!Addr && AbortOnFailure)
284 "' which could not be resolved!");
static void * SearchForAddressOfSymbol(const char *symbolName)
This function will search through all previously loaded dynamic libraries for the symbol symbolName...
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
static void registerEHFramesInProcess(uint8_t *Addr, size_t Size)
Register EH frames in the current process.
virtual uint64_t getSymbolAddress(const std::string &Name)
Legacy symbol lookup - DEPRECATED! Please override findSymbol instead.
void __register_frame(void *p)
void __deregister_frame(void *p)
static void deregisterEHFramesInProcess(uint8_t *Addr, size_t Size)
Deregister EH frames in the current proces.
#define LLVM_ATTRIBUTE_WEAK
~RTDyldMemoryManager() override
static const unsigned End
virtual void * getPointerToNamedFunction(const std::string &Name, bool AbortOnFailure=true)
This method returns the address of the specified function.
static uint64_t getSymbolAddressInProcess(const std::string &Name)
This method returns the address of the specified function or variable in the current process...