Revert "Revert "DI: Fold constant arguments into a single MDString""
[oota-llvm.git] / test / MC / ARM / eh-directive-save.s
1 @ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \
2 @ RUN:   | llvm-readobj -s -sd | FileCheck %s
3
4 @ Check the .save directive
5
6 @ The .save directive records the GPR registers which are pushed to the
7 @ stack.  There are 4 different unwind opcodes:
8 @
9 @     0xB100: pop r[3:0]
10 @     0xA0:   pop r[(4+x):4]            @ r[4+x]-r[4] must be consecutive.
11 @     0xA8:   pop r14, r[(4+x):4]       @ r[4+x]-r[4] must be consecutive.
12 @     0x8000: pop r[15:4]
13 @
14 @ If register list specifed by .save directive is possible to be encoded
15 @ by 0xA0 or 0xA8, then the assembler should prefer them over 0x8000.
16
17
18         .syntax unified
19
20 @-------------------------------------------------------------------------------
21 @ TEST1
22 @-------------------------------------------------------------------------------
23         .section        .TEST1
24         .globl  func1a
25         .align  2
26         .type   func1a,%function
27         .fnstart
28 func1a:
29         .save   {r0}
30         push    {r0}
31         pop     {r0}
32         bx      lr
33         .personality __gxx_personality_v0
34         .handlerdata
35         .fnend
36
37         .globl  func1b
38         .align  2
39         .type   func1b,%function
40         .fnstart
41 func1b:
42         .save   {r0, r1}
43         push    {r0, r1}
44         pop     {r0, r1}
45         bx      lr
46         .personality __gxx_personality_v0
47         .handlerdata
48         .fnend
49
50         .globl  func1c
51         .align  2
52         .type   func1c,%function
53         .fnstart
54 func1c:
55         .save   {r0, r2}
56         push    {r0, r2}
57         pop     {r0, r2}
58         bx      lr
59         .personality __gxx_personality_v0
60         .handlerdata
61         .fnend
62
63         .globl  func1d
64         .align  2
65         .type   func1d,%function
66         .fnstart
67 func1d:
68         .save   {r1, r2}
69         push    {r1, r2}
70         pop     {r1, r2}
71         bx      lr
72         .personality __gxx_personality_v0
73         .handlerdata
74         .fnend
75
76         .globl  func1e
77         .align  2
78         .type   func1e,%function
79         .fnstart
80 func1e:
81         .save   {r0, r1, r2, r3}
82         push    {r0, r1, r2, r3}
83         pop     {r0, r1, r2, r3}
84         bx      lr
85         .personality __gxx_personality_v0
86         .handlerdata
87         .fnend
88
89 @-------------------------------------------------------------------------------
90 @ The assembler should emit 0xB000 unwind opcode.
91 @-------------------------------------------------------------------------------
92 @ CHECK: Section {
93 @ CHECK:   Name: .ARM.extab.TEST1
94 @ CHECK:   SectionData (
95 @ CHECK:     0000: 00000000 B001B100 00000000 B003B100  |................|
96 @ CHECK:     0010: 00000000 B005B100 00000000 B006B100  |................|
97 @ CHECK:     0020: 00000000 B00FB100                    |........|
98 @ CHECK:   )
99 @ CHECK: }
100
101
102
103 @-------------------------------------------------------------------------------
104 @ TEST2
105 @-------------------------------------------------------------------------------
106         .section        .TEST2
107         .globl  func2a
108         .align  2
109         .type   func2a,%function
110         .fnstart
111 func2a:
112         .save   {r4}
113         push    {r4}
114         pop     {r4}
115         bx      lr
116         .personality __gxx_personality_v0
117         .handlerdata
118         .fnend
119
120         .globl  func2b
121         .align  2
122         .type   func2b,%function
123         .fnstart
124 func2b:
125         .save   {r4, r5}
126         push    {r4, r5}
127         pop     {r4, r5}
128         bx      lr
129         .personality __gxx_personality_v0
130         .handlerdata
131         .fnend
132
133         .globl  func2c
134         .align  2
135         .type   func2c,%function
136         .fnstart
137 func2c:
138         .save   {r4, r5, r6, r7, r8, r9, r10, r11}
139         push    {r4, r5, r6, r7, r8, r9, r10, r11}
140         pop     {r4, r5, r6, r7, r8, r9, r10, r11}
141         bx      lr
142         .personality __gxx_personality_v0
143         .handlerdata
144         .fnend
145
146 @-------------------------------------------------------------------------------
147 @ The assembler should emit 0xA0 unwind opcode.
148 @-------------------------------------------------------------------------------
149 @ CHECK: Section {
150 @ CHECK:   Name: .ARM.extab.TEST2
151 @ CHECK:   SectionData (
152 @ CHECK:     0000: 00000000 B0B0A000 00000000 B0B0A100  |................|
153 @ CHECK:     0010: 00000000 B0B0A700                    |........|
154 @ CHECK:   )
155 @ CHECK: }
156
157
158
159 @-------------------------------------------------------------------------------
160 @ TEST3
161 @-------------------------------------------------------------------------------
162         .section        .TEST3
163         .globl  func3a
164         .align  2
165         .type   func3a,%function
166         .fnstart
167 func3a:
168         .save   {r4, r14}
169         push    {r4, r14}
170         pop     {r4, r14}
171         bx      lr
172         .personality __gxx_personality_v0
173         .handlerdata
174         .fnend
175
176         .globl  func3b
177         .align  2
178         .type   func3b,%function
179         .fnstart
180 func3b:
181         .save   {r4, r5, r14}
182         push    {r4, r5, r14}
183         pop     {r4, r5, r14}
184         bx      lr
185         .personality __gxx_personality_v0
186         .handlerdata
187         .fnend
188
189         .globl  func3c
190         .align  2
191         .type   func3c,%function
192         .fnstart
193 func3c:
194         .save   {r4, r5, r6, r7, r8, r9, r10, r11, r14}
195         push    {r4, r5, r6, r7, r8, r9, r10, r11, r14}
196         pop     {r4, r5, r6, r7, r8, r9, r10, r11, r14}
197         bx      lr
198         .personality __gxx_personality_v0
199         .handlerdata
200         .fnend
201
202 @-------------------------------------------------------------------------------
203 @ The assembler should emit 0xA8 unwind opcode.
204 @-------------------------------------------------------------------------------
205 @ CHECK: Section {
206 @ CHECK:   Name: .ARM.extab.TEST3
207 @ CHECK:   SectionData (
208 @ CHECK:     0000: 00000000 B0B0A800 00000000 B0B0A900  |................|
209 @ CHECK:     0010: 00000000 B0B0AF00                    |........|
210 @ CHECK:   )
211 @ CHECK: }
212
213
214
215 @-------------------------------------------------------------------------------
216 @ TEST4
217 @-------------------------------------------------------------------------------
218         .section        .TEST4
219         .globl  func4a
220         .align  2
221         .type   func4a,%function
222         .fnstart
223 func4a:
224         .save   {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
225         push    {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
226         pop     {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
227         bx      lr
228         .personality __gxx_personality_v0
229         .handlerdata
230         .fnend
231
232         .globl  func4b
233         .align  2
234         .type   func4b,%function
235         .fnstart
236 func4b:
237         @ Note: r7 is missing intentionally.
238         .save   {r4, r5, r6, r8, r9, r10, r11}
239         push    {r4, r5, r6, r8, r9, r10, r11}
240         pop     {r4, r5, r6, r8, r9, r10, r11}
241         bx      lr
242         .personality __gxx_personality_v0
243         .handlerdata
244         .fnend
245
246         .globl  func4c
247         .align  2
248         .type   func4c,%function
249         .fnstart
250 func4c:
251         @ Note: r7 is missing intentionally.
252         .save   {r4, r5, r6, r8, r9, r10, r11, r14}
253         push    {r4, r5, r6, r8, r9, r10, r11, r14}
254         pop     {r4, r5, r6, r8, r9, r10, r11, r14}
255         bx      lr
256         .personality __gxx_personality_v0
257         .handlerdata
258         .fnend
259
260         .globl  func4d
261         .align  2
262         .type   func4d,%function
263         .fnstart
264 func4d:
265         @ Note: The register list is not start with r4.
266         .save   {r5, r6, r7}
267         push    {r5, r6, r7}
268         pop     {r5, r6, r7}
269         bx      lr
270         .personality __gxx_personality_v0
271         .handlerdata
272         .fnend
273
274         .globl  func4e
275         .align  2
276         .type   func4e,%function
277         .fnstart
278 func4e:
279         @ Note: The register list is not start with r4.
280         .save   {r5, r6, r7, r14}
281         push    {r5, r6, r7, r14}
282         pop     {r5, r6, r7, r14}
283         bx      lr
284         .personality __gxx_personality_v0
285         .handlerdata
286         .fnend
287
288 @-------------------------------------------------------------------------------
289 @ The assembler should emit 0x8000 unwind opcode.
290 @-------------------------------------------------------------------------------
291 @ CHECK: Section {
292 @ CHECK:   Name: .ARM.extab.TEST4
293 @ CHECK:   SectionData (
294 @ CHECK:     0000: 00000000 B0FF8500 00000000 B0F78000  |................|
295 @ CHECK:     0010: 00000000 B0F78400 00000000 B00E8000  |................|
296 @ CHECK:     0020: 00000000 B00E8400                    |........|
297 @ CHECK:   )
298 @ CHECK: }
299
300
301
302 @-------------------------------------------------------------------------------
303 @ TEST5
304 @-------------------------------------------------------------------------------
305         .section        .TEST5
306         .globl  func5a
307         .align  2
308         .type   func5a,%function
309         .fnstart
310 func5a:
311         .save   {r0, r1, r2, r3, r4, r5, r6}
312         push    {r0, r1, r2, r3, r4, r5, r6}
313         pop     {r0, r1, r2, r3, r4, r5, r6}
314         bx      lr
315         .personality __gxx_personality_v0
316         .handlerdata
317         .fnend
318
319         .globl  func5b
320         .align  2
321         .type   func5b,%function
322         .fnstart
323 func5b:
324         .save   {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
325         push    {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
326         pop     {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
327         bx      lr
328         .personality __gxx_personality_v0
329         .handlerdata
330         .fnend
331
332 @-------------------------------------------------------------------------------
333 @ Check the order of unwind opcode to pop registers.
334 @ 0xB10F "pop {r0-r3}" should be emitted before 0xA2 "pop {r4-r6}".
335 @ 0xB10F "pop {r0-r3}" should be emitted before 0x85FF "pop {r4-r12, r14}".
336 @-------------------------------------------------------------------------------
337 @ CHECK: Section {
338 @ CHECK:   Name: .ARM.extab.TEST5
339 @ CHECK:   SectionData (
340 @ CHECK:     0000: 00000000 A20FB100 00000000 850FB101  |................|
341 @ CHECK:     0010: B0B0B0FF                             |....|
342 @ CHECK:   )
343 @ CHECK: }