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 different stack pointer offsets.
5
6@ The .pad directive will track the stack pointer offsets.  There are several
7@ ways to encode the stack offsets.  We have to test:
8@
9@              offset <  0x00
10@              offset == 0x00
11@     0x04  <= offset <= 0x100
12@     0x104 <= offset <= 0x200
13@     0x204 <= offset
14
15
16	.syntax unified
17
18@-------------------------------------------------------------------------------
19@ TEST1
20@-------------------------------------------------------------------------------
21	.section	.TEST1
22	.globl	func1
23	.align	2
24	.type	func1,%function
25	.fnstart
26func1:
27	.pad	#0
28	sub	sp, sp, #0
29	add	sp, sp, #0
30	bx	lr
31	.personality __gxx_personality_v0
32	.handlerdata
33	.fnend
34
35@-------------------------------------------------------------------------------
36@ The assembler should emit nothing (will be filled up with finish opcode).
37@-------------------------------------------------------------------------------
38@ CHECK: Section {
39@ CHECK:   Name: .ARM.extab.TEST1
40@ CHECK:   SectionData (
41@ CHECK:     0000: 00000000 B0B0B000                    |........|
42@ CHECK:   )
43@ CHECK: }
44
45
46
47@-------------------------------------------------------------------------------
48@ TEST2
49@-------------------------------------------------------------------------------
50	.section	.TEST2
51	.globl	func2a
52	.align	2
53	.type	func2a,%function
54	.fnstart
55func2a:
56	.pad	#0x4
57	sub	sp, sp, #0x4
58	add	sp, sp, #0x4
59	bx	lr
60	.personality __gxx_personality_v0
61	.handlerdata
62	.fnend
63
64	.globl	func2b
65	.align	2
66	.type	func2b,%function
67	.fnstart
68func2b:
69	.pad	#0x100
70	sub	sp, sp, #0x100
71	add	sp, sp, #0x100
72	bx	lr
73	.personality __gxx_personality_v0
74	.handlerdata
75	.fnend
76
77@-------------------------------------------------------------------------------
78@ The assembler should emit ((offset - 4) >> 2).
79@-------------------------------------------------------------------------------
80@ CHECK: Section {
81@ CHECK:   Name: .ARM.extab.TEST2
82@ CHECK:   SectionData (
83@ CHECK:     0000: 00000000 B0B00000 00000000 B0B03F00  |..............?.|
84@ CHECK:   )
85@ CHECK: }
86
87
88@-------------------------------------------------------------------------------
89@ TEST3
90@-------------------------------------------------------------------------------
91	.section	.TEST3
92	.globl	func3a
93	.align	2
94	.type	func3a,%function
95	.fnstart
96func3a:
97	.pad	#0x104
98	sub	sp, sp, #0x104
99	add	sp, sp, #0x104
100	bx	lr
101	.personality __gxx_personality_v0
102	.handlerdata
103	.fnend
104
105	.globl	func3b
106	.align	2
107	.type	func3b,%function
108	.fnstart
109func3b:
110	.pad	#0x200
111	sub	sp, sp, #0x200
112	add	sp, sp, #0x200
113	bx	lr
114	.personality __gxx_personality_v0
115	.handlerdata
116	.fnend
117
118@-------------------------------------------------------------------------------
119@ The assembler should emit 0x3F and ((offset - 0x104) >> 2).
120@-------------------------------------------------------------------------------
121@ CHECK: Section {
122@ CHECK:   Name: .ARM.extab.TEST3
123@ CHECK:   SectionData (
124@ CHECK:     0000: 00000000 B03F0000 00000000 B03F3F00  |.....?.......??.|
125@ CHECK:   )
126@ CHECK: }
127
128
129
130@-------------------------------------------------------------------------------
131@ TEST4
132@-------------------------------------------------------------------------------
133	.section	.TEST4
134	.globl	func4a
135	.align	2
136	.type	func4a,%function
137	.fnstart
138func4a:
139	.pad	#0x204
140	sub	sp, sp, #0x204
141	add	sp, sp, #0x204
142	bx	lr
143	.personality __gxx_personality_v0
144	.handlerdata
145	.fnend
146
147	.globl	func4b
148	.align	2
149	.type	func4b,%function
150	.fnstart
151func4b:
152	.pad	#0x580
153	sub	sp, sp, #0x580
154	add	sp, sp, #0x580
155	bx	lr
156	.personality __gxx_personality_v0
157	.handlerdata
158	.fnend
159
160@-------------------------------------------------------------------------------
161@ The assembler should emit 0xB2 and the ULEB128 encoding of
162@ ((offset - 0x204) >> 2).
163@-------------------------------------------------------------------------------
164@ CHECK: Section {
165@ CHECK:   Name: .ARM.extab.TEST4
166@ CHECK:   SectionData (
167@ CHECK:     0000: 00000000 B000B200 00000000 01DFB200  |................|
168@ CHECK:   )
169@ CHECK: }
170
171
172
173@-------------------------------------------------------------------------------
174@ TEST5
175@-------------------------------------------------------------------------------
176	.section	.TEST5
177	.globl	func4a
178	.align	2
179	.type	func4a,%function
180	.fnstart
181func5a:
182	.pad	#-0x4
183	add	sp, sp, #0x4
184	sub	sp, sp, #0x4
185	bx	lr
186	.personality __gxx_personality_v0
187	.handlerdata
188	.fnend
189
190	.globl	func5b
191	.align	2
192	.type	func5b,%function
193	.fnstart
194func5b:
195	.pad	#-0x104
196	add	sp, sp, #0x104
197	sub	sp, sp, #0x4
198	bx	lr
199	.personality __gxx_personality_v0
200	.handlerdata
201	.fnend
202
203	.globl	func5c
204	.align	2
205	.type	func5c,%function
206	.fnstart
207func5c:
208	.pad	#-0x204
209	add	sp, sp, #0x204
210	sub	sp, sp, #0x4
211	bx	lr
212	.personality __gxx_personality_v0
213	.handlerdata
214	.fnend
215
216@-------------------------------------------------------------------------------
217@ The assembler should emit (0x40 | (-offset - 4)) >> 2.  When (-offset - 4)
218@ is greater than 0x3f, then multiple 0x7f should be emitted.
219@-------------------------------------------------------------------------------
220@ CHECK: Section {
221@ CHECK:   Name: .ARM.extab.TEST5
222@ CHECK:   SectionData (
223@ CHECK:     0000: 00000000 B0B04000 00000000 B07F4000  |......@.......@.|
224@ CHECK:     0010: 00000000 7F7F4000                    |......@.|
225@ CHECK:   )
226@ CHECK: }
227