xref: /llvm-project/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s (revision 63eb7ff47de5df48b6bc0cf0a6d3d17022634151)
1@ RUN: llvm-mc -triple armv7-linux-eabi -filetype obj %s -o %t
2@ RUN: llvm-readobj -u %t | FileCheck --check-prefixes=CHECK,SYM %s
3
4@@ If .symtab doesn't exist, we can still dump some information.
5@ RUN: llvm-objcopy --allow-broken-links --strip-all %t - | llvm-readobj -u - | FileCheck %s
6
7	.syntax unified
8
9	.cpu cortex-a8
10	.fpu neon
11
12	.section .personality
13
14	.type __personality,%function
15__personality:
16	.fnstart
17	bkpt
18	.fnend
19
20
21	.section .personality0
22
23	.type personality0,%function
24personality0:
25	.fnstart
26	bx lr
27	.fnend
28
29
30	.section .personality1
31
32	.type personality1,%function
33personality1:
34	.fnstart
35	.pad #0x100
36	sub sp, sp, #0x100
37	.save {r0-r11}
38	push {r0-r11}
39	pop {r0-r11}
40	add sp, sp, #0x100
41	bx lr
42	.fnend
43
44
45	.section .custom_personality
46
47	.type custom_personality,%function
48custom_personality:
49	.fnstart
50	.personality __personality
51	bx lr
52	.fnend
53
54
55	.section .opcodes
56
57	.type opcodes,%function
58opcodes:
59	.fnstart
60	.vsave {d8-d12}
61	vpush {d8-d12}
62	vpop {d8-d12}
63	bx lr
64	.fnend
65
66
67	.section .multiple
68
69	.type function0,%function
70function0:
71	.fnstart
72	bx lr
73	.fnend
74
75	.type function1,%function
76function1:
77	.fnstart
78	.personality __personality
79	bx lr
80	.fnend
81
82	.type function2,%function
83function2:
84	.fnstart
85	bx lr
86	.fnend
87
88	.section .raw
89
90	.type raw,%function
91	.thumb_func
92raw:
93	.fnstart
94	.unwind_raw 12, 0x02
95	.unwind_raw -12, 0x42
96	.unwind_raw 0, 0x80, 0x00
97	.unwind_raw 4, 0x81, 0x00
98	.unwind_raw 4, 0x80, 0x01
99	.unwind_raw 8, 0x80, 0xc0
100	.unwind_raw 12, 0x84, 0xc0
101	.unwind_raw 0, 0x91
102	.unwind_raw 8, 0xa1
103	.unwind_raw 12, 0xa9
104	.unwind_raw 0, 0xb0
105	.unwind_raw 4, 0xb4
106	.unwind_raw 4, 0xb1, 0x01
107	.unwind_raw 0xa04, 0xb2, 0x80, 0x04
108	.unwind_raw 24, 0xb3, 0x12
109	.unwind_raw 24, 0xba
110	.unwind_raw 24, 0xc2
111	.unwind_raw 24, 0xc6, 0x02
112	.unwind_raw 8, 0xc7, 0x03
113	.unwind_raw 24, 0xc8, 0x02
114	.unwind_raw 24, 0xc9, 0x02
115	.unwind_raw 64, 0xd7
116	.fnend
117
118	.section .spare
119
120	.type spare,%function
121spare:
122	.fnstart
123	.unwind_raw 4, 0x00
124	.unwind_raw -4, 0x40
125	.unwind_raw 0, 0x80, 0x00
126	.unwind_raw 4, 0x88, 0x00
127	.unwind_raw 0, 0x91
128	.unwind_raw 0, 0x9d
129	.unwind_raw 0, 0x9f
130	.unwind_raw 0, 0xa0
131	.unwind_raw 0, 0xa8
132	.unwind_raw 0, 0xb0
133	.unwind_raw 4, 0xb1, 0x01
134	.unwind_raw 0, 0xb1, 0x10
135	.unwind_raw 0x204, 0xb2, 0x00
136	.unwind_raw 16, 0xb3, 0x00
137	.unwind_raw 16, 0xb8
138	.unwind_raw 4, 0xc0
139	.unwind_raw 4, 0xc6, 0x00
140	.unwind_raw 4, 0xc7, 0x00
141	.unwind_raw 4, 0xc7, 0x01
142	.unwind_raw 0, 0xc7, 0x10
143	.unwind_raw 16, 0xc8, 0x00
144	.unwind_raw 16, 0xc9, 0x00
145	.unwind_raw 0, 0xca
146	.unwind_raw 16, 0xd0
147	.unwind_raw 0, 0xd8
148	.fnend
149
150@ CHECK: UnwindInformation {
151@ CHECK:   UnwindIndexTable {
152@ CHECK:     SectionName: .ARM.exidx.personality
153@ CHECK:     Entries [
154@ CHECK:       Entry {
155@ CHECK:         FunctionAddress: 0x0
156@ SYM:           FunctionName: __personality
157@ CHECK:         Model: Compact (Inline)
158@ CHECK:         PersonalityIndex: 0
159@ CHECK:         Opcodes [
160@ CHECK:           0xB0       ; finish
161@ CHECK:           0xB0       ; finish
162@ CHECK:           0xB0       ; finish
163@ CHECK:         ]
164@ CHECK:       }
165@ CHECK:     ]
166@ CHECK:   }
167@ CHECK:   UnwindIndexTable {
168@ CHECK:     SectionName: .ARM.exidx.personality0
169@ CHECK:     Entries [
170@ CHECK:       Entry {
171@ CHECK:         FunctionAddress: 0x0
172@ SYM:           FunctionName: personality0
173@ CHECK:         Model: Compact (Inline)
174@ CHECK:         PersonalityIndex: 0
175@ CHECK:         Opcodes [
176@ CHECK:           0xB0       ; finish
177@ CHECK:           0xB0       ; finish
178@ CHECK:           0xB0       ; finish
179@ CHECK:         ]
180@ CHECK:       }
181@ CHECK:     ]
182@ CHECK:   }
183@ CHECK:   UnwindIndexTable {
184@ CHECK:     SectionName: .ARM.exidx.personality1
185@ CHECK:     Entries [
186@ CHECK:       Entry {
187@ CHECK:         FunctionAddress: 0x0
188@ SYM:           FunctionName: personality1
189@ SYM:           ExceptionHandlingTable: .ARM.extab.personality1
190@ SYM:           TableEntryOffset: 0x0
191@ SYM:           Model: Compact
192@ SYM:           PersonalityIndex: 1
193@ SYM:           Opcodes [
194@ SYM:             0xB1 0x0F ; pop {r0, r1, r2, r3}
195@ SYM:             0xA7      ; pop {r4, r5, r6, r7, r8, r9, r10, fp}
196@ SYM:             0x3F      ; vsp = vsp + 256
197@ SYM:             0xB0      ; finish
198@ SYM:             0xB0      ; finish
199@ SYM:           ]
200@ CHECK:       }
201@ CHECK:     ]
202@ CHECK:   }
203@ CHECK:   UnwindIndexTable {
204@ CHECK:     SectionName: .ARM.exidx.custom_personality
205@ CHECK:     Entries [
206@ CHECK:       Entry {
207@ CHECK:         FunctionAddress: 0x0
208@ SYM:           FunctionName: custom_personality
209@ SYM:           ExceptionHandlingTable: .ARM.extab.custom_personality
210@ SYM:           TableEntryOffset: 0x0
211@ SYM:           Model: Generic
212@ SYM:           PersonalityRoutineAddress: 0x0
213@ CHECK:       }
214@ CHECK:     ]
215@ CHECK:   }
216@ CHECK:   UnwindIndexTable {
217@ CHECK:     SectionName: .ARM.exidx.opcodes
218@ CHECK:     Entries [
219@ CHECK:       Entry {
220@ CHECK:         FunctionAddress: 0x0
221@ SYM:           FunctionName: opcodes
222@ CHECK:         Model: Compact (Inline)
223@ CHECK:         PersonalityIndex: 0
224@ CHECK:         Opcodes [
225@ CHECK:           0xC9 0x84 ; pop {d8, d9, d10, d11, d12}
226@ CHECK:           0xB0      ; finish
227@ CHECK:         ]
228@ CHECK:       }
229@ CHECK:     ]
230@ CHECK:   }
231@ CHECK:   UnwindIndexTable {
232@ CHECK:     SectionName: .ARM.exidx.multiple
233@ CHECK:     Entries [
234@ CHECK:       Entry {
235@ CHECK:         FunctionAddress: 0x0
236@ SYM:           FunctionName: function0
237@ CHECK:         Model: Compact (Inline)
238@ CHECK:         PersonalityIndex: 0
239@ CHECK:         Opcodes [
240@ CHECK:           0xB0     ; finish
241@ CHECK:           0xB0     ; finish
242@ CHECK:           0xB0     ; finish
243@ CHECK:         ]
244@ CHECK:       }
245@ CHECK:       Entry {
246@ CHECK:         FunctionAddress: 0x4
247@ SYM:           FunctionName: function1
248@ SYM:           ExceptionHandlingTable: .ARM.extab.multiple
249@ SYM:           Model: Generic
250@ SYM:           PersonalityRoutineAddress: 0x0
251@ CHECK:       }
252@ CHECK:       Entry {
253@ CHECK:         FunctionAddress: 0x8
254@ SYM:           FunctionName: function2
255@ CHECK:         Model: Compact (Inline)
256@ CHECK:         PersonalityIndex: 0
257@ CHECK:         Opcodes [
258@ CHECK:           0xB0     ; finish
259@ CHECK:           0xB0     ; finish
260@ CHECK:           0xB0     ; finish
261@ CHECK:         ]
262@ CHECK:       }
263@ CHECK:     ]
264@ CHECK:   }
265@ CHECK:   UnwindIndexTable {
266@ CHECK:     SectionName: .ARM.exidx.raw
267@ CHECK:     Entries [
268@ SYM:         Opcodes [
269@ SYM:           0xD7      ; pop {d8, d9, d10, d11, d12, d13, d14, d15}
270@ SYM:           0xC9 0x02 ; pop {d0, d1, d2}
271@ SYM:           0xC8 0x02 ; pop {d16, d17, d18}
272@ SYM:           0xC7 0x03 ; pop {wCGR0, wCGR1}
273@ SYM:           0xC6 0x02 ; pop {wR0, wR1, wR2}
274@ SYM:           0xC2      ; pop {wR10, wR11, wR12}
275@ SYM:           0xBA      ; pop {d8, d9, d10}
276@ SYM:           0xB3 0x12 ; pop {d1, d2, d3}
277@ SYM:           0xB2 0x80 0x04 ; vsp = vsp + 2564
278@ SYM:           0xB1 0x01 ; pop {r0}
279@ SYM:           0xB4      ; pop ra_auth_code
280@ SYM:           0xB0      ; finish
281@ SYM:           0xA9      ; pop {r4, r5, lr}
282@ SYM:           0xA1      ; pop {r4, r5}
283@ SYM:           0x91      ; vsp = r1
284@ SYM:           0x84 0xC0 ; pop {r10, fp, lr}
285@ SYM:           0x80 0xC0 ; pop {r10, fp}
286@ SYM:           0x80 0x01 ; pop {r4}
287@ SYM:           0x81 0x00 ; pop {ip}
288@ SYM:           0x80 0x00 ; refuse to unwind
289@ SYM:           0x42      ; vsp = vsp - 12
290@ SYM:           0x02      ; vsp = vsp + 12
291@ SYM:         ]
292@ CHECK:     ]
293@ CHECK:   }
294@ CHECK:   UnwindIndexTable {
295@ CHECK:     SectionName: .ARM.exidx.spare
296@ CHECK:     Entries [
297@ SYM:         Opcodes [
298@ SYM:           0xD8      ; spare
299@ SYM:           0xD0      ; pop {d8}
300@ SYM:           0xCA      ; spare
301@ SYM:           0xC9 0x00 ; pop {d0}
302@ SYM:           0xC8 0x00 ; pop {d16}
303@ SYM:           0xC7 0x10 ; spare
304@ SYM:           0xC7 0x01 ; pop {wCGR0}
305@ SYM:           0xC7 0x00 ; spare
306@ SYM:           0xC6 0x00 ; pop {wR0}
307@ SYM:           0xC0      ; pop {wR10}
308@ SYM:           0xB8      ; pop {d8}
309@ SYM:           0xB3 0x00 ; pop {d0}
310@ SYM:           0xB2 0x00 ; vsp = vsp + 516
311@ SYM:           0xB1 0x10 ; spare
312@ SYM:           0xB1 0x01 ; pop {r0}
313@ SYM:           0xB0      ; finish
314@ SYM:           0xA8      ; pop {r4, lr}
315@ SYM:           0xA0      ; pop {r4}
316@ SYM:           0x9F      ; reserved (WiMMX MOVrr)
317@ SYM:           0x9D      ; reserved (ARM MOVrr)
318@ SYM:           0x91      ; vsp = r1
319@ SYM:           0x88 0x00 ; pop {pc}
320@ SYM:           0x80 0x00 ; refuse to unwind
321@ SYM:           0x40      ; vsp = vsp - 4
322@ SYM:           0x00      ; vsp = vsp + 4
323@ SYM:         ]
324@ CHECK:     ]
325@ CHECK:   }
326@ CHECK: }
327
328