1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -aarch64-elf-ldtls-generation=1 -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -aarch64-elf-ldtls-generation=1 -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -verify-machineinstrs < %s | FileCheck --check-prefix=CHECK-NOLD %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-NOLD-RELOC %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker@general_dynamic_var = external thread_local global i32 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i32 @test_generaldynamic() { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_generaldynamic: 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @general_dynamic_var 12*9880d681SAndroid Build Coastguard Worker ret i32 %val 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:general_dynamic_var 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var] 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .tlsdesccall general_dynamic_var 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr [[CALLEE]] 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:general_dynamic_var 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var] 22*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var 23*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: .tlsdesccall general_dynamic_var 24*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: blr [[CALLEE]] 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK: mrs x[[TP:[0-9]+]], TPIDR_EL0 28*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w0, [x[[TP]], x0] 29*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: mrs x[[TP:[0-9]+]], TPIDR_EL0 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: ldr w0, [x[[TP]], x0] 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 33*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 34*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 35*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_CALL 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 38*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 40*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine i32* @test_generaldynamic_addr() { 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_generaldynamic_addr: 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker ret i32* @general_dynamic_var 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:general_dynamic_var 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var] 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .tlsdesccall general_dynamic_var 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr [[CALLEE]] 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; CHECK: mrs [[TP:x[0-9]+]], TPIDR_EL0 56*9880d681SAndroid Build Coastguard Worker; CHECK: add x0, [[TP]], x0 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 59*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 60*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 61*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_CALL 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 64*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 65*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 66*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker@local_dynamic_var = external thread_local(localdynamic) global i32 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i32 @test_localdynamic() { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_localdynamic: 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @local_dynamic_var 76*9880d681SAndroid Build Coastguard Worker ret i32 %val 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:_TLS_MODULE_BASE_ 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:_TLS_MODULE_BASE_] 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:_TLS_MODULE_BASE_ 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .tlsdesccall _TLS_MODULE_BASE_ 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr [[CALLEE]] 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x[[TPOFF:[0-9]+]], x0, :dtprel_hi12:local_dynamic_var 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x[[TPOFF]], x[[TPOFF]], :dtprel_lo12_nc:local_dynamic_var 85*9880d681SAndroid Build Coastguard Worker; CHECK: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0 86*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w0, [x[[TPIDR]], x[[TPOFF]]] 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:local_dynamic_var 89*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:local_dynamic_var] 90*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:local_dynamic_var 91*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: .tlsdesccall local_dynamic_var 92*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: blr [[CALLEE]] 93*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0 94*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: ldr w0, [x[[TPIDR]], x0] 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 98*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 99*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 100*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_CALL 101*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_HI12 102*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 105*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 106*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 107*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine i32* @test_localdynamic_addr() { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_localdynamic_addr: 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:_TLS_MODULE_BASE_ 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:_TLS_MODULE_BASE_] 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:_TLS_MODULE_BASE_ 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .tlsdesccall _TLS_MODULE_BASE_ 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr [[CALLEE]] 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x[[TPOFF:[0-9]+]], x0, :dtprel_hi12:local_dynamic_var 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x[[TPOFF]], x[[TPOFF]], :dtprel_lo12_nc:local_dynamic_var 121*9880d681SAndroid Build Coastguard Worker; CHECK: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0 122*9880d681SAndroid Build Coastguard Worker; CHECK: add x0, x[[TPIDR]], x[[TPOFF]] 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:local_dynamic_var 125*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:local_dynamic_var] 126*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:local_dynamic_var 127*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: .tlsdesccall local_dynamic_var 128*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-NEXT: blr [[CALLEE]] 129*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0 130*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD: add x0, x[[TPIDR]], x0 131*9880d681SAndroid Build Coastguard Worker ret i32* @local_dynamic_var 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 134*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 135*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 136*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSDESC_CALL 137*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_HI12 138*9880d681SAndroid Build Coastguard Worker; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21 141*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC 142*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC 143*9880d681SAndroid Build Coastguard Worker; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; The entire point of the local-dynamic access model is to have a single call to 147*9880d681SAndroid Build Coastguard Worker; the expensive resolver. Make sure we achieve that goal. 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker@local_dynamic_var2 = external thread_local(localdynamic) global i32 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i32 @test_localdynamic_deduplicate() { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_localdynamic_deduplicate: 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @local_dynamic_var 155*9880d681SAndroid Build Coastguard Worker %val2 = load i32, i32* @local_dynamic_var2 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker %sum = add i32 %val, %val2 158*9880d681SAndroid Build Coastguard Worker ret i32 %sum 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[DTPREL_HI:[0-9]+]], :tlsdesc:_TLS_MODULE_BASE_ 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[DTPREL_HI]], :tlsdesc_lo12:_TLS_MODULE_BASE_] 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:_TLS_MODULE_BASE 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .tlsdesccall _TLS_MODULE_BASE_ 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr [[CALLEE]] 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: _TLS_MODULE_BASE_ 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; CHECK: ret 169*9880d681SAndroid Build Coastguard Worker} 170