1*9880d681SAndroid Build Coastguard Worker; RUN: llc -emulated-tls -mtriple=arm-linux-android \ 2*9880d681SAndroid Build Coastguard Worker; RUN: -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %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; ARM32-LABEL: my_get_xyz: 12*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 13*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 14*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl my_emutls_get_address 15*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldr r0, [r0] 16*9880d681SAndroid Build Coastguard Worker; ARM32: .long my_emutls_v_xyz(GOT_PREL) 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; ARM32-LABEL: f1: 35*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 36*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 37*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 38*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldr r0, [r0] 39*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i1(GOT_PREL) 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; ARM32-LABEL: f2: 48*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 49*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 50*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 51*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop 52*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i1(GOT_PREL) 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker ret i32* @i1 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine i32 @f3() nounwind { 59*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f3: 60*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 61*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 62*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 63*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldr r0, [r0] 64*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i2(GOT_PREL) 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerentry: 67*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i2 68*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine i32* @f4() { 72*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f4: 73*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 74*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 75*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 76*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop 77*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i2(GOT_PREL) 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker ret i32* @i2 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine i32 @f5() nounwind { 84*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f5: 85*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 86*9880d681SAndroid Build Coastguard Worker; ARM32: add r0, pc, r0 87*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 88*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldr r0, [r0] 89*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i3- 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerentry: 92*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i3 93*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine i32* @f6() { 97*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f6: 98*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 99*9880d681SAndroid Build Coastguard Worker; ARM32: add r0, pc, r0 100*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 101*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop 102*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i3- 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker ret i32* @i3 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine i32 @f7() { 109*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f7: 110*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 111*9880d681SAndroid Build Coastguard Worker; ARM32: add r0, pc, r0 112*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 113*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldr r0, [r0] 114*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i4-(.LPC 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerentry: 117*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i4 118*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine i32* @f8() { 122*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f8: 123*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 124*9880d681SAndroid Build Coastguard Worker; ARM32: add r0, pc, r0 125*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 126*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop 127*9880d681SAndroid Build Coastguard Worker; ARM32: .long __emutls_v.i4-(.LPC 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerentry: 130*9880d681SAndroid Build Coastguard Worker ret i32* @i4 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine i32 @f9() { 134*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f9: 135*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 136*9880d681SAndroid Build Coastguard Worker; ARM32: add r0, pc, r0 137*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 138*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldr r0, [r0] 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerentry: 141*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i5 142*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine i32* @f10() { 146*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f10: 147*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 148*9880d681SAndroid Build Coastguard Worker; ARM32: add r0, pc, r0 149*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 150*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerentry: 153*9880d681SAndroid Build Coastguard Worker ret i32* @i5 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine i16 @f11() { 157*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f11: 158*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 159*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 160*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 161*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldrh r0, [r0] 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerentry: 164*9880d681SAndroid Build Coastguard Worker %tmp1 = load i16, i16* @s1 165*9880d681SAndroid Build Coastguard Worker ret i16 %tmp1 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine i32 @f12() { 169*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f12: 170*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 171*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 172*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 173*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldrsh r0, [r0] 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerentry: 176*9880d681SAndroid Build Coastguard Worker %tmp1 = load i16, i16* @s1 177*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i16 %tmp1 to i32 178*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdefine i8 @f13() { 182*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f13: 183*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 184*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 185*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 186*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldrb r0, [r0] 187*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerentry: 190*9880d681SAndroid Build Coastguard Worker %tmp1 = load i8, i8* @b1 191*9880d681SAndroid Build Coastguard Worker ret i8 %tmp1 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine i32 @f14() { 195*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f14: 196*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, 197*9880d681SAndroid Build Coastguard Worker; ARM32: ldr r0, [pc, r0] 198*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: bl __emutls_get_address 199*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: ldrsb r0, [r0] 200*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Workerentry: 203*9880d681SAndroid Build Coastguard Worker %tmp1 = load i8, i8* @b1 204*9880d681SAndroid Build Coastguard Worker %tmp2 = sext i8 %tmp1 to i32 205*9880d681SAndroid Build Coastguard Worker ret i32 %tmp2 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t. 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker; ARM32: .data{{$}} 211*9880d681SAndroid Build Coastguard Worker; ARM32: .globl __emutls_v.i1 212*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.i1: 213*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4 214*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4 215*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0 216*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.i1 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; ARM32: .section .rodata, 219*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.i1: 220*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 15 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker; ARM32-NOT: __emutls_v.i2 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker; ARM32: .data{{$}} 225*9880d681SAndroid Build Coastguard Worker; ARM32-NOT: .globl 226*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.i3: 227*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4 228*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4 229*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0 230*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.i3 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker; ARM32: .section .rodata, 233*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.i3: 234*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 15 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; ARM32: .data{{$}} 237*9880d681SAndroid Build Coastguard Worker; ARM32: .globl __emutls_v.i4 238*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.i4: 239*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4 240*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4 241*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0 242*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.i4 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker; ARM32: .section .rodata, 245*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.i4: 246*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 15 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker; ARM32-NOT: __emutls_v.i5: 249*9880d681SAndroid Build Coastguard Worker; ARM32: .hidden __emutls_v.i5 250*9880d681SAndroid Build Coastguard Worker; ARM32-NOT: __emutls_v.i5: 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker; ARM32: .data{{$}} 253*9880d681SAndroid Build Coastguard Worker; ARM32: .globl __emutls_v.s1 254*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.s1: 255*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 2 256*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 2 257*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0 258*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.s1 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker; ARM32 .section .rodata, 261*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.s1: 262*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .short 15 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker; ARM32: .data{{$}} 265*9880d681SAndroid Build Coastguard Worker; ARM32: .globl __emutls_v.b1 266*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.b1: 267*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 1 268*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 1 269*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0 270*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Worker; ARM32-NOT: __emutls_t.b1 273