1@ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \
2@ RUN:   | llvm-readobj -s -sd | FileCheck %s
3
4@ Check for .setfp directive.
5
6@ The .setfp directive will track the offset between the frame pointer and
7@ the stack pointer.  This is required for the function that will change
8@ the stack pointer out of the function prologue.  If the exception is thrown,
9@ then libunwind will reconstruct the stack pointer from the frame pointer.
10@ The reconstruction code is implemented by two different unwind opcode:
11@ (i) the unwind opcode to copy stack offset from the other register, and
12@ (ii) the unwind opcode to add or substract the stack offset.
13@
14@ This file includes several cases separated by different range of -offset
15@
16@              (-offset) <  0x00
17@              (-offset) == 0x00
18@     0x04  <= (-offset) <= 0x100
19@     0x104 <= (-offset) <= 0x200
20@     0x204 <= (-offset)
21
22
23	.syntax unified
24
25@-------------------------------------------------------------------------------
26@ TEST1
27@-------------------------------------------------------------------------------
28	.section	.TEST1
29	.globl	func1
30	.align	2
31	.type	func1,%function
32	.fnstart
33func1:
34	.setfp	fp, sp, #0
35	add	fp, sp, #0
36	sub	sp, fp, #0
37	bx	lr
38	.personality __gxx_personality_v0
39	.handlerdata
40	.fnend
41
42@-------------------------------------------------------------------------------
43@ The assembler should emit 0x9B to copy stack pointer from r11.
44@-------------------------------------------------------------------------------
45@ CHECK: Section {
46@ CHECK:   Name: .ARM.extab.TEST1
47@ CHECK:   SectionData (
48@ CHECK:     0000: 00000000 B0B09B00                    |........|
49@ CHECK:   )
50@ CHECK: }
51
52
53
54@-------------------------------------------------------------------------------
55@ TEST2
56@-------------------------------------------------------------------------------
57	.section	.TEST2
58	.globl	func2a
59	.align	2
60	.type	func2a,%function
61	.fnstart
62func2a:
63	.setfp	fp, sp, #-4
64	add	fp, sp, #4
65	sub	sp, fp, #4
66	bx	lr
67	.personality __gxx_personality_v0
68	.handlerdata
69	.fnend
70
71	.globl	func2b
72	.align	2
73	.type	func2b,%function
74	.fnstart
75func2b:
76	.setfp	fp, sp, #-0x100
77	add	fp, sp, #0x100
78	sub	sp, fp, #0x100
79	bx	lr
80	.personality __gxx_personality_v0
81	.handlerdata
82	.fnend
83
84@-------------------------------------------------------------------------------
85@ The assembler should emit 0x9B to copy stack pointer from r11.
86@ The assembler should emit ((-offset - 4) >> 2) for offset.
87@-------------------------------------------------------------------------------
88@ CHECK: Section {
89@ CHECK:   Name: .ARM.extab.TEST2
90@ CHECK:   SectionData (
91@ CHECK:     0000: 00000000 B0009B00 00000000 B03F9B00  |.............?..|
92@ CHECK:   )
93@ CHECK: }
94
95
96
97@-------------------------------------------------------------------------------
98@ TEST3
99@-------------------------------------------------------------------------------
100	.section	.TEST3
101	.globl	func3a
102	.align	2
103	.type	func3a,%function
104	.fnstart
105func3a:
106	.setfp	fp, sp, #-0x104
107	sub	fp, sp, #0x104
108	add	sp, fp, #0x104
109	bx	lr
110	.personality __gxx_personality_v0
111	.handlerdata
112	.fnend
113
114	.globl	func3b
115	.align	2
116	.type	func3b,%function
117	.fnstart
118func3b:
119	.setfp	fp, sp, #-0x200
120	sub	fp, sp, #0x200
121	add	sp, fp, #0x200
122	bx	lr
123	.personality __gxx_personality_v0
124	.handlerdata
125	.fnend
126
127@-------------------------------------------------------------------------------
128@ The assembler should emit 0x9B to copy stack pointer from r11.
129@ The assembler should emit 0x3F and ((-offset - 0x104) >> 2) for offset.
130@-------------------------------------------------------------------------------
131@ CHECK: Section {
132@ CHECK:   Name: .ARM.extab.TEST3
133@ CHECK:   SectionData (
134@ CHECK:     0000: 00000000 3F009B00 00000000 3F3F9B00  |....?.......??..|
135@ CHECK:   )
136@ CHECK: }
137
138
139
140@-------------------------------------------------------------------------------
141@ TEST4
142@-------------------------------------------------------------------------------
143	.section	.TEST4
144	.globl	func4a
145	.align	2
146	.type	func4a,%function
147	.fnstart
148func4a:
149	.setfp	fp, sp, #-0x204
150	sub	fp, sp, #0x204
151	add	sp, fp, #0x204
152	bx	lr
153	.personality __gxx_personality_v0
154	.handlerdata
155	.fnend
156
157	.globl	func4b
158	.align	2
159	.type	func4b,%function
160	.fnstart
161func4b:
162	.setfp	fp, sp, #-0x580
163	sub	fp, sp, #0x580
164	add	sp, fp, #0x580
165	bx	lr
166	.personality __gxx_personality_v0
167	.handlerdata
168	.fnend
169
170@-------------------------------------------------------------------------------
171@ The assembler should emit 0x9B to copy stack pointer from r11.
172@ The assembler should emit 0xB2 and the ULEB128 encoding of
173@ ((-offset - 0x204) >> 2) for offset.
174@-------------------------------------------------------------------------------
175@ CHECK: Section {
176@ CHECK:   Name: .ARM.extab.TEST4
177@ CHECK:   SectionData (
178@ CHECK:     0000: 00000000 00B29B00 00000000 DFB29B01  |................|
179@ CHECK:     0010: B0B0B001                             |....|
180@ CHECK:   )
181@ CHECK: }
182
183
184
185@-------------------------------------------------------------------------------
186@ TEST5
187@-------------------------------------------------------------------------------
188	.section	.TEST5
189	.globl	func5a
190	.align	2
191	.type	func5a,%function
192	.fnstart
193func5a:
194	.setfp	fp, sp, #0x4
195	add	fp, sp, #0x4
196	sub	sp, fp, #0x4
197	bx	lr
198	.personality __gxx_personality_v0
199	.handlerdata
200	.fnend
201
202	.globl	func5b
203	.align	2
204	.type	func5b,%function
205	.fnstart
206func5b:
207	.setfp	fp, sp, #0x104
208	add	fp, sp, #0x104
209	sub	sp, fp, #0x104
210	bx	lr
211	.personality __gxx_personality_v0
212	.handlerdata
213	.fnend
214
215	.globl	func5c
216	.align	2
217	.type	func5c,%function
218	.fnstart
219func5c:
220	.setfp	fp, sp, #0x204
221	add	fp, sp, #0x204
222	sub	sp, fp, #0x204
223	bx	lr
224	.personality __gxx_personality_v0
225	.handlerdata
226	.fnend
227
228@-------------------------------------------------------------------------------
229@ The assembler should emit 0x9B to copy stack pointer from r11.
230@ The assembler should emit (0x40 | (offset - 4)) >> 2 for offset.
231@ If (offset - 4) is greater than 0x3f, then multiple 0x7f should be emitted.
232@-------------------------------------------------------------------------------
233@ CHECK: Section {
234@ CHECK:   Name: .ARM.extab.TEST5
235@ CHECK:   SectionData (
236@ CHECK:     0000: 00000000 B0409B00 00000000 7F409B00  |.....@.......@..|
237@ CHECK:     0010: 00000000 7F409B01 B0B0B07F           |.....@......|
238@ CHECK:   )
239@ CHECK: }
240