llvm-project

Форк
0
/
arm64-thunks.s 
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:
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
186
  ret
187

188
.globl _b
189
.p2align 2
190
_b:
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
201
  ret
202

203
.globl _c
204
.p2align 2
205
_c:
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
215
  ret
216

217
.globl _d
218
.p2align 2
219
_d:
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
230
  ret
231

232
.globl _e
233
.p2align 2
234
_e:
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
244
  ret
245

246
.globl _f
247
.p2align 2
248
_f:
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
259
  ret
260

261
.globl _g
262
.p2align 2
263
_g:
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
273
  ret
274

275
.globl _h
276
.p2align 2
277
_h:
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
288
  ret
289

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
302
  ret
303

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.