/* 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 . */ /* 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