1*9880d681SAndroid Build Coastguard Worker; RUN: llc -emulated-tls -mtriple=aarch64-linux-android \ 2*9880d681SAndroid Build Coastguard Worker; RUN: -relocation-model=pic -disable-fp-elim < %s | FileCheck -check-prefix=ARM64 %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Copied from X86/emutls.ll 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Use my_emutls_get_address like __emutls_get_address. 7*9880d681SAndroid Build Coastguard Worker@my_emutls_v_xyz = external global i8*, align 4 8*9880d681SAndroid Build Coastguard Workerdeclare i8* @my_emutls_get_address(i8*) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine i32 @my_get_xyz() { 11*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: my_get_xyz: 12*9880d681SAndroid Build Coastguard Worker; ARM64: adrp x0, :got:my_emutls_v_xyz 13*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr x0, [x0, :got_lo12:my_emutls_v_xyz] 14*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: bl my_emutls_get_address 15*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr w0, [x0] 16*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldp x29, x30, [sp] 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*)) 20*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %call to i32* 21*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %0, align 4 22*9880d681SAndroid Build Coastguard Worker ret i32 %1 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker@i1 = thread_local global i32 15 26*9880d681SAndroid Build Coastguard Worker@i2 = external thread_local global i32 27*9880d681SAndroid Build Coastguard Worker@i3 = internal thread_local global i32 15 28*9880d681SAndroid Build Coastguard Worker@i4 = hidden thread_local global i32 15 29*9880d681SAndroid Build Coastguard Worker@i5 = external hidden thread_local global i32 30*9880d681SAndroid Build Coastguard Worker@s1 = thread_local global i16 15 31*9880d681SAndroid Build Coastguard Worker@b1 = thread_local global i8 0 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i32 @f1() { 34*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: f1: 35*9880d681SAndroid Build Coastguard Worker; ARM64: adrp x0, :got:__emutls_v.i1 36*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr x0, [x0, :got_lo12:__emutls_v.i1] 37*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: bl __emutls_get_address 38*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr w0, [x0] 39*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldp x29, x30, [sp] 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i1 43*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i32* @f2() { 47*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: f2: 48*9880d681SAndroid Build Coastguard Worker; ARM64: adrp x0, :got:__emutls_v.i1 49*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr x0, [x0, :got_lo12:__emutls_v.i1] 50*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: bl __emutls_get_address 51*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldp x29, x30, [sp] 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerentry: 54*9880d681SAndroid Build Coastguard Worker ret i32* @i1 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i32 @f5() nounwind { 58*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: f5: 59*9880d681SAndroid Build Coastguard Worker; ARM64: adrp x0, __emutls_v.i3 60*9880d681SAndroid Build Coastguard Worker; ARM64: add x0, x0, :lo12:__emutls_v.i3 61*9880d681SAndroid Build Coastguard Worker; ARM64: bl __emutls_get_address 62*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr w0, [x0] 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i3 66*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine i32* @f6() { 70*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: f6: 71*9880d681SAndroid Build Coastguard Worker; ARM64: adrp x0, __emutls_v.i3 72*9880d681SAndroid Build Coastguard Worker; ARM64: add x0, x0, :lo12:__emutls_v.i3 73*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: bl __emutls_get_address 74*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldp x29, x30, [sp] 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker ret i32* @i3 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; Simple test of comdat __thread variables. 81*9880d681SAndroid Build Coastguard Worker; template <class T> struct A { static __thread T x; }; 82*9880d681SAndroid Build Coastguard Worker; template <class T> T __thread A<T>::x; 83*9880d681SAndroid Build Coastguard Worker; int getIntX() { return A<int>::x++; } 84*9880d681SAndroid Build Coastguard Worker; float getFloatX() { return A<float>::x++; } 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker$_ZN1AIiE1xE = comdat any 87*9880d681SAndroid Build Coastguard Worker$_ZN1AIfE1xE = comdat any 88*9880d681SAndroid Build Coastguard Worker@_ZN1AIiE1xE = linkonce_odr thread_local global i32 0, comdat, align 4 89*9880d681SAndroid Build Coastguard Worker@_ZN1AIfE1xE = linkonce_odr thread_local global float 0.000000e+00, comdat, align 4 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine i32 @_Z7getIntXv() { 92*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: _Z7getIntXv: 93*9880d681SAndroid Build Coastguard Worker; ARM64: adrp x0, :got:__emutls_v._ZN1AIiE1xE 94*9880d681SAndroid Build Coastguard Worker; ARM64: ldr x0, [x0, :got_lo12:__emutls_v._ZN1AIiE1xE] 95*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: bl __emutls_get_address 96*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr {{.*}}, [x0] 97*9880d681SAndroid Build Coastguard Worker; ARM64: add 98*9880d681SAndroid Build Coastguard Worker; ARM64: str {{.*}}, [x0] 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerentry: 101*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @_ZN1AIiE1xE, align 4 102*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 103*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* @_ZN1AIiE1xE, align 4 104*9880d681SAndroid Build Coastguard Worker ret i32 %0 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine float @_Z9getFloatXv() { 108*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: _Z9getFloatXv: 109*9880d681SAndroid Build Coastguard Worker; ARM64: adrp x0, :got:__emutls_v._ZN1AIfE1xE 110*9880d681SAndroid Build Coastguard Worker; ARM64: ldr x0, [x0, :got_lo12:__emutls_v._ZN1AIfE1xE] 111*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: bl __emutls_get_address 112*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: ldr {{.*}}, [x0] 113*9880d681SAndroid Build Coastguard Worker; ARM64: fadd s{{.*}}, s 114*9880d681SAndroid Build Coastguard Worker; ARM64: str s{{.*}}, [x0] 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerentry: 117*9880d681SAndroid Build Coastguard Worker %0 = load float, float* @_ZN1AIfE1xE, align 4 118*9880d681SAndroid Build Coastguard Worker %inc = fadd float %0, 1.000000e+00 119*9880d681SAndroid Build Coastguard Worker store float %inc, float* @_ZN1AIfE1xE, align 4 120*9880d681SAndroid Build Coastguard Worker ret float %0 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker;;;;;;;;;;;;;; 64-bit __emutls_v. and __emutls_t. 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; ARM64: .data{{$}} 127*9880d681SAndroid Build Coastguard Worker; ARM64: .globl __emutls_v.i1 128*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_v.i1: 129*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 130*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 131*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 132*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword __emutls_t.i1 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; ARM64: .section .rodata, 135*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_t.i1: 136*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .word 15 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; ARM64-NOT: __emutls_v.i2 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; ARM64: .data{{$}} 141*9880d681SAndroid Build Coastguard Worker; ARM64-NOT: .globl 142*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_v.i3: 143*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 144*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 145*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 146*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword __emutls_t.i3 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; ARM64: .section .rodata, 149*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_t.i3: 150*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .word 15 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; ARM64: .hidden __emutls_v.i4 153*9880d681SAndroid Build Coastguard Worker; ARM64: .data{{$}} 154*9880d681SAndroid Build Coastguard Worker; ARM64: .globl __emutls_v.i4 155*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_v.i4: 156*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 157*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 158*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 159*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword __emutls_t.i4 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker; ARM64: .section .rodata, 162*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_t.i4: 163*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .word 15 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; ARM64-NOT: __emutls_v.i5: 166*9880d681SAndroid Build Coastguard Worker; ARM64: .hidden __emutls_v.i5 167*9880d681SAndroid Build Coastguard Worker; ARM64-NOT: __emutls_v.i5: 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; ARM64: .data{{$}} 170*9880d681SAndroid Build Coastguard Worker; ARM64: .globl __emutls_v.s1 171*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_v.s1: 172*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 2 173*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 2 174*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 175*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword __emutls_t.s1 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker; ARM64: .section .rodata, 178*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_t.s1: 179*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .hword 15 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; ARM64: .data{{$}} 182*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_v.b1: 183*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 1 184*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 1 185*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 186*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; ARM64-NOT: __emutls_t.b1 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; ARM64: .section .data.__emutls_v._ZN1AIiE1xE,{{.*}},__emutls_v._ZN1AIiE1xE,comdat 191*9880d681SAndroid Build Coastguard Worker; ARM64: .weak __emutls_v._ZN1AIiE1xE 192*9880d681SAndroid Build Coastguard Worker; ARM64: .p2align 3 193*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_v._ZN1AIiE1xE: 194*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 195*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 196*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 197*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker; ARM64: .section .data.__emutls_v._ZN1AIfE1xE,{{.*}},__emutls_v._ZN1AIfE1xE,comdat 200*9880d681SAndroid Build Coastguard Worker; ARM64: .weak __emutls_v._ZN1AIfE1xE 201*9880d681SAndroid Build Coastguard Worker; ARM64: .p2align 3 202*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_v._ZN1AIfE1xE: 203*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 204*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 4 205*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword 0 206*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .xword __emutls_t._ZN1AIfE1xE 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; ARM64: .section .rodata.__emutls_t._ZN1AIfE1xE,{{.*}},__emutls_t._ZN1AIfE1xE,comdat 209*9880d681SAndroid Build Coastguard Worker; ARM64: .weak __emutls_t._ZN1AIfE1xE 210*9880d681SAndroid Build Coastguard Worker; ARM64: .p2align 2 211*9880d681SAndroid Build Coastguard Worker; ARM64-LABEL: __emutls_t._ZN1AIfE1xE: 212*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .word 0 213*9880d681SAndroid Build Coastguard Worker; ARM64-NEXT: .size 214