14 #include "llvm/Config/config.h"
24 #ifdef HAVE_SYS_STAT_H
36 #if (defined(__GNUC__) && !defined(__ARM_EABI__) && !defined(__ia64__) && \
37 !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;
61 ((void (*)(
void *))rf)(p);
65 static bool Searched =
false;
71 "__deregister_frame");
74 ((void (*)(
void *))df)(p);
80 static const char *
processFDE(
const char *Entry,
bool isDeregister) {
81 const char *
P = Entry;
82 uint32_t Length = *((
const uint32_t *)P);
84 uint32_t Offset = *((
const uint32_t *)P);
102 const char *P = (
const char *)Addr;
103 const char *End = P + Size;
112 const char *P = (
const char *)Addr;
113 const char *End = P + Size;
147 #if defined(__BIONIC__) && defined(__arm__)
154 #define ARM_MATH_IMPORTS(PP) \
188 PP(__aeabi_idivmod) \
192 PP(__aeabi_ldivmod) \
199 PP(__aeabi_uidivmod) \
209 #define ARM_MATH_DECL(name) extern "C" void name();
210 ARM_MATH_IMPORTS(ARM_MATH_DECL)
218 #if defined(__linux__) && defined(__GLIBC__)
228 if (Name ==
"stat")
return (uint64_t)&
stat;
229 if (Name ==
"fstat")
return (uint64_t)&
fstat;
230 if (Name ==
"lstat")
return (uint64_t)&
lstat;
231 if (Name ==
"stat64")
return (uint64_t)&
stat64;
232 if (Name ==
"fstat64")
return (uint64_t)&
fstat64;
233 if (Name ==
"lstat64")
return (uint64_t)&
lstat64;
234 if (Name ==
"atexit")
return (uint64_t)&atexit;
235 if (Name ==
"mknod")
return (uint64_t)&mknod;
236 #endif // __linux__ && __GLIBC__
239 #if defined(__BIONIC__) && defined(__arm__)
240 if (Name.compare(0, 8,
"__aeabi_") == 0) {
243 #define ARM_MATH_CHECK(fn) if (Name == #fn) return (uint64_t)&fn;
244 ARM_MATH_IMPORTS(ARM_MATH_CHECK)
245 #undef ARM_MATH_CHECK
255 if (Name ==
"__main")
return (uint64_t)&
jit_noop;
257 const char *NameStr = Name.c_str();
260 return (uint64_t)Ptr;
264 if (NameStr[0] ==
'_') {
267 return (uint64_t)Ptr;
273 bool AbortOnFailure) {
276 if (!Addr && AbortOnFailure)
278 "' which could not be resolved!");
static void * SearchForAddressOfSymbol(const char *symbolName)
Search through libraries for address of a symbol.
int fstat(int fildes, struct stat *buf);
int fstat64(int filedes, struct stat64 *buf)
virtual void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size)
int lstat64(const char *path, struct stat64 *buf);
void __register_frame(void *p)
void __deregister_frame(void *p)
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
virtual uint64_t getSymbolAddress(const std::string &Name)
int lstat(const char *path, struct stat *buf);
virtual void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size)
static unsigned char * processFDE(unsigned char *P, intptr_t DeltaForText, intptr_t DeltaForEH)
int stat(const char *path, struct stat *buf);
int stat64(const char *path, struct stat64 *buf);
virtual ~RTDyldMemoryManager()
virtual void * getPointerToNamedFunction(const std::string &Name, bool AbortOnFailure=true)