x86: Don't use the GOT to access art::Runtime::instance_.
And also get the address of art_quick_instrumentation_exit
without going through GOT.
Because ART is built with -fvisibility=protected, the
location of these symbols can be statically resolved by the
linker, so there is no need to go via the GOT.
Also rewrite macros to avoid the __x86.get_pc_thunk.bx and
use a local `call +0` instead.
Test: m test-art-host-gtest
Test: testrunner.py --host --32 --optimizing --interpreter
Bug: 112676029
Change-Id: Ib63aa71518ab7c015626a99a0bbfc587032f4a76
diff --git a/runtime/Android.bp b/runtime/Android.bp
index b64b3f4..9e95f12 100644
--- a/runtime/Android.bp
+++ b/runtime/Android.bp
@@ -326,7 +326,6 @@
"interpreter/mterp/mterp.cc",
"interpreter/mterp/nterp_stub.cc",
":libart_mterp.x86",
- "arch/x86/__x86.get_pc_thunk.S",
"arch/x86/context_x86.cc",
"arch/x86/entrypoints_init_x86.cc",
"arch/x86/jni_entrypoints_x86.S",
diff --git a/runtime/arch/x86/__x86.get_pc_thunk.S b/runtime/arch/x86/__x86.get_pc_thunk.S
deleted file mode 100644
index 9dda2bf..0000000
--- a/runtime/arch/x86/__x86.get_pc_thunk.S
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Typically GCC outputs functions like these into any object file that needs a PIC base register,
-// and one of the copies for each register is used. Clang doesn't use these functions, but
-// SETUP_GOT_NOSAVE in asm_support_x86.S calls this one.
-
- .section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
- .globl __x86.get_pc_thunk.bx
- .hidden __x86.get_pc_thunk.bx
- .p2align 4
- .type __x86.get_pc_thunk.bx,@function
-__x86.get_pc_thunk.bx:
- .cfi_startproc
- movl (%esp), %ebx
- ret
- .cfi_endproc
diff --git a/runtime/arch/x86/asm_support_x86.S b/runtime/arch/x86/asm_support_x86.S
index 370eea1..72e8b0b 100644
--- a/runtime/arch/x86/asm_support_x86.S
+++ b/runtime/arch/x86/asm_support_x86.S
@@ -221,22 +221,26 @@
SIZE(\name)
END_MACRO
-MACRO1(SETUP_GOT_NOSAVE, got_reg)
-#ifndef __APPLE__
- .ifc VAR(got_reg), ebx
- call __x86.get_pc_thunk.bx
- addl $_GLOBAL_OFFSET_TABLE_, %ebx
- .else
- .error "Unknown GOT register \got_reg"
- .endif
-#endif
+MACRO3(SETUP_PC_REL_BASE_IMPL, reg, label, call_label)
+ call RAW_VAR(call_label)
+ CFI_ADJUST_CFA_OFFSET(4)
+RAW_VAR(label):
+ popl REG_VAR(reg)
+ CFI_ADJUST_CFA_OFFSET(-4)
END_MACRO
-MACRO2(LOAD_RUNTIME_INSTANCE, reg, got_reg)
- SETUP_GOT_NOSAVE \got_reg
- // Load Runtime::instance_ from GOT.
- movl SYMBOL(_ZN3art7Runtime9instance_E)@GOT(REG_VAR(got_reg)), REG_VAR(reg)
- movl (REG_VAR(reg)), REG_VAR(reg)
+MACRO1(SETUP_PC_REL_BASE_0, reg)
+ SETUP_PC_REL_BASE_IMPL \reg, 0, 0f
+END_MACRO
+
+MACRO2(SETUP_PC_REL_BASE, reg, label)
+ SETUP_PC_REL_BASE_IMPL \reg, \label, \label
+END_MACRO
+
+MACRO1(LOAD_RUNTIME_INSTANCE, reg)
+ SETUP_PC_REL_BASE_0 \reg
+ // Load Runtime::instance_.
+ movl SYMBOL(_ZN3art7Runtime9instance_E) - 0b(REG_VAR(reg)), REG_VAR(reg)
END_MACRO
// Macros to poison (negate) the reference for heap poisoning.
diff --git a/runtime/arch/x86/jni_entrypoints_x86.S b/runtime/arch/x86/jni_entrypoints_x86.S
index a1a371c..26f3a38 100644
--- a/runtime/arch/x86/jni_entrypoints_x86.S
+++ b/runtime/arch/x86/jni_entrypoints_x86.S
@@ -108,8 +108,8 @@
movl %edx, FRAME_SIZE_SAVE_REFS_AND_ARGS - __SIZEOF_POINTER__(%eax)
// Replace the target method with the SaveRefsAndArgs runtime method.
- LOAD_RUNTIME_INSTANCE ecx, ebx
- movl RUNTIME_SAVE_REFS_AND_ARGS_METHOD_OFFSET(%ecx), %ebx
+ LOAD_RUNTIME_INSTANCE ebx
+ movl RUNTIME_SAVE_REFS_AND_ARGS_METHOD_OFFSET(%ebx), %ebx
movl %eax, %ecx // Prepare untagged managed SP for the runtime method.
diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S
index 2bf92bb..00f7154 100644
--- a/runtime/arch/x86/quick_entrypoints_x86.S
+++ b/runtime/arch/x86/quick_entrypoints_x86.S
@@ -25,13 +25,13 @@
* Macro that sets up the callee save frame to conform with
* Runtime::CreateCalleeSaveMethod(kSaveAllCalleeSaves)
*/
-MACRO2(SETUP_SAVE_ALL_CALLEE_SAVES_FRAME, got_reg, temp_reg)
+MACRO1(SETUP_SAVE_ALL_CALLEE_SAVES_FRAME, temp_reg)
PUSH edi // Save callee saves (ebx is saved/restored by the upcall)
PUSH esi
PUSH ebp
subl MACRO_LITERAL(12), %esp // Grow stack by 3 words.
CFI_ADJUST_CFA_OFFSET(12)
- LOAD_RUNTIME_INSTANCE \temp_reg, \got_reg
+ LOAD_RUNTIME_INSTANCE \temp_reg
// Push save all callee-save method.
pushl RUNTIME_SAVE_ALL_CALLEE_SAVES_METHOD_OFFSET(REG_VAR(temp_reg))
CFI_ADJUST_CFA_OFFSET(4)
@@ -48,13 +48,13 @@
* Macro that sets up the callee save frame to conform with
* Runtime::CreateCalleeSaveMethod(kSaveRefsOnly)
*/
-MACRO2(SETUP_SAVE_REFS_ONLY_FRAME, got_reg, temp_reg)
+MACRO1(SETUP_SAVE_REFS_ONLY_FRAME, temp_reg)
PUSH edi // Save callee saves (ebx is saved/restored by the upcall)
PUSH esi
PUSH ebp
subl MACRO_LITERAL(12), %esp // Grow stack by 3 words.
CFI_ADJUST_CFA_OFFSET(12)
- LOAD_RUNTIME_INSTANCE \temp_reg, \got_reg
+ LOAD_RUNTIME_INSTANCE \temp_reg
// Push save all callee-save method.
pushl RUNTIME_SAVE_REFS_ONLY_METHOD_OFFSET(REG_VAR(temp_reg))
CFI_ADJUST_CFA_OFFSET(4)
@@ -71,25 +71,25 @@
/*
* Macro that sets up the callee save frame to conform with
* Runtime::CreateCalleeSaveMethod(kSaveRefsOnly)
- * and preserves the value of got_reg at entry.
+ * and preserves the value of temp_reg at entry.
*/
-MACRO2(SETUP_SAVE_REFS_ONLY_FRAME_PRESERVE_GOT_REG, got_reg, temp_reg)
+MACRO1(SETUP_SAVE_REFS_ONLY_FRAME_PRESERVE_TEMP_REG, temp_reg)
PUSH edi // Save callee saves (ebx is saved/restored by the upcall)
PUSH esi
PUSH ebp
- PUSH RAW_VAR(got_reg) // Save got_reg
+ PUSH RAW_VAR(temp_reg) // Save temp_reg
subl MACRO_LITERAL(8), %esp // Grow stack by 2 words.
CFI_ADJUST_CFA_OFFSET(8)
- LOAD_RUNTIME_INSTANCE \temp_reg, \got_reg
+ LOAD_RUNTIME_INSTANCE \temp_reg
// Push save all callee-save method.
pushl RUNTIME_SAVE_REFS_ONLY_METHOD_OFFSET(REG_VAR(temp_reg))
CFI_ADJUST_CFA_OFFSET(4)
// Store esp as the top quick frame.
movl %esp, %fs:THREAD_TOP_QUICK_FRAME_OFFSET
- // Restore got_reg.
- movl 12(%esp), REG_VAR(got_reg)
- CFI_RESTORE(RAW_VAR(got_reg))
+ // Restore temp_reg.
+ movl 12(%esp), REG_VAR(temp_reg)
+ CFI_RESTORE(RAW_VAR(temp_reg))
// Ugly compile-time check, but we only have the preprocessor.
// Last +4: implicit return address pushed on stack when caller made call.
@@ -110,10 +110,10 @@
* Macro that sets up the callee save frame to conform with
* Runtime::CreateCalleeSaveMethod(kSaveRefsAndArgs)
*/
-MACRO2(SETUP_SAVE_REFS_AND_ARGS_FRAME, got_reg, temp_reg)
+MACRO1(SETUP_SAVE_REFS_AND_ARGS_FRAME, temp_reg)
SETUP_SAVE_REFS_AND_ARGS_FRAME_REGISTERS_ONLY
- LOAD_RUNTIME_INSTANCE \temp_reg, \got_reg
+ LOAD_RUNTIME_INSTANCE \temp_reg
// Push save all callee-save method.
pushl RUNTIME_SAVE_REFS_AND_ARGS_METHOD_OFFSET(REG_VAR(temp_reg))
CFI_ADJUST_CFA_OFFSET(4)
@@ -163,7 +163,7 @@
* Runtime::CreateCalleeSaveMethod(kSaveEverything)
* when EDI and ESI are already saved.
*/
-MACRO3(SETUP_SAVE_EVERYTHING_FRAME_EDI_ESI_SAVED, got_reg, temp_reg, runtime_method_offset = RUNTIME_SAVE_EVERYTHING_METHOD_OFFSET)
+MACRO2(SETUP_SAVE_EVERYTHING_FRAME_EDI_ESI_SAVED, temp_reg, runtime_method_offset = RUNTIME_SAVE_EVERYTHING_METHOD_OFFSET)
// Save core registers from highest to lowest to agree with core spills bitmap.
// EDI and ESI, or at least placeholders for them, are already on the stack.
PUSH ebp
@@ -184,7 +184,7 @@
movsd %xmm6, 60(%esp)
movsd %xmm7, 68(%esp)
- LOAD_RUNTIME_INSTANCE \temp_reg, \got_reg
+ LOAD_RUNTIME_INSTANCE \temp_reg
// Push save everything callee-save method.
pushl \runtime_method_offset(REG_VAR(temp_reg))
CFI_ADJUST_CFA_OFFSET(4)
@@ -203,20 +203,20 @@
* Runtime::CreateCalleeSaveMethod(kSaveEverything)
* when EDI is already saved.
*/
-MACRO3(SETUP_SAVE_EVERYTHING_FRAME_EDI_SAVED, got_reg, temp_reg, runtime_method_offset = RUNTIME_SAVE_EVERYTHING_METHOD_OFFSET)
+MACRO2(SETUP_SAVE_EVERYTHING_FRAME_EDI_SAVED, temp_reg, runtime_method_offset = RUNTIME_SAVE_EVERYTHING_METHOD_OFFSET)
// Save core registers from highest to lowest to agree with core spills bitmap.
// EDI, or at least a placeholder for it, is already on the stack.
PUSH esi
- SETUP_SAVE_EVERYTHING_FRAME_EDI_ESI_SAVED RAW_VAR(got_reg), RAW_VAR(temp_reg), \runtime_method_offset
+ SETUP_SAVE_EVERYTHING_FRAME_EDI_ESI_SAVED RAW_VAR(temp_reg), \runtime_method_offset
END_MACRO
/*
* Macro that sets up the callee save frame to conform with
* Runtime::CreateCalleeSaveMethod(kSaveEverything)
*/
-MACRO3(SETUP_SAVE_EVERYTHING_FRAME, got_reg, temp_reg, runtime_method_offset = RUNTIME_SAVE_EVERYTHING_METHOD_OFFSET)
+MACRO2(SETUP_SAVE_EVERYTHING_FRAME, temp_reg, runtime_method_offset = RUNTIME_SAVE_EVERYTHING_METHOD_OFFSET)
PUSH edi
- SETUP_SAVE_EVERYTHING_FRAME_EDI_SAVED RAW_VAR(got_reg), RAW_VAR(temp_reg), \runtime_method_offset
+ SETUP_SAVE_EVERYTHING_FRAME_EDI_SAVED RAW_VAR(temp_reg), \runtime_method_offset
END_MACRO
MACRO0(RESTORE_SAVE_EVERYTHING_FRAME_FRPS)
@@ -267,13 +267,13 @@
* exception is Thread::Current()->exception_.
*/
MACRO0(DELIVER_PENDING_EXCEPTION)
- SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx, ebx // save callee saves for throw
+ SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx // save callee saves for throw
DELIVER_PENDING_EXCEPTION_FRAME_READY
END_MACRO
MACRO2(NO_ARG_RUNTIME_EXCEPTION, c_name, cxx_name)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx, ebx // save all registers as basis for long jump context
+ SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx // save all registers as basis for long jump context
// Outgoing argument set up
subl MACRO_LITERAL(12), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(12)
@@ -286,7 +286,7 @@
MACRO2(NO_ARG_RUNTIME_EXCEPTION_SAVE_EVERYTHING, c_name, cxx_name)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx // save all registers as basis for long jump context
+ SETUP_SAVE_EVERYTHING_FRAME ebx // save all registers as basis for long jump context
// Outgoing argument set up
subl MACRO_LITERAL(12), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(12)
@@ -299,7 +299,7 @@
MACRO2(ONE_ARG_RUNTIME_EXCEPTION, c_name, cxx_name)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx, ebx // save all registers as basis for long jump context
+ SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx // save all registers as basis for long jump context
// Outgoing argument set up
subl MACRO_LITERAL(8), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -313,7 +313,7 @@
MACRO2(TWO_ARG_RUNTIME_EXCEPTION_SAVE_EVERYTHING, c_name, cxx_name)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx // save all registers as basis for long jump context
+ SETUP_SAVE_EVERYTHING_FRAME ebx // save all registers as basis for long jump context
// Outgoing argument set up
PUSH eax // alignment padding
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -336,7 +336,7 @@
DEFINE_FUNCTION_CUSTOM_CFA art_quick_throw_null_pointer_exception_from_signal, 2 * __SIZEOF_POINTER__
// Fault address and return address were saved by the fault handler.
// Save all registers as basis for long jump context; EDI will replace fault address later.
- SETUP_SAVE_EVERYTHING_FRAME_EDI_SAVED ebx, ebx
+ SETUP_SAVE_EVERYTHING_FRAME_EDI_SAVED ebx
// Retrieve fault address and save EDI.
movl (FRAME_SIZE_SAVE_EVERYTHING - 2 * __SIZEOF_POINTER__)(%esp), %eax
movl %edi, (FRAME_SIZE_SAVE_EVERYTHING - 2 * __SIZEOF_POINTER__)(%esp)
@@ -395,7 +395,7 @@
* pointing back to the original caller.
*/
MACRO1(INVOKE_TRAMPOLINE_BODY, cxx_name)
- SETUP_SAVE_REFS_AND_ARGS_FRAME ebx, ebx
+ SETUP_SAVE_REFS_AND_ARGS_FRAME ebx
movl %esp, %edx // remember SP
// Outgoing argument set up
@@ -721,7 +721,7 @@
MACRO3(ONE_ARG_DOWNCALL, c_name, cxx_name, return_macro)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl MACRO_LITERAL(8), %esp // push padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -738,7 +738,7 @@
MACRO3(TWO_ARG_DOWNCALL, c_name, cxx_name, return_macro)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
PUSH eax // push padding
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -755,7 +755,7 @@
MACRO3(THREE_ARG_DOWNCALL, c_name, cxx_name, return_macro)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
CFI_ADJUST_CFA_OFFSET(4)
@@ -772,7 +772,7 @@
MACRO3(FOUR_ARG_DOWNCALL, c_name, cxx_name, return_macro)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_REFS_ONLY_FRAME_PRESERVE_GOT_REG ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME_PRESERVE_TEMP_REG ebx // save ref containing registers for GC
// Outgoing argument set up
subl MACRO_LITERAL(12), %esp // alignment padding
@@ -793,7 +793,7 @@
MACRO3(ONE_ARG_REF_DOWNCALL, c_name, cxx_name, return_macro)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl MACRO_LITERAL(8), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -810,7 +810,7 @@
MACRO3(TWO_ARG_REF_DOWNCALL, c_name, cxx_name, return_macro)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
PUSH eax // alignment padding
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -827,7 +827,7 @@
MACRO3(THREE_ARG_REF_DOWNCALL, c_name, cxx_name, return_macro)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
CFI_ADJUST_CFA_OFFSET(4)
@@ -848,7 +848,7 @@
*/
MACRO3(ONE_ARG_SAVE_EVERYTHING_DOWNCALL, c_name, cxx_name, runtime_method_offset = RUNTIME_SAVE_EVERYTHING_METHOD_OFFSET)
DEFINE_FUNCTION VAR(c_name)
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx, \runtime_method_offset // save ref containing registers for GC
+ SETUP_SAVE_EVERYTHING_FRAME ebx, \runtime_method_offset // save ref containing registers for GC
// Outgoing argument set up
subl MACRO_LITERAL(8), %esp // push padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -989,7 +989,7 @@
movl %ecx, %eax // Move object to return register
ret
.Lslow_path\c_name:
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl LITERAL(8), %esp // alignment padding
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -1035,7 +1035,7 @@
// and art_quick_alloc_object_resolved/initialized_region_tlab.
MACRO1(ALLOC_OBJECT_RESOLVED_TLAB_SLOW_PATH, cxx_name)
POP edi
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl LITERAL(8), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -1170,18 +1170,18 @@
ALLOC_ARRAY_TLAB_FAST_PATH_RESOLVED_WITH_SIZE .Lslow_path\c_entrypoint
.Lslow_path\c_entrypoint:
POP edi
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
- PUSH eax // alignment padding
- pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
+ PUSH eax // alignment padding
+ pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
CFI_ADJUST_CFA_OFFSET(4)
PUSH ecx
PUSH eax
- call CALLVAR(cxx_name) // cxx_name(arg0, arg1, Thread*)
- addl LITERAL(16), %esp // pop arguments
+ call CALLVAR(cxx_name) // cxx_name(arg0, arg1, Thread*)
+ addl LITERAL(16), %esp // pop arguments
CFI_ADJUST_CFA_OFFSET(-16)
- RESTORE_SAVE_REFS_ONLY_FRAME // restore frame up to return address
- RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER // return or deliver exception
+ RESTORE_SAVE_REFS_ONLY_FRAME // restore frame up to return address
+ RETURN_IF_RESULT_IS_NON_ZERO_OR_DELIVER // return or deliver exception
END_FUNCTION VAR(c_entrypoint)
END_MACRO
@@ -1246,7 +1246,7 @@
movl %ecx, %eax // restore eax
jmp .Lretry_lock
.Lslow_lock:
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl LITERAL(8), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -1261,7 +1261,7 @@
END_FUNCTION art_quick_lock_object
DEFINE_FUNCTION art_quick_lock_object_no_inline
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl LITERAL(8), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -1317,7 +1317,7 @@
movl %edx, %eax // restore eax
jmp .Lretry_unlock
.Lslow_unlock:
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl LITERAL(8), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -1332,7 +1332,7 @@
END_FUNCTION art_quick_unlock_object
DEFINE_FUNCTION art_quick_unlock_object_no_inline
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
subl LITERAL(8), %esp // alignment padding
CFI_ADJUST_CFA_OFFSET(8)
@@ -1379,7 +1379,7 @@
CFI_ADJUST_CFA_OFFSET(-4)
.Lthrow_class_cast_exception_for_bitstring_check:
- SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx, ebx // save all registers as basis for long jump context
+ SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx // save all registers as basis for long jump context
// Outgoing argument set up
PUSH eax // alignment padding
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -1511,7 +1511,7 @@
POP edx
POP ecx
POP eax
- SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx, ebx // save all registers as basis for long jump context
+ SETUP_SAVE_ALL_CALLEE_SAVES_FRAME ebx // save all registers as basis for long jump context
// Outgoing argument set up
PUSH eax // alignment padding
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -1523,10 +1523,13 @@
END_FUNCTION art_quick_aput_obj
DEFINE_FUNCTION art_quick_memcpy
- SETUP_GOT_NOSAVE ebx // clobbers EBX
PUSH edx // pass arg3
PUSH ecx // pass arg2
PUSH eax // pass arg1
+ // PLT call requires EBX initialized to the $_GLOBAL_OFFSET_TABLE_.
+ SETUP_PC_REL_BASE_0 ebx
+1:
+ addl $_GLOBAL_OFFSET_TABLE_ + (1b - 0b), %ebx
call PLT_SYMBOL(memcpy) // (void*, const void*, size_t)
addl LITERAL(12), %esp // pop arguments
CFI_ADJUST_CFA_OFFSET(-12)
@@ -1534,7 +1537,7 @@
END_FUNCTION art_quick_memcpy
DEFINE_FUNCTION art_quick_test_suspend
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx, RUNTIME_SAVE_EVERYTHING_FOR_SUSPEND_CHECK_METHOD_OFFSET // save everything for GC
+ SETUP_SAVE_EVERYTHING_FRAME ebx, RUNTIME_SAVE_EVERYTHING_FOR_SUSPEND_CHECK_METHOD_OFFSET // save everything for GC
// Outgoing argument set up
subl MACRO_LITERAL(12), %esp // push padding
CFI_ADJUST_CFA_OFFSET(12)
@@ -1674,7 +1677,7 @@
// Call artSet64InstanceFromCode with 4 word size arguments.
DEFINE_FUNCTION art_quick_set64_instance
movd %ebx, %xmm0
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
movd %xmm0, %ebx
// Outgoing argument set up
subl LITERAL(12), %esp // alignment padding
@@ -1748,7 +1751,7 @@
END_FUNCTION art_quick_imt_conflict_trampoline
DEFINE_FUNCTION art_quick_resolution_trampoline
- SETUP_SAVE_REFS_AND_ARGS_FRAME ebx, ebx
+ SETUP_SAVE_REFS_AND_ARGS_FRAME ebx
movl %esp, %edi
PUSH EDI // pass SP. do not just PUSH ESP; that messes up unwinding
pushl %fs:THREAD_SELF_OFFSET // pass Thread::Current()
@@ -1862,7 +1865,7 @@
END_FUNCTION art_deliver_pending_exception
DEFINE_FUNCTION art_quick_to_interpreter_bridge
- SETUP_SAVE_REFS_AND_ARGS_FRAME ebx, ebx // save frame
+ SETUP_SAVE_REFS_AND_ARGS_FRAME ebx // save frame
mov %esp, %edx // remember SP
PUSH eax // alignment padding
PUSH edx // pass SP
@@ -1897,7 +1900,7 @@
* Routine that intercepts method calls and returns.
*/
DEFINE_FUNCTION art_quick_instrumentation_entry
- SETUP_SAVE_REFS_AND_ARGS_FRAME ebx, edx
+ SETUP_SAVE_REFS_AND_ARGS_FRAME edx
PUSH eax // Save eax which will be clobbered by the callee-save method.
subl LITERAL(16), %esp // Align stack (12 bytes) and reserve space for the SP argument
CFI_ADJUST_CFA_OFFSET(16) // (4 bytes). We lack the scratch registers to calculate the SP
@@ -1918,7 +1921,8 @@
movl 60(%esp), %edi // Restore edi.
movl %eax, 60(%esp) // Place code* over edi, just under return pc.
- movl SYMBOL(art_quick_instrumentation_exit)@GOT(%ebx), %ebx
+ SETUP_PC_REL_BASE ebx, .Linstrumentation_entry_pc_rel_base
+ leal SYMBOL(art_quick_instrumentation_exit) - .Linstrumentation_entry_pc_rel_base(%ebx), %ebx
// Place instrumentation exit as return pc. ebx holds the GOT computed on entry.
movl %ebx, 64(%esp)
movl 0(%esp), %eax // Restore eax.
@@ -1948,7 +1952,7 @@
DEFINE_FUNCTION_CUSTOM_CFA art_quick_instrumentation_exit, 0
pushl LITERAL(0) // Push a fake return PC as there will be none on the stack.
CFI_ADJUST_CFA_OFFSET(4)
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx
+ SETUP_SAVE_EVERYTHING_FRAME ebx
movl %esp, %ecx // Remember SP
subl LITERAL(8), %esp // Align stack.
@@ -1992,7 +1996,7 @@
* will long jump to the upcall with a special exception of -1.
*/
DEFINE_FUNCTION art_quick_deoptimize
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx
+ SETUP_SAVE_EVERYTHING_FRAME ebx
subl LITERAL(12), %esp // Align stack.
CFI_ADJUST_CFA_OFFSET(12)
pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current().
@@ -2006,7 +2010,7 @@
* will long jump to the interpreter bridge.
*/
DEFINE_FUNCTION art_quick_deoptimize_from_compiled_code
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx
+ SETUP_SAVE_EVERYTHING_FRAME ebx
subl LITERAL(8), %esp // Align stack.
CFI_ADJUST_CFA_OFFSET(8)
pushl %fs:THREAD_SELF_OFFSET // Pass Thread::Current().
@@ -2113,7 +2117,7 @@
END_FUNCTION art_quick_string_compareto
DEFINE_FUNCTION art_quick_string_builder_append
- SETUP_SAVE_REFS_ONLY_FRAME ebx, ebx // save ref containing registers for GC
+ SETUP_SAVE_REFS_ONLY_FRAME ebx // save ref containing registers for GC
// Outgoing argument set up
leal FRAME_SIZE_SAVE_REFS_ONLY + __SIZEOF_POINTER__(%esp), %edi // prepare args
push %eax // push padding
@@ -2310,7 +2314,7 @@
DEFINE_FUNCTION art_quick_invoke_polymorphic
// On entry: EAX := unused, ECX := receiver
- SETUP_SAVE_REFS_AND_ARGS_FRAME ebx, ebx // Save frame.
+ SETUP_SAVE_REFS_AND_ARGS_FRAME ebx // Save frame.
mov %esp, %edx // Remember SP
sub LITERAL(4), %esp // Alignment padding
CFI_ADJUST_CFA_OFFSET(4)
@@ -2331,7 +2335,7 @@
END_FUNCTION art_quick_invoke_polymorphic
DEFINE_FUNCTION art_quick_invoke_custom
- SETUP_SAVE_REFS_AND_ARGS_FRAME ebx, ebx // Save frame.
+ SETUP_SAVE_REFS_AND_ARGS_FRAME ebx // Save frame.
// EAX := call_site_index
mov %esp, %ecx // Remember SP.
subl LITERAL(4), %esp // Alignment padding.
@@ -2437,7 +2441,7 @@
// On entry, the method is at the bottom of the stack.
DEFINE_FUNCTION art_quick_compile_optimized
- SETUP_SAVE_EVERYTHING_FRAME ebx, ebx
+ SETUP_SAVE_EVERYTHING_FRAME ebx
mov FRAME_SIZE_SAVE_EVERYTHING(%esp), %eax // Fetch ArtMethod
sub LITERAL(8), %esp // Alignment padding
CFI_ADJUST_CFA_OFFSET(8)