From: Andreas Gampe Date: Thu, 4 Aug 2016 18:16:52 +0000 (-0700) Subject: ART: Fix Mac-specific things in x86-64 assembly X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=eba7e5201f29bf73fcb57aa16c24413f42c65d45;p=android-x86%2Fart.git ART: Fix Mac-specific things in x86-64 assembly We incorrectly used double-underscore on x86-64 as VAR (used by trampoline macros) introduced an additional underscore. Add CALLVAR just as on x86. Bug: 30212852 Change-Id: I2a95dd736453160769ea1a8b24c66f1738049ccb Test: m test-art-host (Linux) Test: builds on Mac --- diff --git a/runtime/arch/x86/fault_handler_x86.cc b/runtime/arch/x86/fault_handler_x86.cc index 533905ee4..3efeb406e 100644 --- a/runtime/arch/x86/fault_handler_x86.cc +++ b/runtime/arch/x86/fault_handler_x86.cc @@ -71,18 +71,9 @@ namespace art { -#if defined(__APPLE__) && defined(__x86_64__) -// mac symbols have a prefix of _ on x86_64 -extern "C" void _art_quick_throw_null_pointer_exception_from_signal(); -extern "C" void _art_quick_throw_stack_overflow(); -extern "C" void _art_quick_test_suspend(); -#define EXT_SYM(sym) _ ## sym -#else extern "C" void art_quick_throw_null_pointer_exception_from_signal(); extern "C" void art_quick_throw_stack_overflow(); extern "C" void art_quick_test_suspend(); -#define EXT_SYM(sym) sym -#endif // Note this is different from the others (no underscore on 64 bit mac) due to // the way the symbol is defined in the .S file. @@ -320,7 +311,7 @@ bool NullPointerHandler::Action(int, siginfo_t* sig, void* context) { uc->CTX_ESP = reinterpret_cast(next_sp); uc->CTX_EIP = reinterpret_cast( - EXT_SYM(art_quick_throw_null_pointer_exception_from_signal)); + art_quick_throw_null_pointer_exception_from_signal); // Pass the faulting address as the first argument of // art_quick_throw_null_pointer_exception_from_signal. #if defined(__x86_64__) @@ -397,7 +388,7 @@ bool SuspensionHandler::Action(int, siginfo_t*, void* context) { *next_sp = retaddr; uc->CTX_ESP = reinterpret_cast(next_sp); - uc->CTX_EIP = reinterpret_cast(EXT_SYM(art_quick_test_suspend)); + uc->CTX_EIP = reinterpret_cast(art_quick_test_suspend); // Now remove the suspend trigger that caused this fault. Thread::Current()->RemoveSuspendTrigger(); @@ -443,7 +434,7 @@ bool StackOverflowHandler::Action(int, siginfo_t* info, void* context) { // the previous frame. // Now arrange for the signal handler to return to art_quick_throw_stack_overflow. - uc->CTX_EIP = reinterpret_cast(EXT_SYM(art_quick_throw_stack_overflow)); + uc->CTX_EIP = reinterpret_cast(art_quick_throw_stack_overflow); return true; } diff --git a/runtime/arch/x86_64/asm_support_x86_64.S b/runtime/arch/x86_64/asm_support_x86_64.S index c4e723c48..0728f9976 100644 --- a/runtime/arch/x86_64/asm_support_x86_64.S +++ b/runtime/arch/x86_64/asm_support_x86_64.S @@ -31,7 +31,8 @@ // Clang/llvm does not support .altmacro. However, the clang/llvm preprocessor doesn't // separate the backslash and parameter by a space. Everything just works. #define RAW_VAR(name) \name - #define VAR(name) SYMBOL(\name) + #define VAR(name) \name + #define CALLVAR(name) SYMBOL(\name) #define PLT_VAR(name) \name@PLT #define REG_VAR(name) %\name #define CALL_MACRO(name) \name @@ -45,6 +46,7 @@ .altmacro #define RAW_VAR(name) name& #define VAR(name) name& + #define CALLVAR(name) SYMBOL(name&) #define PLT_VAR(name) name&@PLT #define REG_VAR(name) %name #define CALL_MACRO(name) name& @@ -110,10 +112,10 @@ END_MACRO // for mac builds. MACRO1(DEFINE_FUNCTION, c_name) FUNCTION_TYPE(SYMBOL(\c_name)) - ASM_HIDDEN SYMBOL(\c_name) - .globl VAR(c_name) + ASM_HIDDEN CALLVAR(c_name) + .globl CALLVAR(c_name) ALIGN_FUNCTION_ENTRY -VAR(c_name): +CALLVAR(c_name): CFI_STARTPROC // Ensure we get a sane starting CFA. CFI_DEF_CFA(rsp, 8) diff --git a/runtime/arch/x86_64/quick_entrypoints_x86_64.S b/runtime/arch/x86_64/quick_entrypoints_x86_64.S index 304840474..4741ac0c8 100644 --- a/runtime/arch/x86_64/quick_entrypoints_x86_64.S +++ b/runtime/arch/x86_64/quick_entrypoints_x86_64.S @@ -380,7 +380,7 @@ MACRO2(NO_ARG_RUNTIME_EXCEPTION, c_name, cxx_name) SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %rdi // pass Thread::Current() - call VAR(cxx_name) // cxx_name(Thread*) + call CALLVAR(cxx_name) // cxx_name(Thread*) UNREACHABLE END_FUNCTION VAR(c_name) END_MACRO @@ -390,7 +390,7 @@ MACRO2(ONE_ARG_RUNTIME_EXCEPTION, c_name, cxx_name) SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %rsi // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg1, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg1, Thread*) UNREACHABLE END_FUNCTION VAR(c_name) END_MACRO @@ -400,7 +400,7 @@ MACRO2(TWO_ARG_RUNTIME_EXCEPTION, c_name, cxx_name) SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %rdx // pass Thread::Current() - call VAR(cxx_name) // cxx_name(Thread*) + call CALLVAR(cxx_name) // cxx_name(Thread*) UNREACHABLE END_FUNCTION VAR(c_name) END_MACRO @@ -473,7 +473,7 @@ MACRO1(INVOKE_TRAMPOLINE_BODY, cxx_name) movq %gs:THREAD_SELF_OFFSET, %rdx // pass Thread movq %rsp, %rcx // pass SP - call VAR(cxx_name) // cxx_name(arg1, arg2, Thread*, SP) + call CALLVAR(cxx_name) // cxx_name(arg1, arg2, Thread*, SP) // save the code pointer movq %rax, %rdi movq %rdx, %rax @@ -809,7 +809,7 @@ MACRO3(ONE_ARG_DOWNCALL, c_name, cxx_name, return_macro) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %rsi // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg0, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg0, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro) // return or deliver exception END_FUNCTION VAR(c_name) @@ -820,7 +820,7 @@ MACRO3(TWO_ARG_DOWNCALL, c_name, cxx_name, return_macro) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %rdx // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg0, arg1, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg0, arg1, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro) // return or deliver exception END_FUNCTION VAR(c_name) @@ -831,7 +831,7 @@ MACRO3(THREE_ARG_DOWNCALL, c_name, cxx_name, return_macro) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %rcx // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg0, arg1, arg2, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg0, arg1, arg2, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro) // return or deliver exception END_FUNCTION VAR(c_name) @@ -842,7 +842,7 @@ MACRO3(FOUR_ARG_DOWNCALL, c_name, cxx_name, return_macro) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %r8 // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg1, arg2, arg3, arg4, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg1, arg2, arg3, arg4, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro) // return or deliver exception END_FUNCTION VAR(c_name) @@ -854,7 +854,7 @@ MACRO3(ONE_ARG_REF_DOWNCALL, c_name, cxx_name, return_macro) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // arg0 is in rdi movq %gs:THREAD_SELF_OFFSET, %rdx // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg0, referrer, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg0, referrer, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro) END_FUNCTION VAR(c_name) @@ -866,7 +866,7 @@ MACRO3(TWO_ARG_REF_DOWNCALL, c_name, cxx_name, return_macro) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // arg0 and arg1 are in rdi/rsi movq %gs:THREAD_SELF_OFFSET, %rcx // pass Thread::Current() - call VAR(cxx_name) // (arg0, arg1, referrer, Thread*) + call CALLVAR(cxx_name) // (arg0, arg1, referrer, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro) END_FUNCTION VAR(c_name) @@ -878,7 +878,7 @@ MACRO3(THREE_ARG_REF_DOWNCALL, c_name, cxx_name, return_macro) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // arg0, arg1, and arg2 are in rdi/rsi/rdx movq %gs:THREAD_SELF_OFFSET, %r8 // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg0, arg1, arg2, referrer, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg0, arg1, arg2, referrer, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro) // return or deliver exception END_FUNCTION VAR(c_name) @@ -1041,7 +1041,7 @@ MACRO1(ALLOC_OBJECT_TLAB_SLOW_PATH, cxx_name) SETUP_REFS_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC // Outgoing argument set up movq %gs:THREAD_SELF_OFFSET, %rdx // pass Thread::Current() - call VAR(cxx_name) // cxx_name(arg0, arg1, Thread*) + call CALLVAR(cxx_name) // cxx_name(arg0, arg1, Thread*) RESTORE_REFS_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER // return or deliver exception END_MACRO