|
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