1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - -fast-isel %s | FileCheck %s --check-prefix=T2-MOVT-PIC 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -mattr=+no-movt | FileCheck %s --check-prefix=T2-LIT-PIC 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -relocation-model=static | FileCheck %s --check-prefix=T2-MOVT-STATIC 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -mattr=+no-movt -relocation-model=static | FileCheck %s --check-prefix=T2-LIT-STATIC 5*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s | FileCheck %s --check-prefix=ARM-MOVT-PIC 6*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -mattr=+no-movt | FileCheck %s --check-prefix=ARM-LIT-PIC 7*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -relocation-model=static | FileCheck %s --check-prefix=ARM-MOVT-STATIC 8*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -mattr=+no-movt -relocation-model=static | FileCheck %s --check-prefix=ARM-LIT-STATIC 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker@local_tls_var = thread_local global i32 0 12*9880d681SAndroid Build Coastguard Worker@external_tls_var = external thread_local global i32 13*9880d681SAndroid Build Coastguard Worker@hidden_external_tls_var = external hidden thread_local global i32 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i32 @test_local_tls() { 17*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-LABEL: test_local_tls: 18*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movw r0, :lower16:(_local_tls_var-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+4)) 19*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movt r0, :upper16:(_local_tls_var-([[PCREL_LOC]]+4)) 20*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: [[PCREL_LOC]]: 21*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-NEXT: add r0, pc 22*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 23*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: blx [[TLV_GET_ADDR]] 24*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr r0, [r0] 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-LABEL: test_local_tls: 27*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 28*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]: 29*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: add r0, pc 30*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 31*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: blx [[TLV_GET_ADDR]] 32*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [r0] 33*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[LOCAL_VAR_ADDR]]: 34*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: .long _local_tls_var-([[PCREL_LOC]]+4) 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC-LABEL: test_local_tls: 37*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movw r0, :lower16:_local_tls_var 38*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movt r0, :upper16:_local_tls_var 39*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 40*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: blx [[TLV_GET_ADDR]] 41*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr r0, [r0] 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-LABEL: test_local_tls: 44*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 45*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 46*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: blx [[TLV_GET_ADDR]] 47*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [r0] 48*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: [[LOCAL_VAR_ADDR]]: 49*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-NEXT: .long _local_tls_var 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-LABEL: test_local_tls: 52*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movw [[VARPC1:r[0-9]+]], :lower16:(_local_tls_var-([[PCREL_LOC1:LPC[0-9]+_[0-9]+]]+8)) 53*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movt [[VARPC1]], :upper16:(_local_tls_var-([[PCREL_LOC1]]+8)) 54*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: [[PCREL_LOC1]]: 55*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: add r0, pc, [[VARPC1]] 56*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movw [[VARPC2:r[0-9]+]], :lower16:(_local_tls_var-([[PCREL_LOC2:LPC[0-9]+_[0-9]+]]+8)) 57*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movt [[VARPC2]], :upper16:(_local_tls_var-([[PCREL_LOC2]]+8)) 58*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: [[PCREL_LOC2]]: 59*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-NEXT: ldr [[TLV_GET_ADDR:r[0-9]+]], [pc, [[VARPC2]]] 60*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: blx [[TLV_GET_ADDR]] 61*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: ldr r0, [r0] 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-LABEL: test_local_tls: 64*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 65*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]: 66*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: add r0, pc 67*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 68*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: blx [[TLV_GET_ADDR]] 69*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [r0] 70*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[LOCAL_VAR_ADDR]]: 71*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: .long _local_tls_var-([[PCREL_LOC]]+8) 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC-LABEL: test_local_tls: 74*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movw r0, :lower16:_local_tls_var 75*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movt r0, :upper16:_local_tls_var 76*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 77*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: blx [[TLV_GET_ADDR]] 78*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr r0, [r0] 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-LABEL: test_local_tls: 81*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 82*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 83*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: blx [[TLV_GET_ADDR]] 84*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [r0] 85*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: [[LOCAL_VAR_ADDR]]: 86*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-NEXT: .long _local_tls_var 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @local_tls_var, align 4 90*9880d681SAndroid Build Coastguard Worker ret i32 %val 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @test_external_tls() { 94*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-LABEL: test_external_tls: 95*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movw r[[EXTGOT:[0-9]+]], :lower16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+4)) 96*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movt r[[EXTGOT]], :upper16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+4)) 97*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: [[PCREL_LOC]]: 98*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-NEXT: add r[[EXTGOT]], pc 99*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr r0, [r[[EXTGOT]]] 100*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 101*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: blx [[TLV_GET_ADDR]] 102*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr r0, [r0] 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-LABEL: test_external_tls: 105*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r[[EXTGOT:[0-9]+]], [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 106*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]: 107*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: add r[[EXTGOT]], pc 108*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [r[[EXTGOT]]] 109*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 110*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: blx [[TLV_GET_ADDR]] 111*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [r0] 112*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[EXTERNAL_VAR_ADDR]]: 113*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: .long L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+4) 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC-LABEL: test_external_tls: 116*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movw r0, :lower16:_external_tls_var 117*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movt r0, :upper16:_external_tls_var 118*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 119*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: blx [[TLV_GET_ADDR]] 120*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr r0, [r0] 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-LABEL: test_external_tls: 123*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 124*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 125*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: blx [[TLV_GET_ADDR]] 126*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [r0] 127*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: [[EXTERNAL_VAR_ADDR]]: 128*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-NEXT: .long _external_tls_var 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-LABEL: test_external_tls: 131*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movw r[[EXTGOT:[0-9]+]], :lower16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+8)) 132*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movt r[[EXTGOT]], :upper16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+8)) 133*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: [[PCREL_LOC]]: 134*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-NEXT: ldr r0, [pc, r[[EXTGOT]]] 135*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 136*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: blx [[TLV_GET_ADDR]] 137*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: ldr r0, [r0] 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-LABEL: test_external_tls: 140*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r[[EXTGOT:[0-9]+]], [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 141*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]: 142*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: add r[[EXTGOT]], pc 143*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [r[[EXTGOT]]] 144*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 145*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: blx [[TLV_GET_ADDR]] 146*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [r0] 147*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[EXTERNAL_VAR_ADDR]]: 148*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: .long L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+8) 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC-LABEL: test_external_tls: 151*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movw r0, :lower16:_external_tls_var 152*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movt r0, :upper16:_external_tls_var 153*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 154*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: blx [[TLV_GET_ADDR]] 155*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr r0, [r0] 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-LABEL: test_external_tls: 158*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]] 159*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0] 160*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: blx [[TLV_GET_ADDR]] 161*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [r0] 162*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: [[EXTERNAL_VAR_ADDR]]: 163*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-NEXT: .long _external_tls_var 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @external_tls_var, align 4 166*9880d681SAndroid Build Coastguard Worker ret i32 %val 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; Just need something to trigger an indirect reference to the var. 170*9880d681SAndroid Build Coastguard Workerdefine i32 @use_hidden_external_tls() { 171*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @hidden_external_tls_var, align 4 172*9880d681SAndroid Build Coastguard Worker ret i32 %val 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .section __DATA,__thread_ptr,thread_local_variable_pointers 176*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .p2align 2 177*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: L_external_tls_var$non_lazy_ptr: 178*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .indirect_symbol _external_tls_var 179*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .long 0 180*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: L_hidden_external_tls_var$non_lazy_ptr: 181*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .indirect_symbol _hidden_external_tls_var 182*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .long 0 183