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)