1// REQUIRES: arm 2// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t 3// RUN: ld.lld %t -o %t2 4// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=armv7a-linux-gnueabi 5// RUN: llvm-objdump -s %t2 | FileCheck %s 6// RUN: ld.lld %t --shared -o %t3.so 7// RUN: llvm-objdump -s %t3.so | FileCheck --check-prefix=CHECK-SHARED %s 8 9/// For an executable, we write the module index 1 and the offset into the TLS 10/// directly into the GOT. For a shared library we can only write the offset 11/// into the TLS directly if the symbol is non-preemptible 12 13 .text 14 .syntax unified 15 .globl __tls_get_addr 16 .type __tls_get_addr,%function 17__tls_get_addr: 18 bx lr 19 20 .globl _start 21 .p2align 2 22 .type _start,%function 23func: 24.L0: 25 nop 26.L1: 27 nop 28.L2: 29 nop 30.L3: 31 nop 32 .p2align 2 33/// Generate R_ARM_TLS_GD32 relocations 34/// These can be resolved at static link time for executables as 1 is always the 35/// module index and the offset into tls is known at static link time 36.Lt0: .word x1(TLSGD) + (. - .L0 - 8) 37.Lt1: .word x2(TLSGD) + (. - .L1 - 8) 38.Lt2: .word x3(TLSGD) + (. - .L2 - 8) 39.Lt3: .word x4(TLSGD) + (. - .L3 - 8) 40 .hidden x1 41 .globl x1 42 .hidden x2 43 .globl x2 44 .globl x3 45 .globl x4 46 47 .section .tdata,"awT",%progbits 48 .p2align 2 49.TLSSTART: 50 .type x1, %object 51x1: 52 .word 10 53 .type x2, %object 54x2: 55 .word 20 56 57 .section .tbss,"awT",%nobits 58 .p2align 2 59 .type x3, %object 60x3: 61 .space 4 62 .type x4, %object 63x4: 64 .space 4 65 66// CHECK: Contents of section .got: 67// CHECK-NEXT: 30140 01000000 00000000 01000000 04000000 68// CHECK-NEXT: 30150 01000000 08000000 01000000 0c000000 69 70// CHECK-SHARED: Contents of section .got: 71// CHECK-SHARED-NEXT: 202a8 00000000 00000000 00000000 04000000 72// CHECK-SHARED-NEXT: 202b8 00000000 00000000 00000000 00000000 73