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