Resolve JIT runtime linking problems on Android.

Patch by James Lyon!



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194832 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Kaylor 2013-11-15 17:59:43 +00:00
parent 48079e0fef
commit 1ab6084c9e
2 changed files with 84 additions and 3 deletions

View File

@ -794,7 +794,7 @@ static void runAtExitHandlers() {
// not inlined, and hiding their real definitions in a separate archive file
// that the dynamic linker can't see. For more info, search for
// 'libc_nonshared.a' on Google, or read http://llvm.org/PR274.
#if defined(__linux__)
#if defined(__linux__) && defined(__GLIBC__)
/* stat functions are redirecting to __xstat with a version number. On x86-64
* linking with libc_nonshared.a and -Wl,--export-dynamic doesn't make 'stat'
* available as an exported symbol, so we have to add it explicitly.

View File

@ -141,11 +141,81 @@ static int jit_noop() {
return 0;
}
// ARM math functions are statically linked on Android from libgcc.a, but not
// available at runtime for dynamic linking. On Linux these are usually placed
// in libgcc_s.so so can be found by normal dynamic lookup.
#if defined(__BIONIC__) && defined(__arm__)
// List of functions which are statically linked on Android and can be generated
// by LLVM. This is done as a nested macro which is used once to declare the
// imported functions with ARM_MATH_DECL and once to compare them to the
// user-requested symbol in getSymbolAddress with ARM_MATH_CHECK. The test
// assumes that all functions start with __aeabi_ and getSymbolAddress must be
// modified if that changes.
#define ARM_MATH_IMPORTS(PP) \
PP(__aeabi_d2f) \
PP(__aeabi_d2iz) \
PP(__aeabi_d2lz) \
PP(__aeabi_d2uiz) \
PP(__aeabi_d2ulz) \
PP(__aeabi_dadd) \
PP(__aeabi_dcmpeq) \
PP(__aeabi_dcmpge) \
PP(__aeabi_dcmpgt) \
PP(__aeabi_dcmple) \
PP(__aeabi_dcmplt) \
PP(__aeabi_dcmpun) \
PP(__aeabi_ddiv) \
PP(__aeabi_dmul) \
PP(__aeabi_dsub) \
PP(__aeabi_f2d) \
PP(__aeabi_f2iz) \
PP(__aeabi_f2lz) \
PP(__aeabi_f2uiz) \
PP(__aeabi_f2ulz) \
PP(__aeabi_fadd) \
PP(__aeabi_fcmpeq) \
PP(__aeabi_fcmpge) \
PP(__aeabi_fcmpgt) \
PP(__aeabi_fcmple) \
PP(__aeabi_fcmplt) \
PP(__aeabi_fcmpun) \
PP(__aeabi_fdiv) \
PP(__aeabi_fmul) \
PP(__aeabi_fsub) \
PP(__aeabi_i2d) \
PP(__aeabi_i2f) \
PP(__aeabi_idiv) \
PP(__aeabi_idivmod) \
PP(__aeabi_l2d) \
PP(__aeabi_l2f) \
PP(__aeabi_lasr) \
PP(__aeabi_ldivmod) \
PP(__aeabi_llsl) \
PP(__aeabi_llsr) \
PP(__aeabi_lmul) \
PP(__aeabi_ui2d) \
PP(__aeabi_ui2f) \
PP(__aeabi_uidiv) \
PP(__aeabi_uidivmod) \
PP(__aeabi_ul2d) \
PP(__aeabi_ul2f) \
PP(__aeabi_uldivmod)
// Declare statically linked math functions on ARM. The function declarations
// here do not have the correct prototypes for each function in
// ARM_MATH_IMPORTS, but it doesn't matter because only the symbol addresses are
// needed. In particular the __aeabi_*divmod functions do not have calling
// conventions which match any C prototype.
#define ARM_MATH_DECL(name) extern "C" void name();
ARM_MATH_IMPORTS(ARM_MATH_DECL)
#undef ARM_MATH_DECL
#endif
uint64_t RTDyldMemoryManager::getSymbolAddress(const std::string &Name) {
// This implementation assumes that the host program is the target.
// Clients generating code for a remote target should implement their own
// memory manager.
#if defined(__linux__)
#if defined(__linux__) && defined(__GLIBC__)
//===--------------------------------------------------------------------===//
// Function stubs that are invoked instead of certain library calls
//
@ -163,7 +233,18 @@ uint64_t RTDyldMemoryManager::getSymbolAddress(const std::string &Name) {
if (Name == "lstat64") return (uint64_t)&lstat64;
if (Name == "atexit") return (uint64_t)&atexit;
if (Name == "mknod") return (uint64_t)&mknod;
#endif // __linux__
#endif // __linux__ && __GLIBC__
// See ARM_MATH_IMPORTS definition for explanation
#if defined(__BIONIC__) && defined(__arm__)
if (Name.compare(0, 8, "__aeabi_") == 0) {
// Check if the user has requested any of the functions listed in
// ARM_MATH_IMPORTS, and if so redirect to the statically linked symbol.
#define ARM_MATH_CHECK(fn) if (Name == #fn) return (uint64_t)&fn;
ARM_MATH_IMPORTS(ARM_MATH_CHECK)
#undef ARM_MATH_CHECK
}
#endif
// We should not invoke parent's ctors/dtors from generated main()!
// On Mingw and Cygwin, the symbol __main is resolved to