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