Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / lld / test / MachO / arm64-thunks.s
blob0e4157ece72de244106a36c70f0bc8142bf20034
1 # REQUIRES: aarch64
3 ## Check for the following:
4 ## (1) address match between thunk definitions and call destinations
5 ## (2) address match between thunk page+offset computations and function
6 ## definitions
7 ## (3) a second thunk is created when the first one goes out of range
8 ## (4) early calls to a dylib stub use a thunk, and later calls the stub
9 ## directly
10 ## Notes:
11 ## 0x4000000 = 64 Mi = half the magnitude of the forward-branch range
13 # RUN: rm -rf %t; mkdir %t
14 # RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %s -o %t/input.o
15 # RUN: %lld -arch arm64 -dead_strip -lSystem -o %t/thunk %t/input.o
16 # RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn %t/thunk | FileCheck %s
18 # CHECK: Disassembly of section __TEXT,__text:
20 # CHECK: [[#%.13x, A_PAGE:]][[#%.3x, A_OFFSET:]] <_a>:
21 # CHECK: bl 0x[[#%x, A:]] <_a>
22 # CHECK: bl 0x[[#%x, B:]] <_b>
23 # CHECK: bl 0x[[#%x, C:]] <_c>
24 # CHECK: bl 0x[[#%x, D_THUNK_0:]] <_d.thunk.0>
25 # CHECK: bl 0x[[#%x, E_THUNK_0:]] <_e.thunk.0>
26 # CHECK: bl 0x[[#%x, F_THUNK_0:]] <_f.thunk.0>
27 # CHECK: bl 0x[[#%x, G_THUNK_0:]] <_g.thunk.0>
28 # CHECK: bl 0x[[#%x, H_THUNK_0:]] <_h.thunk.0>
29 # CHECK: bl 0x[[#%x, NAN_THUNK_0:]] <___nan.thunk.0>
31 # CHECK: [[#%.13x, B_PAGE:]][[#%.3x, B_OFFSET:]] <_b>:
32 # CHECK: bl 0x[[#%x, A]] <_a>
33 # CHECK: bl 0x[[#%x, B]] <_b>
34 # CHECK: bl 0x[[#%x, C]] <_c>
35 # CHECK: bl 0x[[#%x, D_THUNK_0]] <_d.thunk.0>
36 # CHECK: bl 0x[[#%x, E_THUNK_0]] <_e.thunk.0>
37 # CHECK: bl 0x[[#%x, F_THUNK_0]] <_f.thunk.0>
38 # CHECK: bl 0x[[#%x, G_THUNK_0]] <_g.thunk.0>
39 # CHECK: bl 0x[[#%x, H_THUNK_0]] <_h.thunk.0>
40 # CHECK: bl 0x[[#%x, NAN_THUNK_0]] <___nan.thunk.0>
42 # CHECK: [[#%.13x, C_PAGE:]][[#%.3x, C_OFFSET:]] <_c>:
43 # CHECK: bl 0x[[#%x, A]] <_a>
44 # CHECK: bl 0x[[#%x, B]] <_b>
45 # CHECK: bl 0x[[#%x, C]] <_c>
46 # CHECK: bl 0x[[#%x, D:]] <_d>
47 # CHECK: bl 0x[[#%x, E:]] <_e>
48 # CHECK: bl 0x[[#%x, F_THUNK_0]] <_f.thunk.0>
49 # CHECK: bl 0x[[#%x, G_THUNK_0]] <_g.thunk.0>
50 # CHECK: bl 0x[[#%x, H_THUNK_0]] <_h.thunk.0>
51 # CHECK: bl 0x[[#%x, NAN_THUNK_0]] <___nan.thunk.0>
53 # CHECK: [[#%x, D_THUNK_0]] <_d.thunk.0>:
54 # CHECK: adrp x16, 0x[[#%x, D_PAGE:]]
55 # CHECK: add x16, x16, #[[#D_OFFSET:]]
57 # CHECK: [[#%x, E_THUNK_0]] <_e.thunk.0>:
58 # CHECK: adrp x16, 0x[[#%x, E_PAGE:]]
59 # CHECK: add x16, x16, #[[#E_OFFSET:]]
61 # CHECK: [[#%x, F_THUNK_0]] <_f.thunk.0>:
62 # CHECK: adrp x16, 0x[[#%x, F_PAGE:]]
63 # CHECK: add x16, x16, #[[#F_OFFSET:]]
65 # CHECK: [[#%x, G_THUNK_0]] <_g.thunk.0>:
66 # CHECK: adrp x16, 0x[[#%x, G_PAGE:]]
67 # CHECK: add x16, x16, #[[#G_OFFSET:]]
69 # CHECK: [[#%x, H_THUNK_0]] <_h.thunk.0>:
70 # CHECK: adrp x16, 0x[[#%x, H_PAGE:]]
71 # CHECK: add x16, x16, #[[#H_OFFSET:]]
73 # CHECK: [[#%x, NAN_THUNK_0]] <___nan.thunk.0>:
74 # CHECK: adrp x16, 0x[[#%x, NAN_PAGE:]]
75 # CHECK: add x16, x16, #[[#NAN_OFFSET:]]
77 # CHECK: [[#%x, D_PAGE + D_OFFSET]] <_d>:
78 # CHECK: bl 0x[[#%x, A]] <_a>
79 # CHECK: bl 0x[[#%x, B]] <_b>
80 # CHECK: bl 0x[[#%x, C]] <_c>
81 # CHECK: bl 0x[[#%x, D]] <_d>
82 # CHECK: bl 0x[[#%x, E]] <_e>
83 # CHECK: bl 0x[[#%x, F_THUNK_0]] <_f.thunk.0>
84 # CHECK: bl 0x[[#%x, G_THUNK_0]] <_g.thunk.0>
85 # CHECK: bl 0x[[#%x, H_THUNK_0]] <_h.thunk.0>
86 # CHECK: bl 0x[[#%x, NAN_THUNK_0]] <___nan.thunk.0>
88 # CHECK: [[#%x, E_PAGE + E_OFFSET]] <_e>:
89 # CHECK: bl 0x[[#%x, A_THUNK_0:]] <_a.thunk.0>
90 # CHECK: bl 0x[[#%x, B_THUNK_0:]] <_b.thunk.0>
91 # CHECK: bl 0x[[#%x, C]] <_c>
92 # CHECK: bl 0x[[#%x, D]] <_d>
93 # CHECK: bl 0x[[#%x, E]] <_e>
94 # CHECK: bl 0x[[#%x, F:]] <_f>
95 # CHECK: bl 0x[[#%x, G:]] <_g>
96 # CHECK: bl 0x[[#%x, H_THUNK_0]] <_h.thunk.0>
97 # CHECK: bl 0x[[#%x, NAN_THUNK_0]] <___nan.thunk.0>
99 # CHECK: [[#%x, F_PAGE + F_OFFSET]] <_f>:
100 # CHECK: bl 0x[[#%x, A_THUNK_0]] <_a.thunk.0>
101 # CHECK: bl 0x[[#%x, B_THUNK_0]] <_b.thunk.0>
102 # CHECK: bl 0x[[#%x, C]] <_c>
103 # CHECK: bl 0x[[#%x, D]] <_d>
104 # CHECK: bl 0x[[#%x, E]] <_e>
105 # CHECK: bl 0x[[#%x, F]] <_f>
106 # CHECK: bl 0x[[#%x, G]] <_g>
107 # CHECK: bl 0x[[#%x, H_THUNK_0]] <_h.thunk.0>
108 # CHECK: bl 0x[[#%x, NAN_THUNK_0]] <___nan.thunk.0>
110 # CHECK: [[#%x, G_PAGE + G_OFFSET]] <_g>:
111 # CHECK: bl 0x[[#%x, A_THUNK_0]] <_a.thunk.0>
112 # CHECK: bl 0x[[#%x, B_THUNK_0]] <_b.thunk.0>
113 # CHECK: bl 0x[[#%x, C_THUNK_0:]] <_c.thunk.0>
114 # CHECK: bl 0x[[#%x, D_THUNK_1:]] <_d.thunk.1>
115 # CHECK: bl 0x[[#%x, E]] <_e>
116 # CHECK: bl 0x[[#%x, F]] <_f>
117 # CHECK: bl 0x[[#%x, G]] <_g>
118 # CHECK: bl 0x[[#%x, H:]] <_h>
119 # CHECK: bl 0x[[#%x, STUBS:]]
121 # CHECK: [[#%x, A_THUNK_0]] <_a.thunk.0>:
122 # CHECK: adrp x16, 0x[[#%x, A_PAGE]]000
123 # CHECK: add x16, x16, #[[#%d, A_OFFSET]]
125 # CHECK: [[#%x, B_THUNK_0]] <_b.thunk.0>:
126 # CHECK: adrp x16, 0x[[#%x, B_PAGE]]000
127 # CHECK: add x16, x16, #[[#%d, B_OFFSET]]
129 # CHECK: [[#%x, H_PAGE + H_OFFSET]] <_h>:
130 # CHECK: bl 0x[[#%x, A_THUNK_0]] <_a.thunk.0>
131 # CHECK: bl 0x[[#%x, B_THUNK_0]] <_b.thunk.0>
132 # CHECK: bl 0x[[#%x, C_THUNK_0]] <_c.thunk.0>
133 # CHECK: bl 0x[[#%x, D_THUNK_1]] <_d.thunk.1>
134 # CHECK: bl 0x[[#%x, E]] <_e>
135 # CHECK: bl 0x[[#%x, F]] <_f>
136 # CHECK: bl 0x[[#%x, G]] <_g>
137 # CHECK: bl 0x[[#%x, H]] <_h>
138 # CHECK: bl 0x[[#%x, STUBS]]
140 # CHECK: <_main>:
141 # CHECK: bl 0x[[#%x, A_THUNK_0]] <_a.thunk.0>
142 # CHECK: bl 0x[[#%x, B_THUNK_0]] <_b.thunk.0>
143 # CHECK: bl 0x[[#%x, C_THUNK_0]] <_c.thunk.0>
144 # CHECK: bl 0x[[#%x, D_THUNK_1]] <_d.thunk.1>
145 # CHECK: bl 0x[[#%x, E_THUNK_1:]] <_e.thunk.1>
146 # CHECK: bl 0x[[#%x, F_THUNK_1:]] <_f.thunk.1>
147 # CHECK: bl 0x[[#%x, G]] <_g>
148 # CHECK: bl 0x[[#%x, H]] <_h>
149 # CHECK: bl 0x[[#%x, STUBS]]
151 # CHECK: [[#%x, C_THUNK_0]] <_c.thunk.0>:
152 # CHECK: adrp x16, 0x[[#%x, C_PAGE]]000
153 # CHECK: add x16, x16, #[[#%d, C_OFFSET]]
155 # CHECK: [[#%x, D_THUNK_1]] <_d.thunk.1>:
156 # CHECK: adrp x16, 0x[[#%x, D_PAGE]]
157 # CHECK: add x16, x16, #[[#D_OFFSET]]
159 # CHECK: [[#%x, E_THUNK_1]] <_e.thunk.1>:
160 # CHECK: adrp x16, 0x[[#%x, E_PAGE]]
161 # CHECK: add x16, x16, #[[#E_OFFSET]]
163 # CHECK: [[#%x, F_THUNK_1]] <_f.thunk.1>:
164 # CHECK: adrp x16, 0x[[#%x, F_PAGE]]
165 # CHECK: add x16, x16, #[[#F_OFFSET]]
167 # CHECK: Disassembly of section __TEXT,__stubs:
169 # CHECK: [[#%x, NAN_PAGE + NAN_OFFSET]] <__stubs>:
171 .subsections_via_symbols
172 .text
174 .globl _a
175 .p2align 2
177 bl _a
178 bl _b
179 bl _c
180 bl _d
181 bl _e
182 bl _f
183 bl _g
184 bl _h
185 bl ___nan
188 .globl _b
189 .p2align 2
191 bl _a
192 bl _b
193 bl _c
194 bl _d
195 bl _e
196 bl _f
197 bl _g
198 bl _h
199 bl ___nan
200 .space 0x4000000-0x3c
203 .globl _c
204 .p2align 2
206 bl _a
207 bl _b
208 bl _c
209 bl _d
210 bl _e
211 bl _f
212 bl _g
213 bl _h
214 bl ___nan
217 .globl _d
218 .p2align 2
220 bl _a
221 bl _b
222 bl _c
223 bl _d
224 bl _e
225 bl _f
226 bl _g
227 bl _h
228 bl ___nan
229 .space 0x4000000-0x38
232 .globl _e
233 .p2align 2
235 bl _a
236 bl _b
237 bl _c
238 bl _d
239 bl _e
240 bl _f
241 bl _g
242 bl _h
243 bl ___nan
246 .globl _f
247 .p2align 2
249 bl _a
250 bl _b
251 bl _c
252 bl _d
253 bl _e
254 bl _f
255 bl _g
256 bl _h
257 bl ___nan
258 .space 0x4000000-0x34
261 .globl _g
262 .p2align 2
264 bl _a
265 bl _b
266 bl _c
267 bl _d
268 bl _e
269 bl _f
270 bl _g
271 bl _h
272 bl ___nan
275 .globl _h
276 .p2align 2
278 bl _a
279 bl _b
280 bl _c
281 bl _d
282 bl _e
283 bl _f
284 bl _g
285 bl _h
286 bl ___nan
287 .space 0x4000000-0x30
290 .globl _main
291 .p2align 2
292 _main:
293 bl _a
294 bl _b
295 bl _c
296 bl _d
297 bl _e
298 bl _f
299 bl _g
300 bl _h
301 bl ___nan