| /* Copyright 2026 Free Software Foundation, Inc. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| |
| /* Hand-written x86-64 assembly with no .cfi directives. The .debug_frame |
| section is supplied by the companion -dw.S file, generated by the DWARF |
| assembler. |
| |
| The call chain: main -> caller -> callee. |
| |
| caller sets some known register values, and callee saves those registers in |
| different way. */ |
| |
| .text |
| |
| /* main */ |
| .globl main |
| .type main, @function |
| main: |
| pushq %rbp |
| .globl main_after_push_rbp |
| main_after_push_rbp: |
| movq %rsp, %rbp |
| .globl main_after_set_rbp |
| main_after_set_rbp: |
| call caller |
| xorl %eax, %eax |
| popq %rbp |
| ret |
| .size main, . - main |
| .globl main_end |
| main_end: |
| .globl main_len |
| .set main_len, main_end - main |
| |
| /* caller */ |
| .globl caller |
| .type caller, @function |
| caller: |
| pushq %rbp |
| .globl caller_after_push_rbp |
| caller_after_push_rbp: |
| movq %rsp, %rbp |
| .globl caller_after_set_rbp |
| caller_after_set_rbp: |
| movq $0x11223344, %r12 |
| movq $0x55667788, %r13 |
| .globl caller_call_callee |
| caller_call_callee: |
| call callee |
| popq %rbp |
| ret |
| .size caller, . - caller |
| .globl caller_end |
| caller_end: |
| .globl caller_len |
| .set caller_len, caller_end - caller |
| |
| /* callee */ |
| .globl callee |
| .type callee, @function |
| callee: |
| pushq %rbp |
| .globl callee_after_push_rbp |
| callee_after_push_rbp: |
| movq %rsp, %rbp |
| .globl callee_after_set_rbp |
| callee_after_set_rbp: |
| /* Save r12 in the stack, then clobber it. */ |
| pushq %r12 |
| xorq %r12, %r12 |
| /* Save r13 in rax, then clobber it. */ |
| movq %r13, %rax |
| xorq %r13, %r13 |
| /* Clobber r14. This one is described with a DWARF expression. */ |
| xorq %r14, %r14 |
| .globl callee_body |
| callee_body: |
| nop |
| movq %rax, %r13 |
| popq %r12 |
| popq %rbp |
| ret |
| .size callee, . - callee |
| .globl callee_end |
| callee_end: |
| .globl callee_len |
| .set callee_len, callee_end - callee |
| |
| .section .note.GNU-stack,"",@progbits |