| .text |
| // --------------------------- |
| // A function with its prologue outlined |
| // --------------------------- |
| |
| .globl _function_prologue_outlined |
| .p2align 2 |
| _function_prologue_outlined: |
| .cfi_startproc |
| |
| ;; Do a non-ABI call where I put the |
| ;; return address in x0 and then jump |
| ;; to an outlined function. |
| adrp x0, Lfunc_return0@PAGE |
| add x0, x0, Lfunc_return0@PAGEOFF |
| b _OUTLINED_FUNCTION_1 |
| Lfunc_return0: |
| bl _foo_prologue |
| |
| nop ;; working around a bug where debugserver used to |
| ;; migrate past a builtin_debugtrap brk, it would |
| ;; do it here and now show us hitting it as we |
| ;; private step out of foo_prologue. Insert a |
| ;; nop to avoid that. |
| |
| //brk #0xf000 ;; __builtin_debugtrap "middle" of function |
| |
| ldp x29, x30, [sp, #16] |
| add sp, sp, #32 |
| ret |
| .cfi_endproc |
| |
| .globl _OUTLINED_FUNCTION_1 |
| _OUTLINED_FUNCTION_1: |
| .cfi_startproc |
| sub sp, sp, #32 |
| stp x29, x30, [sp, #16] |
| br x0 |
| .cfi_endproc |
| |
| .globl _foo_prologue |
| _foo_prologue: |
| ret |
| |
| |
| // --------------------------- |
| // A function with part of its body outlined |
| // --------------------------- |
| |
| |
| .globl _function_body_outlined |
| .p2align 2 |
| _function_body_outlined: |
| .cfi_startproc |
| sub sp, sp, #32 |
| stp x29, x30, [sp, #16] |
| .cfi_def_cfa_offset 32 |
| .cfi_offset w30, -8 |
| .cfi_offset w29, -16 |
| |
| bl _OUTLINED_FUNCTION_2 |
| |
| //brk #0xf000 ;; __builtin_debugtrap "middle" of function |
| |
| ldp x29, x30, [sp, #16] |
| add sp, sp, #32 |
| ret |
| .cfi_endproc |
| |
| ;; This OUTLINED_FUNCTION creates a normal |
| ;; stack frame, but doesn't include unwind |
| ;; instructions to that effect in the DWARF. |
| ;; |
| ;; We intend for the debug instructions to be wrong, |
| ;; but an instruction analysis unwind plan would do the |
| ;; right thing here. |
| .globl _OUTLINED_FUNCTION_2 |
| _OUTLINED_FUNCTION_2: |
| .cfi_startproc |
| sub sp, sp, #32 |
| stp x29, x30, [sp, #16] |
| bl _foo_midfunction |
| ldp x29, x30, [sp, #16] |
| add sp, sp, #32 |
| ret |
| .cfi_endproc |
| |
| .globl _foo_midfunction |
| _foo_midfunction: |
| ret |
| |
| // --------------------------- |
| // A function with its epilogue outlined |
| // --------------------------- |
| |
| .globl _function_epilogue_outlined |
| .p2align 2 |
| _function_epilogue_outlined: |
| .cfi_startproc |
| sub sp, sp, #32 |
| stp x29, x30, [sp, #16] |
| .cfi_def_cfa_offset 32 |
| .cfi_offset w30, -8 |
| .cfi_offset w29, -16 |
| |
| //brk #0xf000 ;; __builtin_debugtrap "middle" of function |
| b _OUTLINED_FUNCTION_3 |
| .cfi_endproc |
| |
| .globl _OUTLINED_FUNCTION_3 |
| _OUTLINED_FUNCTION_3: |
| .cfi_startproc |
| bl _foo_epilogue |
| ldp x29, x30, [sp, #16] |
| add sp, sp, #32 |
| ret |
| .cfi_endproc |
| |
| .globl _foo_epilogue |
| _foo_epilogue: |
| ret |