Merge "Refactor large object sweeping."
diff --git a/runtime/arch/x86/asm_support_x86.S b/runtime/arch/x86/asm_support_x86.S
index 7a3fdfa..3701b22 100644
--- a/runtime/arch/x86/asm_support_x86.S
+++ b/runtime/arch/x86/asm_support_x86.S
@@ -77,15 +77,15 @@
END_MACRO
MACRO1(PUSH, reg)
- pushl REG_VAR(reg, 0)
- .cfi_adjust_cfa_offset 4
- .cfi_rel_offset REG_VAR(reg, 0), 0
+ pushl REG_VAR(reg, 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)
+ popl REG_VAR(reg,0)
+ .cfi_adjust_cfa_offset -4
+ .cfi_restore REG_VAR(reg,0)
END_MACRO
MACRO1(UNIMPLEMENTED,name)
@@ -100,4 +100,18 @@
.size \name, .-\name
END_MACRO
+MACRO0(SETUP_GOT_NOSAVE)
+ call __x86.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+END_MACRO
+
+MACRO0(SETUP_GOT)
+ PUSH ebx
+ SETUP_GOT_NOSAVE
+END_MACRO
+
+MACRO0(UNDO_SETUP_GOT)
+ POP ebx
+END_MACRO
+
#endif // ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_
diff --git a/runtime/arch/x86/jni_entrypoints_x86.S b/runtime/arch/x86/jni_entrypoints_x86.S
index e9c88fe..e394819 100644
--- a/runtime/arch/x86/jni_entrypoints_x86.S
+++ b/runtime/arch/x86/jni_entrypoints_x86.S
@@ -20,12 +20,14 @@
* Portable resolution trampoline.
*/
DEFINE_FUNCTION art_jni_dlsym_lookup_stub
- subl LITERAL(8), %esp // align stack
- .cfi_adjust_cfa_offset 8
+ subl LITERAL(4), %esp // align stack
+ .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) // (Thread*)
- addl LITERAL(12), %esp // restore the stack
+ call SYMBOL(artFindNativeMethod)@PLT // (Thread*)
+ UNDO_SETUP_GOT
+ addl LITERAL(8), %esp // restore the stack
.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
diff --git a/runtime/arch/x86/portable_entrypoints_x86.S b/runtime/arch/x86/portable_entrypoints_x86.S
index 6ff5d90..a1f6b2d 100644
--- a/runtime/arch/x86/portable_entrypoints_x86.S
+++ b/runtime/arch/x86/portable_entrypoints_x86.S
@@ -37,11 +37,12 @@
andl LITERAL(0xFFFFFFF0), %ebx // align frame size to 16 bytes
subl LITERAL(12), %ebx // remove space for return address, ebx, and ebp
subl %ebx, %esp // reserve stack space for argument array
+ SETUP_GOT_NOSAVE // reset ebx to GOT table
lea 4(%esp), %eax // use stack pointer + method ptr as dest for memcpy
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) // (void*, const void*, size_t)
+ call SYMBOL(memcpy)@PLT // (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 +70,8 @@
PUSH ebp // Set up frame.
movl %esp, %ebp
.cfi_def_cfa_register %ebp
- subl LITERAL(8), %esp // Align stack
+ subl LITERAL(4), %esp // Align stack
+ SETUP_GOT // pushes ebx
leal 8(%ebp), %edx // %edx = ArtMethod** called_addr
movl 12(%ebp), %ecx // %ecx = receiver
movl 0(%edx), %eax // %eax = ArtMethod* called
@@ -77,7 +79,8 @@
pushl %fs:THREAD_SELF_OFFSET // Pass thread.
pushl %ecx // Pass receiver.
pushl %eax // Pass called.
- call SYMBOL(artPortableProxyInvokeHandler) // (called, receiver, Thread*, &called)
+ call SYMBOL(artPortableProxyInvokeHandler)@PLT // (called, receiver, Thread*, &called)
+ UNDO_SETUP_GOT
leave
.cfi_restore %ebp
.cfi_def_cfa %esp, 4
@@ -91,7 +94,8 @@
PUSH ebp // Set up frame.
movl %esp, %ebp
.cfi_def_cfa_register %ebp
- subl LITERAL(8), %esp // Align stack
+ subl LITERAL(4), %esp // Align stack
+ SETUP_GOT // pushes ebx
leal 8(%ebp), %edx // %edx = ArtMethod** called_addr
movl 12(%ebp), %ecx // %ecx = receiver
movl 0(%edx), %eax // %eax = ArtMethod* called
@@ -99,7 +103,8 @@
pushl %fs:THREAD_SELF_OFFSET // Pass thread.
pushl %ecx // Pass receiver.
pushl %eax // Pass called.
- call SYMBOL(artPortableResolutionTrampoline) // (called, receiver, Thread*, &called)
+ call SYMBOL(artPortableResolutionTrampoline)@PLT // (called, receiver, Thread*, &called)
+ UNDO_SETUP_GOT
leave
.cfi_restore %ebp
.cfi_def_cfa %esp, 4
@@ -114,13 +119,15 @@
PUSH ebp // Set up frame.
movl %esp, %ebp
.cfi_def_cfa_register %ebp
- subl LITERAL(12), %esp // Align stack
+ subl LITERAL(8), %esp // Align stack
+ SETUP_GOT
leal 8(%ebp), %edx // %edx = ArtMethod** called_addr
movl 0(%edx), %eax // %eax = ArtMethod* called
pushl %edx // Pass called_addr.
pushl %fs:THREAD_SELF_OFFSET // Pass thread.
pushl %eax // Pass called.
- call SYMBOL(artPortableToInterpreterBridge) // (called, Thread*, &called)
+ call SYMBOL(artPortableToInterpreterBridge)@PLT // (called, Thread*, &called)
+ UNDO_SETUP_GOT
leave
.cfi_restore %ebp
.cfi_def_cfa %esp, 4
diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S
index 4687ecc..69738ba 100644
--- a/runtime/arch/x86/quick_entrypoints_x86.S
+++ b/runtime/arch/x86/quick_entrypoints_x86.S
@@ -90,7 +90,8 @@
PUSH ecx // pass SP
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
- call SYMBOL(artDeliverPendingExceptionFromCode) // artDeliverPendingExceptionFromCode(Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers ebx (harmless here)
+ call SYMBOL(artDeliverPendingExceptionFromCode)@PLT // artDeliverPendingExceptionFromCode(Thread*, SP)
int3 // unreached
END_MACRO
@@ -104,7 +105,8 @@
PUSH ecx // pass SP
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
- call VAR(cxx_name, 1) // cxx_name(Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers ebx (harmless here)
+ call VAR(cxx_name, 1)@PLT // cxx_name(Thread*, SP)
int3 // unreached
END_FUNCTION VAR(c_name, 0)
END_MACRO
@@ -119,7 +121,8 @@
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
PUSH eax // pass arg1
- call VAR(cxx_name, 1) // cxx_name(arg1, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers ebx (harmless here)
+ call VAR(cxx_name, 1)@PLT // cxx_name(arg1, Thread*, SP)
int3 // unreached
END_FUNCTION VAR(c_name, 0)
END_MACRO
@@ -134,7 +137,8 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass arg2
PUSH eax // pass arg1
- call VAR(cxx_name, 1) // cxx_name(arg1, arg2, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers ebx (harmless here)
+ call VAR(cxx_name, 1)@PLT // cxx_name(arg1, arg2, Thread*, SP)
int3 // unreached
END_FUNCTION VAR(c_name, 0)
END_MACRO
@@ -200,6 +204,7 @@
PUSH eax // <-- callee save Method* to go here
movl %esp, %edx // remember SP
// Outgoing argument set up
+ SETUP_GOT_NOSAVE
subl MACRO_LITERAL(12), %esp // alignment padding
.cfi_adjust_cfa_offset 12
PUSH edx // pass SP
@@ -209,7 +214,7 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass arg2
PUSH eax // pass arg1
- call VAR(cxx_name, 1) // cxx_name(arg1, arg2, arg3, Thread*, SP)
+ call VAR(cxx_name, 1)@PLT // 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
@@ -260,11 +265,12 @@
andl LITERAL(0xFFFFFFF0), %ebx // align frame size to 16 bytes
subl LITERAL(12), %ebx // remove space for return address, ebx, and ebp
subl %ebx, %esp // reserve stack space for argument array
+ SETUP_GOT_NOSAVE // clobbers ebx (harmless here)
lea 4(%esp), %eax // use stack pointer + method ptr as dest for memcpy
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) // (void*, const void*, size_t)
+ call SYMBOL(memcpy)@PLT // (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
@@ -294,13 +300,14 @@
DEFINE_FUNCTION VAR(c_name, 0)
SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC
mov %esp, %edx // remember SP
+ SETUP_GOT_NOSAVE // clobbers ebx (harmless here)
// Outgoing argument set up
subl MACRO_LITERAL(8), %esp // push padding
.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) // cxx_name(Thread*, SP)
+ call VAR(cxx_name, 1)@PLT // cxx_name(Thread*, SP)
addl MACRO_LITERAL(16), %esp // pop arguments
.cfi_adjust_cfa_offset -16
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -312,13 +319,14 @@
DEFINE_FUNCTION VAR(c_name, 0)
SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC
mov %esp, %edx // remember SP
+ SETUP_GOT_NOSAVE // clobbers EBX
// Outgoing argument set up
PUSH eax // push padding
PUSH edx // pass SP
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
PUSH eax // pass arg1
- call VAR(cxx_name, 1) // cxx_name(arg1, Thread*, SP)
+ call VAR(cxx_name, 1)@PLT // cxx_name(arg1, Thread*, SP)
addl MACRO_LITERAL(16), %esp // pop arguments
.cfi_adjust_cfa_offset -16
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -330,13 +338,14 @@
DEFINE_FUNCTION VAR(c_name, 0)
SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC
mov %esp, %edx // remember SP
+ SETUP_GOT_NOSAVE // clobbers EBX
// Outgoing argument set up
PUSH edx // pass SP
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
PUSH ecx // pass arg2
PUSH eax // pass arg1
- call VAR(cxx_name, 1) // cxx_name(arg1, arg2, Thread*, SP)
+ call VAR(cxx_name, 1)@PLT // cxx_name(arg1, arg2, Thread*, SP)
addl MACRO_LITERAL(16), %esp // pop arguments
.cfi_adjust_cfa_offset -16
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -357,7 +366,8 @@
PUSH edx // pass arg3
PUSH ecx // pass arg2
PUSH eax // pass arg1
- call VAR(cxx_name, 1) // cxx_name(arg1, arg2, arg3, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call VAR(cxx_name, 1)@PLT // cxx_name(arg1, arg2, arg3, Thread*, SP)
addl MACRO_LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -430,13 +440,14 @@
slow_lock:
SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC
mov %esp, %edx // remember SP
+ SETUP_GOT_NOSAVE // clobbers EBX
// Outgoing argument set up
PUSH eax // push padding
PUSH edx // pass SP
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
PUSH eax // pass object
- call artLockObjectFromCode // artLockObjectFromCode(object, Thread*, SP)
+ call artLockObjectFromCode@PLT // artLockObjectFromCode(object, Thread*, SP)
addl MACRO_LITERAL(16), %esp // pop arguments
.cfi_adjust_cfa_offset -16
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -463,13 +474,14 @@
slow_unlock:
SETUP_REF_ONLY_CALLEE_SAVE_FRAME // save ref containing registers for GC
mov %esp, %edx // remember SP
+ SETUP_GOT_NOSAVE // clobbers EBX
// Outgoing argument set up
PUSH eax // push padding
PUSH edx // pass SP
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
PUSH eax // pass object
- call artUnlockObjectFromCode // artUnlockObjectFromCode(object, Thread*, SP)
+ call artUnlockObjectFromCode@PLT // artUnlockObjectFromCode(object, Thread*, SP)
addl MACRO_LITERAL(16), %esp // pop arguments
.cfi_adjust_cfa_offset -16
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -477,20 +489,22 @@
END_FUNCTION art_quick_unlock_object
DEFINE_FUNCTION art_quick_is_assignable
+ SETUP_GOT_NOSAVE // clobbers EBX
PUSH eax // alignment padding
PUSH ecx // pass arg2 - obj->klass
PUSH eax // pass arg1 - checked class
- call SYMBOL(artIsAssignableFromCode) // (Class* klass, Class* ref_klass)
+ call SYMBOL(artIsAssignableFromCode)@PLT // (Class* klass, Class* ref_klass)
addl LITERAL(12), %esp // pop arguments
.cfi_adjust_cfa_offset -12
ret
END_FUNCTION art_quick_is_assignable
DEFINE_FUNCTION art_quick_check_cast
+ SETUP_GOT_NOSAVE // clobbers EBX
PUSH eax // alignment padding
PUSH ecx // pass arg2 - obj->klass
PUSH eax // pass arg1 - checked class
- call SYMBOL(artIsAssignableFromCode) // (Class* klass, Class* ref_klass)
+ call SYMBOL(artIsAssignableFromCode)@PLT // (Class* klass, Class* ref_klass)
testl %eax, %eax
jz 1f // jump forward if not assignable
addl LITERAL(12), %esp // pop arguments
@@ -509,7 +523,7 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass arg2
PUSH eax // pass arg1
- call SYMBOL(artThrowClassCastException) // (Class* a, Class* b, Thread*, SP)
+ call SYMBOL(artThrowClassCastException)@PLT // (Class* a, Class* b, Thread*, SP)
int3 // unreached
END_FUNCTION art_quick_check_cast
@@ -558,7 +572,8 @@
pushl CLASS_OFFSET(%edx) // pass arg2 - type of the value to be stored
.cfi_adjust_cfa_offset 4
PUSH ebx // pass arg1 - component type of the array
- call SYMBOL(artIsAssignableFromCode) // (Class* a, Class* b)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artIsAssignableFromCode)@PLT // (Class* a, Class* b)
addl LITERAL(16), %esp // pop arguments
.cfi_adjust_cfa_offset -16
testl %eax, %eax
@@ -583,15 +598,16 @@
.cfi_adjust_cfa_offset 4
PUSH edx // pass arg2 - value
PUSH eax // pass arg1 - array
- call SYMBOL(artThrowArrayStoreException) // (array, value, Thread*, SP)
+ call SYMBOL(artThrowArrayStoreException)@PLT // (array, value, Thread*, SP)
int3 // unreached
END_FUNCTION art_quick_aput_obj
DEFINE_FUNCTION art_quick_memcpy
+ SETUP_GOT_NOSAVE // clobbers EBX
PUSH edx // pass arg3
PUSH ecx // pass arg2
PUSH eax // pass arg1
- call SYMBOL(memcpy) // (void*, const void*, size_t)
+ call SYMBOL(memcpy)@PLT // (void*, const void*, size_t)
addl LITERAL(12), %esp // pop arguments
.cfi_adjust_cfa_offset -12
ret
@@ -606,7 +622,8 @@
PUSH edx // pass arg3 b.lo
PUSH ecx // pass arg2 a.hi
PUSH eax // pass arg1 a.lo
- call SYMBOL(fmod) // (jdouble a, jdouble b)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(fmod)@PLT // (jdouble a, jdouble b)
fstpl (%esp) // pop return value off fp stack
movsd (%esp), %xmm0 // place into %xmm0
addl LITERAL(28), %esp // pop arguments
@@ -618,7 +635,8 @@
PUSH eax // alignment padding
PUSH ecx // pass arg2 b
PUSH eax // pass arg1 a
- call SYMBOL(fmodf) // (jfloat a, jfloat b)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(fmodf)@PLT // (jfloat a, jfloat b)
fstps (%esp) // pop return value off fp stack
movss (%esp), %xmm0 // place into %xmm0
addl LITERAL(12), %esp // pop arguments
@@ -652,7 +670,8 @@
PUSH eax // alignment padding
PUSH ecx // pass arg2 a.hi
PUSH eax // pass arg1 a.lo
- call SYMBOL(art_d2l) // (jdouble a)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(art_d2l)@PLT // (jdouble a)
addl LITERAL(12), %esp // pop arguments
.cfi_adjust_cfa_offset -12
ret
@@ -661,8 +680,9 @@
DEFINE_FUNCTION art_quick_f2l
subl LITERAL(8), %esp // alignment padding
.cfi_adjust_cfa_offset 8
+ SETUP_GOT_NOSAVE // clobbers EBX
PUSH eax // pass arg1 a
- call SYMBOL(art_f2l) // (jfloat a)
+ call SYMBOL(art_f2l)@PLT // (jfloat a)
addl LITERAL(12), %esp // pop arguments
.cfi_adjust_cfa_offset -12
ret
@@ -689,7 +709,8 @@
PUSH edx // pass arg3 b.lo
PUSH ecx // pass arg2 a.hi
PUSH eax // pass arg1 a.lo
- call SYMBOL(artLdiv) // (jlong a, jlong b)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artLdiv)@PLT // (jlong a, jlong b)
addl LITERAL(28), %esp // pop arguments
.cfi_adjust_cfa_offset -28
ret
@@ -702,7 +723,8 @@
PUSH edx // pass arg3 b.lo
PUSH ecx // pass arg2 a.hi
PUSH eax // pass arg1 a.lo
- call SYMBOL(artLmod) // (jlong a, jlong b)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artLmod)@PLT // (jlong a, jlong b)
addl LITERAL(28), %esp // pop arguments
.cfi_adjust_cfa_offset -28
ret
@@ -769,7 +791,8 @@
PUSH edx // pass new_val
PUSH ecx // pass object
PUSH eax // pass field_idx
- call SYMBOL(artSet32InstanceFromCode) // (field_idx, Object*, new_val, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artSet32InstanceFromCode)@PLT // (field_idx, Object*, new_val, referrer, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -788,7 +811,8 @@
PUSH edx // pass low half of new_val
PUSH ecx // pass object
PUSH eax // pass field_idx
- call SYMBOL(artSet64InstanceFromCode) // (field_idx, Object*, new_val, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artSet64InstanceFromCode)@PLT // (field_idx, Object*, new_val, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -808,7 +832,8 @@
PUSH edx // pass new_val
PUSH ecx // pass object
PUSH eax // pass field_idx
- call SYMBOL(artSetObjInstanceFromCode) // (field_idx, Object*, new_val, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artSetObjInstanceFromCode)@PLT // (field_idx, Object*, new_val, referrer, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -827,7 +852,8 @@
PUSH edx // pass referrer
PUSH ecx // pass object
PUSH eax // pass field_idx
- call SYMBOL(artGet32InstanceFromCode) // (field_idx, Object*, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artGet32InstanceFromCode)@PLT // (field_idx, Object*, referrer, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -846,7 +872,8 @@
PUSH edx // pass referrer
PUSH ecx // pass object
PUSH eax // pass field_idx
- call SYMBOL(artGet64InstanceFromCode) // (field_idx, Object*, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artGet64InstanceFromCode)@PLT // (field_idx, Object*, referrer, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -865,7 +892,8 @@
PUSH edx // pass referrer
PUSH ecx // pass object
PUSH eax // pass field_idx
- call SYMBOL(artGetObjInstanceFromCode) // (field_idx, Object*, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artGetObjInstanceFromCode)@PLT // (field_idx, Object*, referrer, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -884,7 +912,8 @@
PUSH edx // pass referrer
PUSH ecx // pass new_val
PUSH eax // pass field_idx
- call SYMBOL(artSet32StaticFromCode) // (field_idx, new_val, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artSet32StaticFromCode)@PLT // (field_idx, new_val, referrer, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -904,7 +933,8 @@
PUSH ecx // pass low half of new_val
PUSH ebx // pass referrer
PUSH eax // pass field_idx
- call SYMBOL(artSet64StaticFromCode) // (field_idx, referrer, new_val, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artSet64StaticFromCode)@PLT // (field_idx, referrer, new_val, Thread*, SP)
addl LITERAL(32), %esp // pop arguments
.cfi_adjust_cfa_offset -32
RESTORE_REF_ONLY_CALLEE_SAVE_FRAME // restore frame up to return address
@@ -923,7 +953,8 @@
PUSH edx // pass referrer
PUSH ecx // pass new_val
PUSH eax // pass field_idx
- call SYMBOL(artSetObjStaticFromCode) // (field_idx, new_val, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artSetObjStaticFromCode)@PLT // (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
@@ -938,7 +969,8 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass referrer
PUSH eax // pass field_idx
- call SYMBOL(artGet32StaticFromCode) // (field_idx, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artGet32StaticFromCode)@PLT // (field_idx, referrer, 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
@@ -954,7 +986,8 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass referrer
PUSH eax // pass field_idx
- call SYMBOL(artGet64StaticFromCode) // (field_idx, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artGet64StaticFromCode)@PLT // (field_idx, referrer, 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
@@ -970,7 +1003,8 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass referrer
PUSH eax // pass field_idx
- call SYMBOL(artGetObjStaticFromCode) // (field_idx, referrer, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artGetObjStaticFromCode)@PLT // (field_idx, referrer, 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
@@ -984,7 +1018,8 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass receiver
PUSH eax // pass proxy method
- call SYMBOL(artQuickProxyInvokeHandler) // (proxy method, receiver, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artQuickProxyInvokeHandler)@PLT // (proxy method, receiver, Thread*, SP)
movd %eax, %xmm0 // place return value also into floating point return value
movd %edx, %xmm1
punpckldq %xmm1, %xmm0
@@ -1014,7 +1049,8 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // pass receiver
PUSH eax // pass method
- call SYMBOL(artQuickResolutionTrampoline) // (Method* called, receiver, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artQuickResolutionTrampoline)@PLT // (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
@@ -1040,7 +1076,8 @@
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
.cfi_adjust_cfa_offset 4
PUSH eax // pass method
- call SYMBOL(artQuickToInterpreterBridge) // (method, Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artQuickToInterpreterBridge)@PLT // (method, Thread*, SP)
movd %eax, %xmm0 // place return value also into floating point return value
movd %edx, %xmm1
punpckldq %xmm1, %xmm0
@@ -1066,11 +1103,12 @@
.cfi_adjust_cfa_offset 4
PUSH ecx // Pass receiver.
PUSH eax // Pass Method*.
- call SYMBOL(artInstrumentationMethodEntryFromCode) // (Method*, Object*, Thread*, SP, LR)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artInstrumentationMethodEntryFromCode)@PLT // (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)), 32(%esp)
+ movl LITERAL(SYMBOL(art_quick_instrumentation_exit)@PLT), 32(%esp)
// Place instrumentation exit as return pc.
movl (%esp), %eax // Restore eax.
movl 8(%esp), %ecx // Restore ecx.
@@ -1101,7 +1139,8 @@
PUSH ecx // Pass SP.
pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current.
.cfi_adjust_cfa_offset 4
- call SYMBOL(artInstrumentationMethodExitFromCode) // (Thread*, SP, gpr_result, fpr_result)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artInstrumentationMethodExitFromCode)@PLT // (Thread*, SP, gpr_result, fpr_result)
mov %eax, %ecx // Move returned link register.
addl LITERAL(32), %esp // Pop arguments.
.cfi_adjust_cfa_offset -32
@@ -1130,7 +1169,8 @@
PUSH ecx // Pass SP.
pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current().
.cfi_adjust_cfa_offset 4
- call SYMBOL(artDeoptimize) // artDeoptimize(Thread*, SP)
+ SETUP_GOT_NOSAVE // clobbers EBX
+ call SYMBOL(artDeoptimize)@PLT // artDeoptimize(Thread*, SP)
int3 // Unreachable.
END_FUNCTION art_quick_deoptimize