blob: 10035ad7f8fdb955627335e62a3d046cc93fcf17 [file] [log] [blame]
#; $ as -o test.o gas-cfi-test.s && gcc -nostdlib -o test test.o
.text
#; func_locvars
#; - function with a space on the stack
#; allocated for local variables
.type func_locvars,@function
func_locvars:
.cfi_startproc
#; alocate space for local vars
sub $0x1234,%rsp
.cfi_adjust_cfa_offset 0x1234
#; dummy body
movl $1,%eax
#; release space of local vars and return
add $0x1234,%rsp
.cfi_adjust_cfa_offset -0x1234
ret
.cfi_endproc
#; func_prologue
#; - functions that begins with standard
#; prologue: "pushq %rbp; movq %rsp,%rbp"
.type func_prologue,@function
func_prologue:
.cfi_startproc
#; prologue, CFI is valid after
#; each instruction.
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset rbp,-16
movq %rsp, %rbp
.cfi_def_cfa_register rbp
#; function body
call func_locvars
addl $3, %eax
#; epilogue with valid CFI
#; (we're better than gcc :-)
leaveq
.cfi_def_cfa rsp,8
ret
.cfi_endproc
#; func_otherreg
#; - function that moves frame pointer to
#; another register (r12) and then allocates
#; a space for local variables
.type func_otherreg,@function
func_otherreg:
.cfi_startproc
#; save frame pointer to r12
movq %rsp,%r12
.cfi_def_cfa_register r12
#; alocate space for local vars
#; (no .cfi_{def,adjust}_cfa_offset here,
#; because CFA is computed from r12!)
sub $100,%rsp
#; function body
call func_prologue
addl $2, %eax
#; restore frame pointer from r12
movq %r12,%rsp
.cfi_def_cfa_register rsp
ret
.cfi_endproc
#; main
#; - typical function
.type main,@function
main:
.cfi_startproc
#; only function body that doesn't
#; touch the stack at all.
call func_otherreg
#; return
ret
.cfi_endproc
#; _start
#; - standard entry point
.type _start,@function
.globl _start
_start:
.cfi_startproc
call main
movq %rax,%rdi
movq $0x3c,%rax
syscall
hlt
.cfi_endproc