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