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,%esp
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,%esp
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	pushl	%ebp
33	.cfi_def_cfa_offset	8
34	.cfi_offset		ebp,-8
35	movl	%esp, %ebp
36	.cfi_def_cfa_register	ebp
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	leave
45	.cfi_def_cfa_register	esp
46	ret
47	.cfi_endproc
48
49#; func_otherreg
50#; - function that moves frame pointer to
51#;   another register (ebx) and then allocates
52#;   a space for local variables
53
54func_otherreg:
55	.cfi_startproc
56
57	#; save frame pointer to ebx
58	mov	%esp,%ebx
59	.cfi_def_cfa_register	ebx
60
61	#; alocate space for local vars
62	#;  (no .cfi_{def,adjust}_cfa_offset here,
63	#;   because CFA is computed from ebx!)
64	sub	$100,%esp
65
66	#; function body
67	call	func_prologue
68	add	$2, %eax
69
70	#; restore frame pointer from ebx
71	mov	%ebx,%esp
72	.cfi_def_cfa		esp,4
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	movl	%eax,%edi
97	movl	$0x1,%eax
98	int	$0x80
99	hlt
100	.cfi_endproc
101
102#; func_all_registers
103#; - test for all .cfi register numbers.
104#;   This function is never called and the CFI info doesn't make sense.
105
106func_all_registers:
107	.cfi_startproc simple
108
109	.cfi_undefined eip	; nop
110	.cfi_undefined eax	; nop
111	.cfi_undefined ecx	; nop
112	.cfi_undefined edx	; nop
113	.cfi_undefined ebx	; nop
114	.cfi_undefined esp	; nop
115	.cfi_undefined ebp	; nop
116	.cfi_undefined esi	; nop
117	.cfi_undefined edi	; nop
118	.cfi_undefined eflags	; nop
119
120	.cfi_undefined es	; nop
121	.cfi_undefined cs	; nop
122	.cfi_undefined ds	; nop
123	.cfi_undefined ss	; nop
124	.cfi_undefined fs	; nop
125	.cfi_undefined gs	; nop
126	.cfi_undefined tr	; nop
127	.cfi_undefined ldtr	; nop
128
129	.cfi_undefined mxcsr	; nop
130	.cfi_undefined xmm0	; nop
131	.cfi_undefined xmm1	; nop
132	.cfi_undefined xmm2	; nop
133	.cfi_undefined xmm3	; nop
134	.cfi_undefined xmm4	; nop
135	.cfi_undefined xmm5	; nop
136	.cfi_undefined xmm6	; nop
137	.cfi_undefined xmm7	; nop
138
139	.cfi_undefined fcw	; nop
140	.cfi_undefined fsw	; nop
141	.cfi_undefined st	; nop
142	.cfi_undefined st(1)	; nop
143	.cfi_undefined st(2)	; nop
144	.cfi_undefined st(3)	; nop
145	.cfi_undefined st(4)	; nop
146	.cfi_undefined st(5)	; nop
147	.cfi_undefined st(6)	; nop
148	.cfi_undefined st(7)	; nop
149
150	.cfi_undefined mm0	; nop
151	.cfi_undefined mm1	; nop
152	.cfi_undefined mm2	; nop
153	.cfi_undefined mm3	; nop
154	.cfi_undefined mm4	; nop
155	.cfi_undefined mm5	; nop
156	.cfi_undefined mm6	; nop
157	.cfi_undefined mm7	; nop
158
159	.cfi_undefined k0	; nop
160	.cfi_undefined k1	; nop
161	.cfi_undefined k2	; nop
162	.cfi_undefined k3	; nop
163	.cfi_undefined k4	; nop
164	.cfi_undefined k5	; nop
165	.cfi_undefined k6	; nop
166	.cfi_undefined k7	; nop
167
168	.cfi_endproc
169