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