blob: 231e2dc237045936c8e725dd5b50f4bed68e38ea [file]
/* 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