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;
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;
105 P = processFDE(P,
false);
112 const char *P = (
const char *)Addr;
113 const char *End = P + Size;
115 P = processFDE(P,
true);
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)
214 #if defined(__linux__) && defined(__GLIBC__) && \
215 (defined(__i386__) || defined(__x86_64__))
224 #if defined(__linux__) && defined(__GLIBC__)
234 if (Name ==
"stat")
return (uint64_t)&stat;
235 if (Name ==
"fstat")
return (uint64_t)&fstat;
236 if (Name ==
"lstat")
return (uint64_t)&lstat;
237 if (Name ==
"stat64")
return (uint64_t)&stat64;
238 if (Name ==
"fstat64")
return (uint64_t)&fstat64;
239 if (Name ==
"lstat64")
return (uint64_t)&lstat64;
240 if (Name ==
"atexit")
return (uint64_t)&atexit;
241 if (Name ==
"mknod")
return (uint64_t)&mknod;
243 #if defined(__i386__) || defined(__x86_64__)
245 if (&__morestack && Name ==
"__morestack")
246 return (uint64_t)&__morestack;
248 #endif // __linux__ && __GLIBC__
251 #if defined(__BIONIC__) && defined(__arm__)
252 if (Name.compare(0, 8,
"__aeabi_") == 0) {
255 #define ARM_MATH_CHECK(fn) if (Name == #fn) return (uint64_t)&fn;
256 ARM_MATH_IMPORTS(ARM_MATH_CHECK)
257 #undef ARM_MATH_CHECK
267 if (Name ==
"__main")
return (uint64_t)&
jit_noop;
273 const char *NameStr = Name.c_str();
275 if (NameStr[0] ==
'_')
277 return (uint64_t)Ptr;
285 bool AbortOnFailure) {
288 if (!Addr && AbortOnFailure)
290 "' 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...
void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) override
Register the EH frames with the runtime so that c++ exceptions work.
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)
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
Reports a serious error, calling any installed error handler.
void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) override
#define LLVM_ATTRIBUTE_WEAK
~RTDyldMemoryManager() override
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...