| 1 | // Test checks that BOLT can process binaries with TLS relocations |
| 2 | |
| 3 | __thread struct str { |
| 4 | int a; |
| 5 | int b; |
| 6 | } tbssstruct = {}, tdatastruct = {4, 2}; |
| 7 | |
| 8 | extern __thread struct str extstruct; |
| 9 | |
| 10 | extern void processAddr(volatile void *); |
| 11 | |
| 12 | int main() { |
| 13 | // R_AARCH64_TLSDESC_ADR_PAGE21 and R_AARCH64_TLSDESC_LD64_LO12_NC are |
| 14 | // produced for pie binaries in all cases below. |
| 15 | |
| 16 | // The R_TLSLE_ADD_TPREL_HI12 and R_TLSLE_ADD_TPREL_LO12_NC for |
| 17 | // relocations in .tbss and .tdata |
| 18 | processAddr(&tbssstruct.b); |
| 19 | processAddr(&tdatastruct.b); |
| 20 | |
| 21 | // The R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 and |
| 22 | // R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC relocations |
| 23 | processAddr(&extstruct.b); |
| 24 | } |
| 25 | |
| 26 | // REQUIRES: system-linux |
| 27 | // RUN: %clang %cflags -no-pie %s -o %t.exe -Wl,-q \ |
| 28 | // RUN: -Wl,--unresolved-symbols=ignore-all \ |
| 29 | // RUN: -fuse-ld=lld \ |
| 30 | // RUN: -nostdlib |
| 31 | // RUN: llvm-bolt %t.exe -o %t.bolt |
| 32 | // RUN: %clang %cflags -fPIC -pie %s -o %t_pie.exe -Wl,-q \ |
| 33 | // RUN: -Wl,--unresolved-symbols=ignore-all \ |
| 34 | // RUN: -target aarch64-linux -fuse-ld=lld \ |
| 35 | // RUN: -nostdlib |
| 36 | // RUN: llvm-bolt %t_pie.exe -o %t.bolt |
| 37 | |
| 38 | // RUN: %clang %cflags -fPIC -shared %s -o %t.so -Wl,-q -fuse-ld=lld |
| 39 | // RUN: llvm-objdump -d -r --disassemble-symbols=main %t.so | FileCheck %s |
| 40 | // RUN: llvm-bolt %t.so -o %t.bolt.so |
| 41 | |
| 42 | // Verify that unoptimized TLS access was generated for shared object. |
| 43 | // CHECK: adrp x0 |
| 44 | // CHECK-NEXT: R_AARCH64_TLSDESC_ADR_PAGE21 tbssstruct |
| 45 | |