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
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
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]]
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
200 .space 0x4000000-0x3c
229 .space 0x4000000-0x38
258 .space 0x4000000-0x34
287 .space 0x4000000-0x30