diff options
| -rw-r--r-- | runtime/arch/arm/quick_entrypoints_arm.S | 35 | ||||
| -rw-r--r-- | runtime/arch/mips/quick_entrypoints_mips.S | 34 | ||||
| -rw-r--r-- | runtime/arch/x86/quick_entrypoints_x86.S | 53 |
3 files changed, 117 insertions, 5 deletions
diff --git a/runtime/arch/arm/quick_entrypoints_arm.S b/runtime/arch/arm/quick_entrypoints_arm.S index 9a853d07ab..1a058ea61e 100644 --- a/runtime/arch/arm/quick_entrypoints_arm.S +++ b/runtime/arch/arm/quick_entrypoints_arm.S @@ -69,12 +69,24 @@ .macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME add sp, #4 @ bottom word holds Method* pop {r5-r8, r10-r11, lr} @ 7 words of callee saves + .cfi_restore r5 + .cfi_restore r6 + .cfi_restore r7 + .cfi_restore r8 + .cfi_restore r10 + .cfi_restore r11 .cfi_adjust_cfa_offset -32 .endm .macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN add sp, #4 @ bottom word holds Method* pop {r5-r8, r10-r11, lr} @ 7 words of callee saves + .cfi_restore r5 + .cfi_restore r6 + .cfi_restore r7 + .cfi_restore r8 + .cfi_restore r10 + .cfi_restore r11 .cfi_adjust_cfa_offset -32 bx lr @ return .endm @@ -86,7 +98,6 @@ .macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME push {r1-r3, r5-r8, r10-r11, lr} @ 10 words of callee saves .save {r1-r3, r5-r8, r10-r11, lr} - .cfi_adjust_cfa_offset 40 .cfi_rel_offset r1, 0 .cfi_rel_offset r2, 4 .cfi_rel_offset r3, 8 @@ -97,6 +108,7 @@ .cfi_rel_offset r10, 28 .cfi_rel_offset r11, 32 .cfi_rel_offset lr, 36 + .cfi_adjust_cfa_offset 40 sub sp, #8 @ 2 words of space, bottom word will hold Method* .pad #8 .cfi_adjust_cfa_offset 8 @@ -105,6 +117,15 @@ .macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME add sp, #8 @ rewind sp pop {r1-r3, r5-r8, r10-r11, lr} @ 10 words of callee saves + .cfi_restore r1 + .cfi_restore r2 + .cfi_restore r3 + .cfi_restore r5 + .cfi_restore r6 + .cfi_restore r7 + .cfi_restore r8 + .cfi_restore r10 + .cfi_restore r11 .cfi_adjust_cfa_offset -48 .endm @@ -285,6 +306,11 @@ ENTRY art_quick_invoke_stub ldr ip, [sp, #24] @ load the result pointer strd r0, [ip] @ store r0/r1 into result pointer pop {r0, r4, r5, r9, r11, lr} @ restore spill regs + .cfi_restore r0 + .cfi_restore r4 + .cfi_restore r5 + .cfi_restore r9 + .cfi_restore lr .cfi_adjust_cfa_offset -24 bx lr END art_quick_invoke_stub @@ -413,6 +439,8 @@ throw_class_cast_exception: add sp, #4 .cfi_adjust_cfa_offset -4 pop {r0-r1, lr} + .cfi_restore r0 + .cfi_restore r1 SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context mov r2, r9 @ pass Thread::Current mov r3, sp @ pass SP @@ -689,6 +717,7 @@ ENTRY art_quick_set64_static .cfi_rel_offset r9, 0 bl artSet64StaticFromCode @ (field_idx, referrer, new_val, Thread*, SP) add sp, #16 @ release out args + .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION @@ -1137,6 +1166,8 @@ art_quick_instrumentation_exit: mov r2, r0 @ link register saved by instrumentation mov lr, r1 @ r1 is holding link register if we're to bounce to deoptimize pop {r0, r1} @ restore return value + .cfi_restore r0 + .cfi_restore r1 add sp, #32 @ remove callee save frame .cfi_adjust_cfa_offset -32 bx r2 @ return @@ -1187,6 +1218,8 @@ ENTRY art_quick_mul_long mov r1,r10 pop {r9 - r10} .cfi_adjust_cfa_offset -8 + .cfi_restore r9 + .cfi_restore r10 bx lr END art_quick_mul_long diff --git a/runtime/arch/mips/quick_entrypoints_mips.S b/runtime/arch/mips/quick_entrypoints_mips.S index 451b1bb30f..886271166c 100644 --- a/runtime/arch/mips/quick_entrypoints_mips.S +++ b/runtime/arch/mips/quick_entrypoints_mips.S @@ -89,28 +89,46 @@ .macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME lw $ra, 60($sp) + .cfi_restore 31 lw $s8, 56($sp) + .cfi_restore 30 lw $gp, 52($sp) + .cfi_restore 28 lw $s7, 48($sp) + .cfi_restore 23 lw $s6, 44($sp) + .cfi_restore 22 lw $s5, 40($sp) + .cfi_restore 21 lw $s4, 36($sp) + .cfi_restore 20 lw $s3, 32($sp) + .cfi_restore 19 lw $s2, 28($sp) + .cfi_restore 18 addiu $sp, $sp, 64 .cfi_adjust_cfa_offset -64 .endm .macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN lw $ra, 60($sp) + .cfi_restore 31 lw $s8, 56($sp) + .cfi_restore 30 lw $gp, 52($sp) + .cfi_restore 28 lw $s7, 48($sp) + .cfi_restore 23 lw $s6, 44($sp) + .cfi_restore 22 lw $s5, 40($sp) + .cfi_restore 21 lw $s4, 36($sp) + .cfi_restore 20 lw $s3, 32($sp) + .cfi_restore 19 lw $s2, 28($sp) + .cfi_restore 18 jr $ra addiu $sp, $sp, 64 .cfi_adjust_cfa_offset -64 @@ -153,17 +171,29 @@ .macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME lw $ra, 60($sp) + .cfi_restore 31 lw $s8, 56($sp) + .cfi_restore 30 lw $gp, 52($sp) + .cfi_restore 28 lw $s7, 48($sp) + .cfi_restore 23 lw $s6, 44($sp) + .cfi_restore 22 lw $s5, 40($sp) + .cfi_restore 21 lw $s4, 36($sp) + .cfi_restore 20 lw $s3, 32($sp) + .cfi_restore 19 lw $s2, 28($sp) + .cfi_restore 18 lw $a3, 12($sp) + .cfi_restore 7 lw $a2, 8($sp) + .cfi_restore 6 lw $a1, 4($sp) + .cfi_restore 5 addiu $sp, $sp, 64 # pop frame .cfi_adjust_cfa_offset -64 .endm @@ -463,9 +493,13 @@ ENTRY art_quick_invoke_stub sw $zero, 0($sp) # store NULL for method* at bottom of frame move $sp, $fp # restore the stack lw $s0, 0($sp) + .cfi_restore 16 lw $s1, 4($sp) + .cfi_restore 17 lw $fp, 8($sp) + .cfi_restore 30 lw $ra, 12($sp) + .cfi_restore 31 addiu $sp, $sp, 16 .cfi_adjust_cfa_offset -16 lw $t0, 16($sp) # get result pointer diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S index 6fe499374a..ee78d45793 100644 --- a/runtime/arch/x86/quick_entrypoints_x86.S +++ b/runtime/arch/x86/quick_entrypoints_x86.S @@ -16,14 +16,19 @@ #include "asm_support_x86.S" +// For x86, the CFA is esp+4, the address above the pushed return address on the stack. + /* * Macro that sets up the callee save frame to conform with * Runtime::CreateCalleeSaveMethod(kSaveAll) */ MACRO0(SETUP_SAVE_ALL_CALLEE_SAVE_FRAME) PUSH edi // Save callee saves (ebx is saved/restored by the upcall) + .cfi_rel_offset edi, -8 PUSH esi + .cfi_rel_offset esi, -12 PUSH ebp + .cfi_rel_offset ebp, -16 subl MACRO_LITERAL(16), %esp // Grow stack by 4 words, bottom word will hold Method* .cfi_adjust_cfa_offset 16 END_MACRO @@ -34,8 +39,11 @@ END_MACRO */ MACRO0(SETUP_REF_ONLY_CALLEE_SAVE_FRAME) PUSH edi // Save callee saves (ebx is saved/restored by the upcall) + .cfi_rel_offset edi, -8 PUSH esi + .cfi_rel_offset esi, -12 PUSH ebp + .cfi_rel_offset ebp, -16 subl MACRO_LITERAL(16), %esp // Grow stack by 4 words, bottom word will hold Method* .cfi_adjust_cfa_offset 16 END_MACRO @@ -43,8 +51,11 @@ END_MACRO MACRO0(RESTORE_REF_ONLY_CALLEE_SAVE_FRAME) addl MACRO_LITERAL(16), %esp // Unwind stack up to return address POP ebp // Restore callee saves (ebx is saved/restored by the upcall) + .cfi_restore ebp POP esi + .cfi_restore esi POP edi + .cfi_restore edi .cfi_adjust_cfa_offset -28 END_MACRO @@ -54,23 +65,36 @@ END_MACRO */ MACRO0(SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME) PUSH edi // Save callee saves + .cfi_rel_offset edi, -8 PUSH esi + .cfi_rel_offset esi, -12 PUSH ebp + .cfi_rel_offset ebp, -16 PUSH ebx // Save args + .cfi_rel_offset ebx, -20 PUSH edx + .cfi_rel_offset edx, -24 PUSH ecx + .cfi_rel_offset ecx, -28 PUSH eax // Align stack, eax will be clobbered by Method* + .cfi_rel_offset eax, -28 END_MACRO MACRO0(RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME) addl MACRO_LITERAL(4), %esp // Remove padding .cfi_adjust_cfa_offset -4 POP ecx // Restore args except eax + .cfi_restore ecx POP edx + .cfi_restore edx POP ebx + .cfi_restore ebx POP ebp // Restore callee saves + .cfi_restore ebp POP esi + .cfi_restore esi POP edi + .cfi_restore edi END_MACRO /* @@ -188,12 +212,19 @@ MACRO2(INVOKE_TRAMPOLINE, c_name, cxx_name) // Set up the callee save frame to conform with Runtime::CreateCalleeSaveMethod(kRefsAndArgs) // return address PUSH edi + .cfi_rel_offset edi, -8 PUSH esi + .cfi_rel_offset esi, -12 PUSH ebp - PUSH ebx + .cfi_rel_offset ebp, -16 + PUSH ebx // Save args + .cfi_rel_offset ebx, -20 PUSH edx + .cfi_rel_offset edx, -24 PUSH ecx - PUSH eax // <-- callee save Method* to go here + .cfi_rel_offset ecx, -28 + PUSH eax // <-- callee save Method* to go here + .cfi_rel_offset eax, -32 movl %esp, %edx // remember SP // Outgoing argument set up subl MACRO_LITERAL(12), %esp // alignment padding @@ -209,11 +240,16 @@ MACRO2(INVOKE_TRAMPOLINE, c_name, cxx_name) movl %edx, %edi // save code pointer in EDI addl MACRO_LITERAL(36), %esp // Pop arguments skip eax .cfi_adjust_cfa_offset -36 - POP ecx // Restore args + POP ecx // Restore args except eax + .cfi_restore ecx POP edx + .cfi_restore edx POP ebx - POP ebp // Restore callee saves. + .cfi_restore ebx + POP ebp // Restore callee saves + .cfi_restore ebp POP esi + .cfi_restore esi // Swap EDI callee save with code pointer. xchgl %edi, (%esp) testl %eax, %eax // Branch forward if exception pending. @@ -248,7 +284,9 @@ INVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvo */ DEFINE_FUNCTION art_quick_invoke_stub PUSH ebp // save ebp + .cfi_rel_offset ebp, -8 PUSH ebx // save ebx + .cfi_rel_offset ebx, -12 mov %esp, %ebp // copy value of stack pointer into base pointer .cfi_def_cfa_register ebp mov 20(%ebp), %ebx // get arg array size @@ -269,8 +307,11 @@ 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 POP ebx // pop ebx + .cfi_restore ebx POP ebp // pop ebp + .cfi_restore ebp mov 20(%esp), %ecx // get result pointer cmpl LITERAL(68), 24(%esp) // test if result type char == 'D' je return_double_quick @@ -495,7 +536,9 @@ END_FUNCTION art_quick_is_assignable DEFINE_FUNCTION art_quick_check_cast PUSH eax // alignment padding PUSH ecx // pass arg2 - obj->klass + .cfi_rel_offset ecx, -12 PUSH eax // pass arg1 - checked class + .cfi_rel_offset eax, -16 call SYMBOL(artIsAssignableFromCode) // (Class* klass, Class* ref_klass) testl %eax, %eax jz 1f // jump forward if not assignable @@ -504,7 +547,9 @@ DEFINE_FUNCTION art_quick_check_cast ret 1: POP eax // pop arguments + .cfi_restore eax POP ecx + .cfi_restore ecx addl LITERAL(4), %esp .cfi_adjust_cfa_offset -12 SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context |