llvm-project
302 строки · 6.9 Кб
1# REQUIRES: aarch64
2
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
12
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
17
18# CHECK: Disassembly of section __TEXT,__text:
19
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>
30
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>
41
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>
52
53# CHECK: [[#%x, D_THUNK_0]] <_d.thunk.0>:
54# CHECK: adrp x16, 0x[[#%x, D_PAGE:]]
55# CHECK: add x16, x16, #[[#D_OFFSET:]]
56
57# CHECK: [[#%x, E_THUNK_0]] <_e.thunk.0>:
58# CHECK: adrp x16, 0x[[#%x, E_PAGE:]]
59# CHECK: add x16, x16, #[[#E_OFFSET:]]
60
61# CHECK: [[#%x, F_THUNK_0]] <_f.thunk.0>:
62# CHECK: adrp x16, 0x[[#%x, F_PAGE:]]
63# CHECK: add x16, x16, #[[#F_OFFSET:]]
64
65# CHECK: [[#%x, G_THUNK_0]] <_g.thunk.0>:
66# CHECK: adrp x16, 0x[[#%x, G_PAGE:]]
67# CHECK: add x16, x16, #[[#G_OFFSET:]]
68
69# CHECK: [[#%x, H_THUNK_0]] <_h.thunk.0>:
70# CHECK: adrp x16, 0x[[#%x, H_PAGE:]]
71# CHECK: add x16, x16, #[[#H_OFFSET:]]
72
73# CHECK: [[#%x, NAN_THUNK_0]] <___nan.thunk.0>:
74# CHECK: adrp x16, 0x[[#%x, NAN_PAGE:]]
75# CHECK: add x16, x16, #[[#NAN_OFFSET:]]
76
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>
87
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>
98
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>
109
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:]]
120
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]]
124
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]]
128
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]]
139
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]]
150
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]]
154
155# CHECK: [[#%x, D_THUNK_1]] <_d.thunk.1>:
156# CHECK: adrp x16, 0x[[#%x, D_PAGE]]
157# CHECK: add x16, x16, #[[#D_OFFSET]]
158
159# CHECK: [[#%x, E_THUNK_1]] <_e.thunk.1>:
160# CHECK: adrp x16, 0x[[#%x, E_PAGE]]
161# CHECK: add x16, x16, #[[#E_OFFSET]]
162
163# CHECK: [[#%x, F_THUNK_1]] <_f.thunk.1>:
164# CHECK: adrp x16, 0x[[#%x, F_PAGE]]
165# CHECK: add x16, x16, #[[#F_OFFSET]]
166
167# CHECK: Disassembly of section __TEXT,__stubs:
168
169# CHECK: [[#%x, NAN_PAGE + NAN_OFFSET]] <__stubs>:
170
171.subsections_via_symbols
172.text
173
174.globl _a
175.p2align 2
176_a:
177bl _a
178bl _b
179bl _c
180bl _d
181bl _e
182bl _f
183bl _g
184bl _h
185bl ___nan
186ret
187
188.globl _b
189.p2align 2
190_b:
191bl _a
192bl _b
193bl _c
194bl _d
195bl _e
196bl _f
197bl _g
198bl _h
199bl ___nan
200.space 0x4000000-0x3c
201ret
202
203.globl _c
204.p2align 2
205_c:
206bl _a
207bl _b
208bl _c
209bl _d
210bl _e
211bl _f
212bl _g
213bl _h
214bl ___nan
215ret
216
217.globl _d
218.p2align 2
219_d:
220bl _a
221bl _b
222bl _c
223bl _d
224bl _e
225bl _f
226bl _g
227bl _h
228bl ___nan
229.space 0x4000000-0x38
230ret
231
232.globl _e
233.p2align 2
234_e:
235bl _a
236bl _b
237bl _c
238bl _d
239bl _e
240bl _f
241bl _g
242bl _h
243bl ___nan
244ret
245
246.globl _f
247.p2align 2
248_f:
249bl _a
250bl _b
251bl _c
252bl _d
253bl _e
254bl _f
255bl _g
256bl _h
257bl ___nan
258.space 0x4000000-0x34
259ret
260
261.globl _g
262.p2align 2
263_g:
264bl _a
265bl _b
266bl _c
267bl _d
268bl _e
269bl _f
270bl _g
271bl _h
272bl ___nan
273ret
274
275.globl _h
276.p2align 2
277_h:
278bl _a
279bl _b
280bl _c
281bl _d
282bl _e
283bl _f
284bl _g
285bl _h
286bl ___nan
287.space 0x4000000-0x30
288ret
289
290.globl _main
291.p2align 2
292_main:
293bl _a
294bl _b
295bl _c
296bl _d
297bl _e
298bl _f
299bl _g
300bl _h
301bl ___nan
302ret
303