diff options
author | Mark Mendell <mark.p.mendell@intel.com> | 2014-01-20 17:20:27 -0800 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-01-21 14:49:13 -0800 |
commit | 3f2d031f639b3b9dd4adbf9e70d23de931a9801d (patch) | |
tree | 7e29c747b4c5818240d36bcb600a54360975dcab | |
parent | 38f566132408ac8bb6e69db3d72b028253159ce4 (diff) | |
download | android_art-3f2d031f639b3b9dd4adbf9e70d23de931a9801d.tar.gz android_art-3f2d031f639b3b9dd4adbf9e70d23de931a9801d.tar.bz2 android_art-3f2d031f639b3b9dd4adbf9e70d23de931a9801d.zip |
Use macros to remove CFI information for MAC OS/X
Place allocation macros inline for x86 as the macros aren't/can't
go through the Linux/OSX normalizing macro wrappers.
Switch to clang for OS/X host build thereby enabling -std=gnu++11
and -Wthread-safety. Remove the -Wstrict-aliasing numeric option
as 3 is the default warning level and warning levels aren't
supported by clang's command line.
This builds as far as gtests which fail due to assumptions they
would only ever compile on non-GCC with RTTI.
Change-Id: Id0d83578e9b93b0f6aea5e9b8ddf2815f0dcd8aa
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
-rw-r--r-- | build/Android.common.mk | 6 | ||||
-rw-r--r-- | runtime/arch/x86/asm_support_x86.S | 53 | ||||
-rw-r--r-- | runtime/arch/x86/jni_entrypoints_x86.S | 8 | ||||
-rw-r--r-- | runtime/arch/x86/portable_entrypoints_x86.S | 28 | ||||
-rw-r--r-- | runtime/arch/x86/quick_entrypoints_x86.S | 363 |
5 files changed, 279 insertions, 179 deletions
diff --git a/build/Android.common.mk b/build/Android.common.mk index 026dccb5aa..415d810e80 100644 --- a/build/Android.common.mk +++ b/build/Android.common.mk @@ -87,7 +87,9 @@ LLVM_ROOT_PATH := external/llvm # Clang build. # ART_TARGET_CLANG := true -# ART_HOST_CLANG := true +ifeq ($(HOST_OS),darwin) +ART_HOST_CLANG := true +endif # directory used for dalvik-cache on device ART_DALVIK_CACHE_DIR := /data/dalvik-cache @@ -119,7 +121,7 @@ art_cflags := \ -Wall \ -Werror \ -Wextra \ - -Wstrict-aliasing=3 \ + -Wstrict-aliasing \ -fstrict-aliasing ifeq ($(ART_SMALL_MODE),true) diff --git a/runtime/arch/x86/asm_support_x86.S b/runtime/arch/x86/asm_support_x86.S index 3701b2271d..9ec199518b 100644 --- a/runtime/arch/x86/asm_support_x86.S +++ b/runtime/arch/x86/asm_support_x86.S @@ -31,11 +31,26 @@ // are mangled with an extra underscore prefix. The use of $x for arguments // mean that literals need to be represented with $$x in macros. #define SYMBOL(name) _ ## name + #define PLT_SYMBOL(name) _ ## name #define VAR(name,index) SYMBOL($index) + #define PLT_VAR(name, index) SYMBOL($index) #define REG_VAR(name,index) %$index #define CALL_MACRO(name,index) $index #define LITERAL(value) $value #define MACRO_LITERAL(value) $$value + + // Mac OS' doesn't like cfi_* directives + #define CFI_STARTPROC + #define CFI_ENDPROC + #define CFI_ADJUST_CFA_OFFSET(size) + #define CFI_DEF_CFA(reg,size) + #define CFI_DEF_CFA_REGISTER(reg) + #define CFI_RESTORE(reg) + #define CFI_REL_OFFSET(reg,size) + + // Mac OS' doesn't support certain directives + #define FUNCTION_TYPE(name) + #define SIZE(name) #else // Regular gas(1) lets you name macro parameters. #define MACRO0(macro_name) .macro macro_name @@ -51,11 +66,25 @@ // special character meaning care needs to be taken when passing registers as macro arguments. .altmacro #define SYMBOL(name) name + #define PLT_SYMBOL(name) name@PLT #define VAR(name,index) name& + #define PLT_VAR(name, index) name&@PLT #define REG_VAR(name,index) %name #define CALL_MACRO(name,index) name& #define LITERAL(value) $value #define MACRO_LITERAL(value) $value + + // CFI support + #define CFI_STARTPROC .cfi_startproc + #define CFI_ENDPROC .cfi_endproc + #define CFI_ADJUST_CFA_OFFSET(size) .cfi_adjust_cfa_offset size + #define CFI_DEF_CFA(reg,size) .cfi_def_cfa reg,size + #define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg + #define CFI_RESTORE(reg) .cfi_restore reg + #define CFI_REL_OFFSET(reg,size) .cfi_rel_offset reg,size + + #define FUNCTION_TYPE(name) .type name&, @function + #define SIZE(name) .size name, .-name #endif /* Cache alignment for function entry */ @@ -64,40 +93,40 @@ MACRO0(ALIGN_FUNCTION_ENTRY) END_MACRO MACRO1(DEFINE_FUNCTION, c_name) - .type VAR(c_name, 0), @function + FUNCTION_TYPE(\c_name) .globl VAR(c_name, 0) ALIGN_FUNCTION_ENTRY VAR(c_name, 0): - .cfi_startproc + CFI_STARTPROC END_MACRO MACRO1(END_FUNCTION, c_name) - .cfi_endproc - .size \c_name, .-\c_name + CFI_ENDPROC + SIZE(\c_name) END_MACRO MACRO1(PUSH, reg) pushl REG_VAR(reg, 0) - .cfi_adjust_cfa_offset 4 - .cfi_rel_offset REG_VAR(reg, 0), 0 + CFI_ADJUST_CFA_OFFSET(4) + CFI_REL_OFFSET(REG_VAR(reg, 0), 0) END_MACRO MACRO1(POP, reg) popl REG_VAR(reg,0) - .cfi_adjust_cfa_offset -4 - .cfi_restore REG_VAR(reg,0) + CFI_ADJUST_CFA_OFFSET(-4) + CFI_RESTORE(REG_VAR(reg,0)) END_MACRO MACRO1(UNIMPLEMENTED,name) - .type VAR(name, 0), @function + FUNCTION_TYPE(\name) .globl VAR(name, 0) ALIGN_FUNCTION_ENTRY VAR(name, 0): - .cfi_startproc + CFI_STARTPROC int3 int3 - .cfi_endproc - .size \name, .-\name + CFI_ENDPROC + SIZE(\name) END_MACRO MACRO0(SETUP_GOT_NOSAVE) diff --git a/runtime/arch/x86/jni_entrypoints_x86.S b/runtime/arch/x86/jni_entrypoints_x86.S index e394819d25..72047d52d5 100644 --- a/runtime/arch/x86/jni_entrypoints_x86.S +++ b/runtime/arch/x86/jni_entrypoints_x86.S @@ -21,14 +21,14 @@ */ DEFINE_FUNCTION art_jni_dlsym_lookup_stub subl LITERAL(4), %esp // align stack - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) SETUP_GOT // pushes ebx pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 - call SYMBOL(artFindNativeMethod)@PLT // (Thread*) + CFI_ADJUST_CFA_OFFSET(4) + call PLT_SYMBOL(artFindNativeMethod) // (Thread*) UNDO_SETUP_GOT addl LITERAL(8), %esp // restore the stack - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) cmpl LITERAL(0), %eax // check if returned method code is null je no_native_code_found // if null, jump to return to handle jmp *%eax // otherwise, tail call to intended method diff --git a/runtime/arch/x86/portable_entrypoints_x86.S b/runtime/arch/x86/portable_entrypoints_x86.S index a1f6b2ddf1..48de7c133d 100644 --- a/runtime/arch/x86/portable_entrypoints_x86.S +++ b/runtime/arch/x86/portable_entrypoints_x86.S @@ -31,7 +31,7 @@ DEFINE_FUNCTION art_portable_invoke_stub PUSH ebp // save ebp PUSH ebx // save ebx mov %esp, %ebp // copy value of stack pointer into base pointer - .cfi_def_cfa_register ebp + CFI_DEF_CFA_REGISTER(ebp) mov 20(%ebp), %ebx // get arg array size addl LITERAL(28), %ebx // reserve space for return addr, method*, ebx, and ebp in frame andl LITERAL(0xFFFFFFF0), %ebx // align frame size to 16 bytes @@ -42,7 +42,7 @@ DEFINE_FUNCTION art_portable_invoke_stub pushl 20(%ebp) // push size of region to memcpy pushl 16(%ebp) // push arg array as source of memcpy pushl %eax // push stack pointer as destination of memcpy - call SYMBOL(memcpy)@PLT // (void*, const void*, size_t) + call PLT_SYMBOL(memcpy) // (void*, const void*, size_t) addl LITERAL(12), %esp // pop arguments to memcpy mov 12(%ebp), %eax // move method pointer into eax mov %eax, (%esp) // push method pointer onto stack @@ -69,7 +69,7 @@ END_FUNCTION art_portable_invoke_stub DEFINE_FUNCTION art_portable_proxy_invoke_handler PUSH ebp // Set up frame. movl %esp, %ebp - .cfi_def_cfa_register %ebp + CFI_DEF_CFA_REGISTER(%ebp) subl LITERAL(4), %esp // Align stack SETUP_GOT // pushes ebx leal 8(%ebp), %edx // %edx = ArtMethod** called_addr @@ -79,11 +79,11 @@ DEFINE_FUNCTION art_portable_proxy_invoke_handler pushl %fs:THREAD_SELF_OFFSET // Pass thread. pushl %ecx // Pass receiver. pushl %eax // Pass called. - call SYMBOL(artPortableProxyInvokeHandler)@PLT // (called, receiver, Thread*, &called) + call PLT_SYMBOL(artPortableProxyInvokeHandler) // (called, receiver, Thread*, &called) UNDO_SETUP_GOT leave - .cfi_restore %ebp - .cfi_def_cfa %esp, 4 + CFI_RESTORE(%ebp) + CFI_DEF_CFA(%esp, 4) movd %eax, %xmm0 // Place return value also into floating point return value. movd %edx, %xmm1 punpckldq %xmm1, %xmm0 @@ -93,7 +93,7 @@ END_FUNCTION art_portable_proxy_invoke_handler DEFINE_FUNCTION art_portable_resolution_trampoline PUSH ebp // Set up frame. movl %esp, %ebp - .cfi_def_cfa_register %ebp + CFI_DEF_CFA_REGISTER(%ebp) subl LITERAL(4), %esp // Align stack SETUP_GOT // pushes ebx leal 8(%ebp), %edx // %edx = ArtMethod** called_addr @@ -103,11 +103,11 @@ DEFINE_FUNCTION art_portable_resolution_trampoline pushl %fs:THREAD_SELF_OFFSET // Pass thread. pushl %ecx // Pass receiver. pushl %eax // Pass called. - call SYMBOL(artPortableResolutionTrampoline)@PLT // (called, receiver, Thread*, &called) + call PLT_SYMBOL(artPortableResolutionTrampoline) // (called, receiver, Thread*, &called) UNDO_SETUP_GOT leave - .cfi_restore %ebp - .cfi_def_cfa %esp, 4 + CFI_RESTORE(%ebp) + CFI_DEF_CFA(%esp, 4) testl %eax, %eax jz resolve_fail jmp * %eax @@ -118,7 +118,7 @@ END_FUNCTION art_portable_resolution_trampoline DEFINE_FUNCTION art_portable_to_interpreter_bridge PUSH ebp // Set up frame. movl %esp, %ebp - .cfi_def_cfa_register %ebp + CFI_DEF_CFA_REGISTER(%ebp) subl LITERAL(8), %esp // Align stack SETUP_GOT leal 8(%ebp), %edx // %edx = ArtMethod** called_addr @@ -126,10 +126,10 @@ DEFINE_FUNCTION art_portable_to_interpreter_bridge pushl %edx // Pass called_addr. pushl %fs:THREAD_SELF_OFFSET // Pass thread. pushl %eax // Pass called. - call SYMBOL(artPortableToInterpreterBridge)@PLT // (called, Thread*, &called) + call PLT_SYMBOL(artPortableToInterpreterBridge) // (called, Thread*, &called) UNDO_SETUP_GOT leave - .cfi_restore %ebp - .cfi_def_cfa %esp, 4 + CFI_RESTORE(%ebp) + CFI_DEF_CFA(%esp, 4) ret END_FUNCTION art_portable_to_interpreter_bridge diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S index 69738ba1a1..3adc46a51d 100644 --- a/runtime/arch/x86/quick_entrypoints_x86.S +++ b/runtime/arch/x86/quick_entrypoints_x86.S @@ -16,8 +16,6 @@ #include "asm_support_x86.S" -#include "arch/quick_alloc_entrypoints.S" - // For x86, the CFA is esp+4, the address above the pushed return address on the stack. /* @@ -29,7 +27,7 @@ MACRO0(SETUP_SAVE_ALL_CALLEE_SAVE_FRAME) PUSH esi PUSH ebp subl MACRO_LITERAL(16), %esp // Grow stack by 4 words, bottom word will hold Method* - .cfi_adjust_cfa_offset 16 + CFI_ADJUST_CFA_OFFSET(16) END_MACRO /* @@ -41,7 +39,7 @@ MACRO0(SETUP_REF_ONLY_CALLEE_SAVE_FRAME) PUSH esi PUSH ebp subl MACRO_LITERAL(16), %esp // Grow stack by 4 words, bottom word will hold Method* - .cfi_adjust_cfa_offset 16 + CFI_ADJUST_CFA_OFFSET(16) END_MACRO MACRO0(RESTORE_REF_ONLY_CALLEE_SAVE_FRAME) @@ -49,7 +47,7 @@ MACRO0(RESTORE_REF_ONLY_CALLEE_SAVE_FRAME) POP ebp // Restore callee saves (ebx is saved/restored by the upcall) POP esi POP edi - .cfi_adjust_cfa_offset -28 + CFI_ADJUST_CFA_OFFSET(-28) END_MACRO /* @@ -68,7 +66,7 @@ END_MACRO MACRO0(RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME) addl MACRO_LITERAL(4), %esp // Remove padding - .cfi_adjust_cfa_offset -4 + CFI_ADJUST_CFA_OFFSET(-4) POP ecx // Restore args except eax POP edx POP ebx @@ -86,12 +84,12 @@ MACRO0(DELIVER_PENDING_EXCEPTION) mov %esp, %ecx // Outgoing argument set up subl MACRO_LITERAL(8), %esp // Alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH ecx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) SETUP_GOT_NOSAVE // clobbers ebx (harmless here) - call SYMBOL(artDeliverPendingExceptionFromCode)@PLT // artDeliverPendingExceptionFromCode(Thread*, SP) + call PLT_SYMBOL(artDeliverPendingExceptionFromCode) // artDeliverPendingExceptionFromCode(Thread*, SP) int3 // unreached END_MACRO @@ -101,12 +99,12 @@ MACRO2(NO_ARG_RUNTIME_EXCEPTION, c_name, cxx_name) mov %esp, %ecx // Outgoing argument set up subl MACRO_LITERAL(8), %esp // alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH ecx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) SETUP_GOT_NOSAVE // clobbers ebx (harmless here) - call VAR(cxx_name, 1)@PLT // cxx_name(Thread*, SP) + call PLT_VAR(cxx_name, 1) // cxx_name(Thread*, SP) int3 // unreached END_FUNCTION VAR(c_name, 0) END_MACRO @@ -119,10 +117,10 @@ MACRO2(ONE_ARG_RUNTIME_EXCEPTION, c_name, cxx_name) PUSH eax // alignment padding PUSH ecx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH eax // pass arg1 SETUP_GOT_NOSAVE // clobbers ebx (harmless here) - call VAR(cxx_name, 1)@PLT // cxx_name(arg1, Thread*, SP) + call PLT_VAR(cxx_name, 1) // cxx_name(arg1, Thread*, SP) int3 // unreached END_FUNCTION VAR(c_name, 0) END_MACRO @@ -134,11 +132,11 @@ MACRO2(TWO_ARG_RUNTIME_EXCEPTION, c_name, cxx_name) // Outgoing argument set up PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass arg2 PUSH eax // pass arg1 SETUP_GOT_NOSAVE // clobbers ebx (harmless here) - call VAR(cxx_name, 1)@PLT // cxx_name(arg1, arg2, Thread*, SP) + call PLT_VAR(cxx_name, 1) // cxx_name(arg1, arg2, Thread*, SP) int3 // unreached END_FUNCTION VAR(c_name, 0) END_MACRO @@ -206,18 +204,18 @@ MACRO2(INVOKE_TRAMPOLINE, c_name, cxx_name) // Outgoing argument set up SETUP_GOT_NOSAVE subl MACRO_LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) pushl 32(%edx) // pass caller Method* - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass arg2 PUSH eax // pass arg1 - call VAR(cxx_name, 1)@PLT // cxx_name(arg1, arg2, arg3, Thread*, SP) + call PLT_VAR(cxx_name, 1) // cxx_name(arg1, arg2, arg3, Thread*, SP) movl %edx, %edi // save code pointer in EDI addl MACRO_LITERAL(36), %esp // Pop arguments skip eax - .cfi_adjust_cfa_offset -36 + CFI_ADJUST_CFA_OFFSET(-36) POP ecx // Restore args except eax POP edx POP ebx @@ -231,7 +229,7 @@ MACRO2(INVOKE_TRAMPOLINE, c_name, cxx_name) ret 1: addl MACRO_LITERAL(4), %esp // Pop code pointer off stack - .cfi_adjust_cfa_offset -4 + CFI_ADJUST_CFA_OFFSET(-4) DELIVER_PENDING_EXCEPTION END_FUNCTION VAR(c_name, 0) END_MACRO @@ -259,7 +257,7 @@ DEFINE_FUNCTION art_quick_invoke_stub PUSH ebp // save ebp PUSH ebx // save ebx mov %esp, %ebp // copy value of stack pointer into base pointer - .cfi_def_cfa_register ebp + CFI_DEF_CFA_REGISTER(ebp) mov 20(%ebp), %ebx // get arg array size addl LITERAL(28), %ebx // reserve space for return addr, method*, ebx, and ebp in frame andl LITERAL(0xFFFFFFF0), %ebx // align frame size to 16 bytes @@ -270,7 +268,7 @@ DEFINE_FUNCTION art_quick_invoke_stub pushl 20(%ebp) // push size of region to memcpy pushl 16(%ebp) // push arg array as source of memcpy pushl %eax // push stack pointer as destination of memcpy - call SYMBOL(memcpy)@PLT // (void*, const void*, size_t) + call PLT_SYMBOL(memcpy) // (void*, const void*, size_t) addl LITERAL(12), %esp // pop arguments to memcpy movl LITERAL(0), (%esp) // store NULL for method* mov 12(%ebp), %eax // move method pointer into eax @@ -279,7 +277,7 @@ DEFINE_FUNCTION art_quick_invoke_stub mov 12(%esp), %ebx // copy arg3 into ebx call *METHOD_CODE_OFFSET(%eax) // call the method mov %ebp, %esp // restore stack pointer - .cfi_def_cfa_register esp + CFI_DEF_CFA_REGISTER(esp) POP ebx // pop ebx POP ebp // pop ebp mov 20(%esp), %ecx // get result pointer @@ -303,13 +301,13 @@ MACRO3(NO_ARG_DOWNCALL, c_name, cxx_name, return_macro) SETUP_GOT_NOSAVE // clobbers ebx (harmless here) // Outgoing argument set up subl MACRO_LITERAL(8), %esp // push padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 - call VAR(cxx_name, 1)@PLT // cxx_name(Thread*, SP) + CFI_ADJUST_CFA_OFFSET(4) + call PLT_VAR(cxx_name, 1) // cxx_name(Thread*, SP) addl MACRO_LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro, 2) // return or deliver exception END_FUNCTION VAR(c_name, 0) @@ -324,11 +322,11 @@ MACRO3(ONE_ARG_DOWNCALL, c_name, cxx_name, return_macro) PUSH eax // push padding PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH eax // pass arg1 - call VAR(cxx_name, 1)@PLT // cxx_name(arg1, Thread*, SP) + call PLT_VAR(cxx_name, 1) // cxx_name(arg1, Thread*, SP) addl MACRO_LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro, 2) // return or deliver exception END_FUNCTION VAR(c_name, 0) @@ -342,12 +340,12 @@ MACRO3(TWO_ARG_DOWNCALL, c_name, cxx_name, return_macro) // Outgoing argument set up PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass arg2 PUSH eax // pass arg1 - call VAR(cxx_name, 1)@PLT // cxx_name(arg1, arg2, Thread*, SP) + call PLT_VAR(cxx_name, 1) // cxx_name(arg1, arg2, Thread*, SP) addl MACRO_LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro, 2) // return or deliver exception END_FUNCTION VAR(c_name, 0) @@ -359,17 +357,17 @@ MACRO3(THREE_ARG_DOWNCALL, c_name, cxx_name, return_macro) mov %esp, %ebx // remember SP // Outgoing argument set up subl MACRO_LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // pass arg3 PUSH ecx // pass arg2 PUSH eax // pass arg1 SETUP_GOT_NOSAVE // clobbers EBX - call VAR(cxx_name, 1)@PLT // cxx_name(arg1, arg2, arg3, Thread*, SP) + call PLT_VAR(cxx_name, 1) // cxx_name(arg1, arg2, arg3, Thread*, SP) addl MACRO_LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address CALL_MACRO(return_macro, 2) // return or deliver exception END_FUNCTION VAR(c_name, 0) @@ -401,7 +399,78 @@ MACRO0(RETURN_OR_DELIVER_PENDING_EXCEPTION) END_MACRO // Generate the allocation entrypoints for each allocator. -GENERATE_ALL_ALLOC_ENTRYPOINTS +// TODO: use arch/quick_alloc_entrypoints.S. Currently we don't as we need to use concatenation +// macros to work around differences between OS/X's as and binutils as (OS/X lacks named arguments +// to macros and the VAR macro won't concatenate arguments properly), this also breaks having +// multi-line macros that use each other (hence using 1 macro per newline below). +#define GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(c_suffix, cxx_suffix) \ + TWO_ARG_DOWNCALL art_quick_alloc_object ## c_suffix, artAllocObjectFromCode ## cxx_suffix, RETURN_IF_RESULT_IS_NON_ZERO +#define GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(c_suffix, cxx_suffix) \ + TWO_ARG_DOWNCALL art_quick_alloc_object_with_access_check ## c_suffix, artAllocObjectFromCodeWithAccessCheck ## cxx_suffix, RETURN_IF_RESULT_IS_NON_ZERO +#define GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(c_suffix, cxx_suffix) \ + THREE_ARG_DOWNCALL art_quick_alloc_array ## c_suffix, artAllocArrayFromCode ## cxx_suffix, RETURN_IF_RESULT_IS_NON_ZERO +#define GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(c_suffix, cxx_suffix) \ + THREE_ARG_DOWNCALL art_quick_alloc_array_with_access_check ## c_suffix, artAllocArrayFromCodeWithAccessCheck ## cxx_suffix, RETURN_IF_RESULT_IS_NON_ZERO +#define GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(c_suffix, cxx_suffix) \ + THREE_ARG_DOWNCALL art_quick_check_and_alloc_array ## c_suffix, artCheckAndAllocArrayFromCode ## cxx_suffix, RETURN_IF_RESULT_IS_NON_ZERO +#define GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(c_suffix, cxx_suffix) \ + THREE_ARG_DOWNCALL art_quick_check_and_alloc_array_with_access_check ## c_suffix, artCheckAndAllocArrayFromCodeWithAccessCheck ## cxx_suffix, RETURN_IF_RESULT_IS_NON_ZERO + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_dlmalloc, DlMalloc) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_dlmalloc, DlMalloc) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_dlmalloc, DlMalloc) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_dlmalloc, DlMalloc) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_dlmalloc, DlMalloc) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_dlmalloc, DlMalloc) + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_dlmalloc_instrumented, DlMallocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_dlmalloc_instrumented, DlMallocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_dlmalloc_instrumented, DlMallocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_dlmalloc_instrumented, DlMallocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_dlmalloc_instrumented, DlMallocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_dlmalloc_instrumented, DlMallocInstrumented) + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_rosalloc, RosAlloc) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_rosalloc, RosAlloc) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_rosalloc, RosAlloc) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_rosalloc, RosAlloc) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_rosalloc, RosAlloc) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_rosalloc, RosAlloc) + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_rosalloc_instrumented, RosAllocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_rosalloc_instrumented, RosAllocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_rosalloc_instrumented, RosAllocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_rosalloc_instrumented, RosAllocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_rosalloc_instrumented, RosAllocInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_rosalloc_instrumented, RosAllocInstrumented) + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_bump_pointer, BumpPointer) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_bump_pointer, BumpPointer) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_bump_pointer, BumpPointer) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_bump_pointer, BumpPointer) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_bump_pointer, BumpPointer) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_bump_pointer, BumpPointer) + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_bump_pointer_instrumented, BumpPointerInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_bump_pointer_instrumented, BumpPointerInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_bump_pointer_instrumented, BumpPointerInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_bump_pointer_instrumented, BumpPointerInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_bump_pointer_instrumented, BumpPointerInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_bump_pointer_instrumented, BumpPointerInstrumented) + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_tlab, TLAB) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_tlab, TLAB) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_tlab, TLAB) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_tlab, TLAB) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_tlab, TLAB) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_tlab, TLAB) + +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT(_tlab_instrumented, TLABInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_OBJECT_WITH_ACCESS_CHECK(_tlab_instrumented, TLABInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY(_tlab_instrumented, TLABInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_ALLOC_ARRAY_WITH_ACCESS_CHECK(_tlab_instrumented, TLABInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY(_tlab_instrumented, TLABInstrumented) +GENERATE_ALLOC_ENTRYPOINTS_CHECK_AND_ALLOC_ARRAY_WITH_ACCESS_CHECK(_tlab_instrumented, TLABInstrumented) TWO_ARG_DOWNCALL art_quick_resolve_string, artResolveStringFromCode, RETURN_IF_RESULT_IS_NON_ZERO TWO_ARG_DOWNCALL art_quick_initialize_static_storage, artInitializeStaticStorageFromCode, RETURN_IF_RESULT_IS_NON_ZERO @@ -445,11 +514,11 @@ slow_lock: PUSH eax // push padding PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH eax // pass object - call artLockObjectFromCode@PLT // artLockObjectFromCode(object, Thread*, SP) - addl MACRO_LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + call PLT_SYMBOL(artLockObjectFromCode) // artLockObjectFromCode(object, Thread*, SP) + addl LITERAL(16), %esp // pop arguments + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO END_FUNCTION art_quick_lock_object @@ -479,11 +548,11 @@ slow_unlock: PUSH eax // push padding PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH eax // pass object - call artUnlockObjectFromCode@PLT // artUnlockObjectFromCode(object, Thread*, SP) - addl MACRO_LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + call PLT_SYMBOL(artUnlockObjectFromCode) // artUnlockObjectFromCode(object, Thread*, SP) + addl LITERAL(16), %esp // pop arguments + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO END_FUNCTION art_quick_unlock_object @@ -493,9 +562,9 @@ DEFINE_FUNCTION art_quick_is_assignable PUSH eax // alignment padding PUSH ecx // pass arg2 - obj->klass PUSH eax // pass arg1 - checked class - call SYMBOL(artIsAssignableFromCode)@PLT // (Class* klass, Class* ref_klass) + call PLT_SYMBOL(artIsAssignableFromCode) // (Class* klass, Class* ref_klass) addl LITERAL(12), %esp // pop arguments - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) ret END_FUNCTION art_quick_is_assignable @@ -504,26 +573,26 @@ DEFINE_FUNCTION art_quick_check_cast PUSH eax // alignment padding PUSH ecx // pass arg2 - obj->klass PUSH eax // pass arg1 - checked class - call SYMBOL(artIsAssignableFromCode)@PLT // (Class* klass, Class* ref_klass) + call PLT_SYMBOL(artIsAssignableFromCode) // (Class* klass, Class* ref_klass) testl %eax, %eax jz 1f // jump forward if not assignable addl LITERAL(12), %esp // pop arguments - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) ret 1: POP eax // pop arguments POP ecx addl LITERAL(4), %esp - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context mov %esp, %edx // Outgoing argument set up PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass arg2 PUSH eax // pass arg1 - call SYMBOL(artThrowClassCastException)@PLT // (Class* a, Class* b, Thread*, SP) + call PLT_SYMBOL(artThrowClassCastException) // (Class* a, Class* b, Thread*, SP) int3 // unreached END_FUNCTION art_quick_check_cast @@ -568,14 +637,14 @@ check_assignability: PUSH ecx PUSH edx subl LITERAL(8), %esp // alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) pushl CLASS_OFFSET(%edx) // pass arg2 - type of the value to be stored - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ebx // pass arg1 - component type of the array SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artIsAssignableFromCode)@PLT // (Class* a, Class* b) + call PLT_SYMBOL(artIsAssignableFromCode) // (Class* a, Class* b) addl LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) testl %eax, %eax jz throw_array_store_exception POP edx @@ -595,10 +664,10 @@ throw_array_store_exception: // Outgoing argument set up PUSH ecx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // pass arg2 - value PUSH eax // pass arg1 - array - call SYMBOL(artThrowArrayStoreException)@PLT // (array, value, Thread*, SP) + call PLT_SYMBOL(artThrowArrayStoreException) // (array, value, Thread*, SP) int3 // unreached END_FUNCTION art_quick_aput_obj @@ -607,9 +676,9 @@ DEFINE_FUNCTION art_quick_memcpy PUSH edx // pass arg3 PUSH ecx // pass arg2 PUSH eax // pass arg1 - call SYMBOL(memcpy)@PLT // (void*, const void*, size_t) + call PLT_SYMBOL(memcpy) // (void*, const void*, size_t) addl LITERAL(12), %esp // pop arguments - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) ret END_FUNCTION art_quick_memcpy @@ -617,17 +686,17 @@ NO_ARG_DOWNCALL art_quick_test_suspend, artTestSuspendFromCode, ret DEFINE_FUNCTION art_quick_fmod subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass arg4 b.hi PUSH edx // pass arg3 b.lo PUSH ecx // pass arg2 a.hi PUSH eax // pass arg1 a.lo SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(fmod)@PLT // (jdouble a, jdouble b) + call PLT_SYMBOL(fmod) // (jdouble a, jdouble b) fstpl (%esp) // pop return value off fp stack movsd (%esp), %xmm0 // place into %xmm0 addl LITERAL(28), %esp // pop arguments - .cfi_adjust_cfa_offset -28 + CFI_ADJUST_CFA_OFFSET(-28) ret END_FUNCTION art_quick_fmod @@ -636,11 +705,11 @@ DEFINE_FUNCTION art_quick_fmodf PUSH ecx // pass arg2 b PUSH eax // pass arg1 a SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(fmodf)@PLT // (jfloat a, jfloat b) + call PLT_SYMBOL(fmodf) // (jfloat a, jfloat b) fstps (%esp) // pop return value off fp stack movss (%esp), %xmm0 // place into %xmm0 addl LITERAL(12), %esp // pop arguments - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) ret END_FUNCTION art_quick_fmodf @@ -651,7 +720,7 @@ DEFINE_FUNCTION art_quick_l2d fstpl (%esp) // pop value off fp stack as double movsd (%esp), %xmm0 // place into %xmm0 addl LITERAL(8), %esp // pop arguments - .cfi_adjust_cfa_offset -8 + CFI_ADJUST_CFA_OFFSET(-8) ret END_FUNCTION art_quick_l2d @@ -662,7 +731,7 @@ DEFINE_FUNCTION art_quick_l2f fstps (%esp) // pop value off fp stack as a single movss (%esp), %xmm0 // place into %xmm0 addl LITERAL(8), %esp // pop argument - .cfi_adjust_cfa_offset -8 + CFI_ADJUST_CFA_OFFSET(-8) ret END_FUNCTION art_quick_l2f @@ -671,20 +740,20 @@ DEFINE_FUNCTION art_quick_d2l PUSH ecx // pass arg2 a.hi PUSH eax // pass arg1 a.lo SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(art_d2l)@PLT // (jdouble a) + call PLT_SYMBOL(art_d2l) // (jdouble a) addl LITERAL(12), %esp // pop arguments - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) ret END_FUNCTION art_quick_d2l DEFINE_FUNCTION art_quick_f2l subl LITERAL(8), %esp // alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) SETUP_GOT_NOSAVE // clobbers EBX PUSH eax // pass arg1 a - call SYMBOL(art_f2l)@PLT // (jfloat a) + call PLT_SYMBOL(art_f2l) // (jfloat a) addl LITERAL(12), %esp // pop arguments - .cfi_adjust_cfa_offset -12 + CFI_ADJUST_CFA_OFFSET(-12) ret END_FUNCTION art_quick_f2l @@ -704,29 +773,29 @@ END_FUNCTION art_quick_idivmod DEFINE_FUNCTION art_quick_ldiv subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass arg4 b.hi PUSH edx // pass arg3 b.lo PUSH ecx // pass arg2 a.hi PUSH eax // pass arg1 a.lo SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artLdiv)@PLT // (jlong a, jlong b) + call PLT_SYMBOL(artLdiv) // (jlong a, jlong b) addl LITERAL(28), %esp // pop arguments - .cfi_adjust_cfa_offset -28 + CFI_ADJUST_CFA_OFFSET(-28) ret END_FUNCTION art_quick_ldiv DEFINE_FUNCTION art_quick_lmod subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass arg4 b.hi PUSH edx // pass arg3 b.lo PUSH ecx // pass arg2 a.hi PUSH eax // pass arg1 a.lo SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artLmod)@PLT // (jlong a, jlong b) + call PLT_SYMBOL(artLmod) // (jlong a, jlong b) addl LITERAL(28), %esp // pop arguments - .cfi_adjust_cfa_offset -28 + CFI_ADJUST_CFA_OFFSET(-28) ret END_FUNCTION art_quick_lmod @@ -782,19 +851,19 @@ DEFINE_FUNCTION art_quick_set32_instance SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC mov %esp, %ebx // remember SP subl LITERAL(8), %esp // alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) mov 32(%ebx), %ebx // get referrer PUSH ebx // pass referrer PUSH edx // pass new_val PUSH ecx // pass object PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artSet32InstanceFromCode)@PLT // (field_idx, Object*, new_val, referrer, Thread*, SP) + call PLT_SYMBOL(artSet32InstanceFromCode) // (field_idx, Object*, new_val, referrer, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO // return or deliver exception END_FUNCTION art_quick_set32_instance @@ -802,19 +871,19 @@ END_FUNCTION art_quick_set32_instance DEFINE_FUNCTION art_quick_set64_instance SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC subl LITERAL(8), %esp // alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH esp // pass SP-8 addl LITERAL(8), (%esp) // fix SP on stack by adding 8 pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ebx // pass high half of new_val PUSH edx // pass low half of new_val PUSH ecx // pass object PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artSet64InstanceFromCode)@PLT // (field_idx, Object*, new_val, Thread*, SP) + call PLT_SYMBOL(artSet64InstanceFromCode) // (field_idx, Object*, new_val, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO // return or deliver exception END_FUNCTION art_quick_set64_instance @@ -823,19 +892,19 @@ DEFINE_FUNCTION art_quick_set_obj_instance SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC mov %esp, %ebx // remember SP subl LITERAL(8), %esp // alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) mov 32(%ebx), %ebx // get referrer PUSH ebx // pass referrer PUSH edx // pass new_val PUSH ecx // pass object PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artSetObjInstanceFromCode)@PLT // (field_idx, Object*, new_val, referrer, Thread*, SP) + call PLT_SYMBOL(artSetObjInstanceFromCode) // (field_idx, Object*, new_val, referrer, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO // return or deliver exception END_FUNCTION art_quick_set_obj_instance @@ -845,17 +914,17 @@ DEFINE_FUNCTION art_quick_get32_instance mov %esp, %ebx // remember SP mov 32(%esp), %edx // get referrer subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // pass referrer PUSH ecx // pass object PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artGet32InstanceFromCode)@PLT // (field_idx, Object*, referrer, Thread*, SP) + call PLT_SYMBOL(artGet32InstanceFromCode) // (field_idx, Object*, referrer, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_get32_instance @@ -865,17 +934,17 @@ DEFINE_FUNCTION art_quick_get64_instance mov %esp, %ebx // remember SP mov 32(%esp), %edx // get referrer subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // pass referrer PUSH ecx // pass object PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artGet64InstanceFromCode)@PLT // (field_idx, Object*, referrer, Thread*, SP) + call PLT_SYMBOL(artGet64InstanceFromCode) // (field_idx, Object*, referrer, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_get64_instance @@ -885,17 +954,17 @@ DEFINE_FUNCTION art_quick_get_obj_instance mov %esp, %ebx // remember SP mov 32(%esp), %edx // get referrer subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // pass referrer PUSH ecx // pass object PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artGetObjInstanceFromCode)@PLT // (field_idx, Object*, referrer, Thread*, SP) + call PLT_SYMBOL(artGetObjInstanceFromCode) // (field_idx, Object*, referrer, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_get_obj_instance @@ -905,17 +974,17 @@ DEFINE_FUNCTION art_quick_set32_static mov %esp, %ebx // remember SP mov 32(%esp), %edx // get referrer subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // pass referrer PUSH ecx // pass new_val PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artSet32StaticFromCode)@PLT // (field_idx, new_val, referrer, Thread*, SP) + call PLT_SYMBOL(artSet32StaticFromCode) // (field_idx, new_val, referrer, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO // return or deliver exception END_FUNCTION art_quick_set32_static @@ -924,19 +993,19 @@ DEFINE_FUNCTION art_quick_set64_static SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC mov %esp, %ebx // remember SP subl LITERAL(8), %esp // alignment padding - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) mov 32(%ebx), %ebx // get referrer PUSH edx // pass high half of new_val PUSH ecx // pass low half of new_val PUSH ebx // pass referrer PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artSet64StaticFromCode)@PLT // (field_idx, referrer, new_val, Thread*, SP) + call PLT_SYMBOL(artSet64StaticFromCode) // (field_idx, referrer, new_val, Thread*, SP) addl LITERAL(32), %esp // pop arguments - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO // return or deliver exception END_FUNCTION art_quick_set64_static @@ -946,15 +1015,15 @@ DEFINE_FUNCTION art_quick_set_obj_static mov %esp, %ebx // remember SP mov 32(%esp), %edx // get referrer subl LITERAL(12), %esp // alignment padding - .cfi_adjust_cfa_offset 12 + CFI_ADJUST_CFA_OFFSET(12) PUSH ebx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // pass referrer PUSH ecx // pass new_val PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artSetObjStaticFromCode)@PLT // (field_idx, new_val, referrer, Thread*, SP) + call PLT_SYMBOL(artSetObjStaticFromCode) // (field_idx, new_val, referrer, Thread*, SP) addl LITERAL(32), %esp // pop arguments RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_IF_EAX_ZERO // return or deliver exception @@ -966,13 +1035,13 @@ DEFINE_FUNCTION art_quick_get32_static mov 32(%esp), %ecx // get referrer PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass referrer PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artGet32StaticFromCode)@PLT // (field_idx, referrer, Thread*, SP) + call PLT_SYMBOL(artGet32StaticFromCode) // (field_idx, referrer, Thread*, SP) addl LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_get32_static @@ -983,13 +1052,13 @@ DEFINE_FUNCTION art_quick_get64_static mov 32(%esp), %ecx // get referrer PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass referrer PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artGet64StaticFromCode)@PLT // (field_idx, referrer, Thread*, SP) + call PLT_SYMBOL(artGet64StaticFromCode) // (field_idx, referrer, Thread*, SP) addl LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_get64_static @@ -1000,13 +1069,13 @@ DEFINE_FUNCTION art_quick_get_obj_static mov 32(%esp), %ecx // get referrer PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass referrer PUSH eax // pass field_idx SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artGetObjStaticFromCode)@PLT // (field_idx, referrer, Thread*, SP) + call PLT_SYMBOL(artGetObjStaticFromCode) // (field_idx, referrer, Thread*, SP) addl LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_get_obj_static @@ -1015,16 +1084,16 @@ DEFINE_FUNCTION art_quick_proxy_invoke_handler SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME // save frame and Method* PUSH esp // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass receiver PUSH eax // pass proxy method SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artQuickProxyInvokeHandler)@PLT // (proxy method, receiver, Thread*, SP) + call PLT_SYMBOL(artQuickProxyInvokeHandler) // (proxy method, receiver, Thread*, SP) movd %eax, %xmm0 // place return value also into floating point return value movd %edx, %xmm1 punpckldq %xmm1, %xmm0 addl LITERAL(44), %esp // pop arguments - .cfi_adjust_cfa_offset -44 + CFI_ADJUST_CFA_OFFSET(-44) RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_proxy_invoke_handler @@ -1046,11 +1115,11 @@ DEFINE_FUNCTION art_quick_resolution_trampoline SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME PUSH esp // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // pass receiver PUSH eax // pass method SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artQuickResolutionTrampoline)@PLT // (Method* called, receiver, Thread*, SP) + call PLT_SYMBOL(artQuickResolutionTrampoline) // (Method* called, receiver, Thread*, SP) movl %eax, %edi // remember code pointer in EDI addl LITERAL(16), %esp // pop arguments test %eax, %eax // if code pointer is NULL goto deliver pending exception @@ -1074,15 +1143,15 @@ DEFINE_FUNCTION art_quick_to_interpreter_bridge PUSH eax // alignment padding PUSH edx // pass SP pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current() - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH eax // pass method SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artQuickToInterpreterBridge)@PLT // (method, Thread*, SP) + call PLT_SYMBOL(artQuickToInterpreterBridge) // (method, Thread*, SP) movd %eax, %xmm0 // place return value also into floating point return value movd %edx, %xmm1 punpckldq %xmm1, %xmm0 addl LITERAL(16), %esp // pop arguments - .cfi_adjust_cfa_offset -16 + CFI_ADJUST_CFA_OFFSET(-16) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME RETURN_OR_DELIVER_PENDING_EXCEPTION // return or deliver exception END_FUNCTION art_quick_to_interpreter_bridge @@ -1095,20 +1164,20 @@ DEFINE_FUNCTION art_quick_instrumentation_entry movl %esp, %edx // Save SP. PUSH eax // Save eax which will be clobbered by the callee-save method. subl LITERAL(8), %esp // Align stack. - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) pushl 40(%esp) // Pass LR. - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH edx // Pass SP. pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current(). - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) PUSH ecx // Pass receiver. PUSH eax // Pass Method*. SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artInstrumentationMethodEntryFromCode)@PLT // (Method*, Object*, Thread*, SP, LR) + call SYMBOL(artInstrumentationMethodEntryFromCode) // (Method*, Object*, Thread*, SP, LR) addl LITERAL(28), %esp // Pop arguments upto saved Method*. movl 28(%esp), %edi // Restore edi. movl %eax, 28(%esp) // Place code* over edi, just under return pc. - movl LITERAL(SYMBOL(art_quick_instrumentation_exit)@PLT), 32(%esp) + movl LITERAL(SYMBOL(art_quick_instrumentation_exit)), 32(%esp) // Place instrumentation exit as return pc. movl (%esp), %eax // Restore eax. movl 8(%esp), %ecx // Restore ecx. @@ -1125,32 +1194,32 @@ DEFINE_FUNCTION art_quick_instrumentation_exit SETUP_REF_ONLY_CALLEE_SAVE_FRAME mov %esp, %ecx // Remember SP subl LITERAL(8), %esp // Save float return value. - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) movd %xmm0, (%esp) PUSH edx // Save gpr return value. PUSH eax subl LITERAL(8), %esp // Align stack movd %xmm0, (%esp) subl LITERAL(8), %esp // Pass float return value. - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) movd %xmm0, (%esp) PUSH edx // Pass gpr return value. PUSH eax PUSH ecx // Pass SP. pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current. - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artInstrumentationMethodExitFromCode)@PLT // (Thread*, SP, gpr_result, fpr_result) + call PLT_SYMBOL(artInstrumentationMethodExitFromCode) // (Thread*, SP, gpr_result, fpr_result) mov %eax, %ecx // Move returned link register. addl LITERAL(32), %esp // Pop arguments. - .cfi_adjust_cfa_offset -32 + CFI_ADJUST_CFA_OFFSET(-32) movl %edx, %ebx // Move returned link register for deopt // (ebx is pretending to be our LR). POP eax // Restore gpr return value. POP edx movd (%esp), %xmm0 // Restore fpr return value. addl LITERAL(8), %esp - .cfi_adjust_cfa_offset -8 + CFI_ADJUST_CFA_OFFSET(-8) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME addl LITERAL(4), %esp // Remove fake return pc. jmp *%ecx // Return. @@ -1165,12 +1234,12 @@ DEFINE_FUNCTION art_quick_deoptimize SETUP_SAVE_ALL_CALLEE_SAVE_FRAME mov %esp, %ecx // Remember SP. subl LITERAL(8), %esp // Align stack. - .cfi_adjust_cfa_offset 8 + CFI_ADJUST_CFA_OFFSET(8) PUSH ecx // Pass SP. pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current(). - .cfi_adjust_cfa_offset 4 + CFI_ADJUST_CFA_OFFSET(4) SETUP_GOT_NOSAVE // clobbers EBX - call SYMBOL(artDeoptimize)@PLT // artDeoptimize(Thread*, SP) + call PLT_SYMBOL(artDeoptimize) // artDeoptimize(Thread*, SP) int3 // Unreachable. END_FUNCTION art_quick_deoptimize |