1*56bb7041Schristos .text 2*56bb7041Schristos 3*56bb7041Schristos#; func_locvars 4*56bb7041Schristos#; - function with a space on the stack 5*56bb7041Schristos#; allocated for local variables 6*56bb7041Schristos 7*56bb7041Schristosfunc_locvars: 8*56bb7041Schristos .cfi_startproc 9*56bb7041Schristos 10*56bb7041Schristos #; alocate space for local vars 11*56bb7041Schristos sub $0x1234,%rsp 12*56bb7041Schristos .cfi_adjust_cfa_offset 0x1234 13*56bb7041Schristos 14*56bb7041Schristos #; dummy body 15*56bb7041Schristos movl $1,%eax 16*56bb7041Schristos 17*56bb7041Schristos #; release space of local vars and return 18*56bb7041Schristos add $0x1234,%rsp 19*56bb7041Schristos .cfi_adjust_cfa_offset -0x1234 20*56bb7041Schristos ret 21*56bb7041Schristos .cfi_endproc 22*56bb7041Schristos 23*56bb7041Schristos#; func_prologue 24*56bb7041Schristos#; - functions that begins with standard 25*56bb7041Schristos#; prologue: "pushq %rbp; movq %rsp,%rbp" 26*56bb7041Schristos 27*56bb7041Schristosfunc_prologue: 28*56bb7041Schristos .cfi_startproc 29*56bb7041Schristos 30*56bb7041Schristos #; prologue, CFI is valid after 31*56bb7041Schristos #; each instruction. 32*56bb7041Schristos pushq %rbp 33*56bb7041Schristos .cfi_def_cfa_offset 16 34*56bb7041Schristos .cfi_offset %rbp, -16 35*56bb7041Schristos movq %rsp, %rbp 36*56bb7041Schristos .cfi_def_cfa_register %rbp 37*56bb7041Schristos 38*56bb7041Schristos #; function body 39*56bb7041Schristos call func_locvars 40*56bb7041Schristos addl $3, %eax 41*56bb7041Schristos 42*56bb7041Schristos #; epilogue with valid CFI 43*56bb7041Schristos #; (we're better than gcc :-) 44*56bb7041Schristos leaveq 45*56bb7041Schristos .cfi_def_cfa %rsp, 8 46*56bb7041Schristos ret 47*56bb7041Schristos .cfi_endproc 48*56bb7041Schristos 49*56bb7041Schristos#; func_otherreg 50*56bb7041Schristos#; - function that moves frame pointer to 51*56bb7041Schristos#; another register (r12) and then allocates 52*56bb7041Schristos#; a space for local variables 53*56bb7041Schristos 54*56bb7041Schristosfunc_otherreg: 55*56bb7041Schristos .cfi_startproc 56*56bb7041Schristos 57*56bb7041Schristos #; save frame pointer to r8 58*56bb7041Schristos movq %rsp,%r8 59*56bb7041Schristos .cfi_def_cfa_register r8 60*56bb7041Schristos 61*56bb7041Schristos #; alocate space for local vars 62*56bb7041Schristos #; (no .cfi_{def,adjust}_cfa_offset here, 63*56bb7041Schristos #; because CFA is computed from r8!) 64*56bb7041Schristos sub $100,%rsp 65*56bb7041Schristos 66*56bb7041Schristos #; function body 67*56bb7041Schristos call func_prologue 68*56bb7041Schristos addl $2, %eax 69*56bb7041Schristos 70*56bb7041Schristos #; restore frame pointer from r8 71*56bb7041Schristos movq %r8,%rsp 72*56bb7041Schristos .cfi_def_cfa_register rsp 73*56bb7041Schristos ret 74*56bb7041Schristos .cfi_endproc 75*56bb7041Schristos 76*56bb7041Schristos#; main 77*56bb7041Schristos#; - typical function 78*56bb7041Schristosmain: 79*56bb7041Schristos .cfi_startproc 80*56bb7041Schristos 81*56bb7041Schristos #; only function body that doesn't 82*56bb7041Schristos #; touch the stack at all. 83*56bb7041Schristos call func_otherreg 84*56bb7041Schristos 85*56bb7041Schristos #; return 86*56bb7041Schristos ret 87*56bb7041Schristos .cfi_endproc 88*56bb7041Schristos 89*56bb7041Schristos#; _start 90*56bb7041Schristos#; - standard entry point 91*56bb7041Schristos 92*56bb7041Schristos .globl _start 93*56bb7041Schristos_start: 94*56bb7041Schristos .cfi_startproc 95*56bb7041Schristos call main 96*56bb7041Schristos movq %rax,%rdi 97*56bb7041Schristos movq $0x3c,%rax 98*56bb7041Schristos syscall 99*56bb7041Schristos hlt 100*56bb7041Schristos .cfi_endproc 101*56bb7041Schristos 102*56bb7041Schristos#; func_alldirectives 103*56bb7041Schristos#; - test for all .cfi directives. 104*56bb7041Schristos#; This function is never called and the CFI info doesn't make sense. 105*56bb7041Schristos 106*56bb7041Schristosfunc_alldirectives: 107*56bb7041Schristos .cfi_startproc simple 108*56bb7041Schristos .cfi_def_cfa rsp,8 109*56bb7041Schristos nop 110*56bb7041Schristos .cfi_def_cfa_offset 16 111*56bb7041Schristos nop 112*56bb7041Schristos .cfi_def_cfa_register r8 113*56bb7041Schristos nop 114*56bb7041Schristos .cfi_adjust_cfa_offset 0x1234 115*56bb7041Schristos nop 116*56bb7041Schristos .cfi_offset %rsi, 0x10 117*56bb7041Schristos nop 118*56bb7041Schristos .cfi_register %r8, %r9 119*56bb7041Schristos nop 120*56bb7041Schristos .cfi_remember_state 121*56bb7041Schristos nop 122*56bb7041Schristos .cfi_restore %rbp 123*56bb7041Schristos nop 124*56bb7041Schristos .cfi_undefined %rip 125*56bb7041Schristos nop 126*56bb7041Schristos .cfi_same_value rbx 127*56bb7041Schristos nop 128*56bb7041Schristos .cfi_restore_state 129*56bb7041Schristos ret 130*56bb7041Schristos .cfi_endproc 131*56bb7041Schristos 132*56bb7041Schristos#; func_all_registers 133*56bb7041Schristos#; - test for all .cfi register numbers. 134*56bb7041Schristos#; This function is never called and the CFI info doesn't make sense. 135*56bb7041Schristos 136*56bb7041Schristosfunc_all_registers: 137*56bb7041Schristos .cfi_startproc simple 138*56bb7041Schristos 139*56bb7041Schristos .cfi_undefined rip ; nop 140*56bb7041Schristos .cfi_undefined rax ; nop 141*56bb7041Schristos .cfi_undefined rcx ; nop 142*56bb7041Schristos .cfi_undefined rdx ; nop 143*56bb7041Schristos .cfi_undefined rbx ; nop 144*56bb7041Schristos .cfi_undefined rsp ; nop 145*56bb7041Schristos .cfi_undefined rbp ; nop 146*56bb7041Schristos .cfi_undefined rsi ; nop 147*56bb7041Schristos .cfi_undefined rdi ; nop 148*56bb7041Schristos .cfi_undefined r8 ; nop 149*56bb7041Schristos .cfi_undefined r9 ; nop 150*56bb7041Schristos .cfi_undefined r10 ; nop 151*56bb7041Schristos .cfi_undefined r11 ; nop 152*56bb7041Schristos .cfi_undefined r12 ; nop 153*56bb7041Schristos .cfi_undefined r13 ; nop 154*56bb7041Schristos .cfi_undefined r14 ; nop 155*56bb7041Schristos .cfi_undefined r15 ; nop 156*56bb7041Schristos .cfi_undefined rflags ; nop 157*56bb7041Schristos 158*56bb7041Schristos .cfi_undefined es ; nop 159*56bb7041Schristos .cfi_undefined cs ; nop 160*56bb7041Schristos .cfi_undefined ds ; nop 161*56bb7041Schristos .cfi_undefined ss ; nop 162*56bb7041Schristos .cfi_undefined fs ; nop 163*56bb7041Schristos .cfi_undefined gs ; nop 164*56bb7041Schristos .cfi_undefined tr ; nop 165*56bb7041Schristos .cfi_undefined ldtr ; nop 166*56bb7041Schristos .cfi_undefined fs.base ; nop 167*56bb7041Schristos .cfi_undefined gs.base ; nop 168*56bb7041Schristos 169*56bb7041Schristos .cfi_undefined mxcsr ; nop 170*56bb7041Schristos .cfi_undefined xmm0 ; nop 171*56bb7041Schristos .cfi_undefined xmm1 ; nop 172*56bb7041Schristos .cfi_undefined xmm2 ; nop 173*56bb7041Schristos .cfi_undefined xmm3 ; nop 174*56bb7041Schristos .cfi_undefined xmm4 ; nop 175*56bb7041Schristos .cfi_undefined xmm5 ; nop 176*56bb7041Schristos .cfi_undefined xmm6 ; nop 177*56bb7041Schristos .cfi_undefined xmm7 ; nop 178*56bb7041Schristos .cfi_undefined xmm8 ; nop 179*56bb7041Schristos .cfi_undefined xmm9 ; nop 180*56bb7041Schristos .cfi_undefined xmm10 ; nop 181*56bb7041Schristos .cfi_undefined xmm11 ; nop 182*56bb7041Schristos .cfi_undefined xmm12 ; nop 183*56bb7041Schristos .cfi_undefined xmm13 ; nop 184*56bb7041Schristos .cfi_undefined xmm14 ; nop 185*56bb7041Schristos .cfi_undefined xmm15 ; nop 186*56bb7041Schristos 187*56bb7041Schristos .cfi_undefined fcw ; nop 188*56bb7041Schristos .cfi_undefined fsw ; nop 189*56bb7041Schristos .cfi_undefined st ; nop 190*56bb7041Schristos .cfi_undefined st(1) ; nop 191*56bb7041Schristos .cfi_undefined st(2) ; nop 192*56bb7041Schristos .cfi_undefined st(3) ; nop 193*56bb7041Schristos .cfi_undefined st(4) ; nop 194*56bb7041Schristos .cfi_undefined st(5) ; nop 195*56bb7041Schristos .cfi_undefined st(6) ; nop 196*56bb7041Schristos .cfi_undefined st(7) ; nop 197*56bb7041Schristos 198*56bb7041Schristos .cfi_undefined mm0 ; nop 199*56bb7041Schristos .cfi_undefined mm1 ; nop 200*56bb7041Schristos .cfi_undefined mm2 ; nop 201*56bb7041Schristos .cfi_undefined mm3 ; nop 202*56bb7041Schristos .cfi_undefined mm4 ; nop 203*56bb7041Schristos .cfi_undefined mm5 ; nop 204*56bb7041Schristos .cfi_undefined mm6 ; nop 205*56bb7041Schristos .cfi_undefined mm7 ; nop 206*56bb7041Schristos 207*56bb7041Schristos .cfi_undefined xmm16 ; nop 208*56bb7041Schristos .cfi_undefined xmm17 ; nop 209*56bb7041Schristos .cfi_undefined xmm18 ; nop 210*56bb7041Schristos .cfi_undefined xmm19 ; nop 211*56bb7041Schristos .cfi_undefined xmm20 ; nop 212*56bb7041Schristos .cfi_undefined xmm21 ; nop 213*56bb7041Schristos .cfi_undefined xmm22 ; nop 214*56bb7041Schristos .cfi_undefined xmm23 ; nop 215*56bb7041Schristos .cfi_undefined xmm24 ; nop 216*56bb7041Schristos .cfi_undefined xmm25 ; nop 217*56bb7041Schristos .cfi_undefined xmm26 ; nop 218*56bb7041Schristos .cfi_undefined xmm27 ; nop 219*56bb7041Schristos .cfi_undefined xmm28 ; nop 220*56bb7041Schristos .cfi_undefined xmm29 ; nop 221*56bb7041Schristos .cfi_undefined xmm30 ; nop 222*56bb7041Schristos .cfi_undefined xmm31 ; nop 223*56bb7041Schristos 224*56bb7041Schristos .cfi_undefined k0 ; nop 225*56bb7041Schristos .cfi_undefined k1 ; nop 226*56bb7041Schristos .cfi_undefined k2 ; nop 227*56bb7041Schristos .cfi_undefined k3 ; nop 228*56bb7041Schristos .cfi_undefined k4 ; nop 229*56bb7041Schristos .cfi_undefined k5 ; nop 230*56bb7041Schristos .cfi_undefined k6 ; nop 231*56bb7041Schristos .cfi_undefined k7 ; nop 232*56bb7041Schristos 233*56bb7041Schristos .cfi_endproc 234