|
1 |
| -## Check that llvm-bolt correctly recognizes long absolute thunks generated |
2 |
| -## by LLD. |
| 1 | +## Check that llvm-bolt correctly recognizes veneers/thunks for absolute code |
| 2 | +## generated by LLD. |
3 | 3 |
|
4 | 4 | # RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %s -o %t.o
|
5 | 5 | # RUN: %clang %cflags -fno-PIC -no-pie %t.o -o %t.exe -nostdlib \
|
|
12 | 12 |
|
13 | 13 | .text
|
14 | 14 | .balign 4
|
15 |
| -.global foo |
16 |
| -.type foo, %function |
17 |
| -foo: |
18 |
| - adrp x1, foo |
| 15 | +.global far_function |
| 16 | +.type far_function, %function |
| 17 | +far_function: |
19 | 18 | ret
|
20 |
| -.size foo, .-foo |
| 19 | +.size far_function, .-far_function |
| 20 | + |
| 21 | +.global near_function |
| 22 | +.type near_function, %function |
| 23 | +near_function: |
| 24 | + ret |
| 25 | +.size near_function, .-near_function |
| 26 | + |
| 27 | +## Force relocations against .text. |
| 28 | +.reloc 0, R_AARCH64_NONE |
21 | 29 |
|
22 | 30 | .section ".mytext", "ax"
|
23 | 31 | .balign 4
|
24 | 32 |
|
25 |
| -.global __AArch64AbsLongThunk_foo |
26 |
| -.type __AArch64AbsLongThunk_foo, %function |
27 |
| -__AArch64AbsLongThunk_foo: |
| 33 | +## This version of a thunk is always generated by LLD for function calls |
| 34 | +## spanning more than 256MB. |
| 35 | +.global __AArch64AbsLongThunk_far_function |
| 36 | +.type __AArch64AbsLongThunk_far_function, %function |
| 37 | +__AArch64AbsLongThunk_far_function: |
28 | 38 | ldr x16, .L1
|
29 | 39 | br x16
|
30 |
| -# CHECK-INPUT-LABEL: <__AArch64AbsLongThunk_foo>: |
| 40 | +# CHECK-INPUT-LABEL: <__AArch64AbsLongThunk_far_function>: |
31 | 41 | # CHECK-INPUT-NEXT: ldr
|
32 | 42 | # CHECK-INPUT-NEXT: br
|
33 | 43 | .L1:
|
34 |
| - .quad foo |
35 |
| -.size __AArch64AbsLongThunk_foo, .-__AArch64AbsLongThunk_foo |
| 44 | + .quad far_function |
| 45 | +.size __AArch64AbsLongThunk_far_function, .-__AArch64AbsLongThunk_far_function |
| 46 | + |
| 47 | +## If a callee is closer than 256MB away, LLD may generate a thunk with a direct |
| 48 | +## jump to the callee. Note, that the name might still include "AbsLong". |
| 49 | +.global __AArch64AbsLongThunk_near_function |
| 50 | +.type __AArch64AbsLongThunk_near_function, %function |
| 51 | +__AArch64AbsLongThunk_near_function: |
| 52 | + b near_function |
| 53 | +# CHECK-INPUT-LABEL: <__AArch64AbsLongThunk_near_function>: |
| 54 | +# CHECK-INPUT-NEXT: b {{.*}} <near_function> |
| 55 | +.size __AArch64AbsLongThunk_near_function, .-__AArch64AbsLongThunk_near_function |
36 | 56 |
|
37 |
| -## Check that the thunk was removed from .text and _start() calls foo() |
| 57 | +## Check that thunks were removed from .text, and _start calls functions |
38 | 58 | ## directly.
|
39 | 59 |
|
40 |
| -# CHECK-OUTPUT-NOT: __AArch64AbsLongThunk_foo |
| 60 | +# CHECK-OUTPUT-NOT: __AArch64AbsLongThunk_{{.*}} |
41 | 61 |
|
42 | 62 | .global _start
|
43 | 63 | .type _start, %function
|
44 | 64 | _start:
|
45 | 65 | # CHECK-INPUT-LABEL: <_start>:
|
46 | 66 | # CHECK-OUTPUT-LABEL: <_start>:
|
47 |
| - bl __AArch64AbsLongThunk_foo |
48 |
| -# CHECK-INPUT-NEXT: bl {{.*}} <__AArch64AbsLongThunk_foo> |
49 |
| -# CHECK-OUTPUT-NEXT: bl {{.*}} <foo> |
| 67 | + bl __AArch64AbsLongThunk_far_function |
| 68 | + bl __AArch64AbsLongThunk_near_function |
| 69 | +# CHECK-INPUT-NEXT: bl {{.*}} <__AArch64AbsLongThunk_far_function> |
| 70 | +# CHECK-INPUT-NEXT: bl {{.*}} <__AArch64AbsLongThunk_near_function> |
| 71 | +# CHECK-OUTPUT-NEXT: bl {{.*}} <far_function> |
| 72 | +# CHECK-OUTPUT-NEXT: bl {{.*}} <near_function> |
50 | 73 | ret
|
51 | 74 | .size _start, .-_start
|
0 commit comments