1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -emulated-tls -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X32 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -emulated-tls -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X64 %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -emulated-tls -march=x86 -mtriple=i386-linux-android -relocation-model=pic | FileCheck -check-prefix=X32 %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -emulated-tls -march=x86-64 -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck -check-prefix=X64 %s 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; X32-LABEL: my_get_xyz: 12*9880d681SAndroid Build Coastguard Worker; X32: movl my_emutls_v_xyz@GOT(%ebx), %eax 13*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %eax, (%esp) 14*9880d681SAndroid Build Coastguard Worker; X32-NEXT: calll my_emutls_get_address@PLT 15*9880d681SAndroid Build Coastguard Worker; X64-LABEL: my_get_xyz: 16*9880d681SAndroid Build Coastguard Worker; X64: movq my_emutls_v_xyz@GOTPCREL(%rip), %rdi 17*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq my_emutls_get_address@PLT 18*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl (%rax), %eax 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*)) 22*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %call to i32* 23*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %0, align 4 24*9880d681SAndroid Build Coastguard Worker ret i32 %1 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker@i = thread_local global i32 15 28*9880d681SAndroid Build Coastguard Worker@j = internal thread_local global i32 42 29*9880d681SAndroid Build Coastguard Worker@k = internal thread_local global i32 0, align 8 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i32 @f1() { 32*9880d681SAndroid Build Coastguard Workerentry: 33*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i 34*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; X32-LABEL: f1: 38*9880d681SAndroid Build Coastguard Worker; X32: movl __emutls_v.i@GOT(%ebx), %eax 39*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %eax, (%esp) 40*9880d681SAndroid Build Coastguard Worker; X32-NEXT: calll __emutls_get_address@PLT 41*9880d681SAndroid Build Coastguard Worker; X64-LABEL: f1: 42*9880d681SAndroid Build Coastguard Worker; X64: movq __emutls_v.i@GOTPCREL(%rip), %rdi 43*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __emutls_get_address@PLT 44*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl (%rax), %eax 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker@i2 = external thread_local global i32 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32* @f2() { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker ret i32* @i 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; X32-LABEL: f2: 54*9880d681SAndroid Build Coastguard Worker; X64-LABEL: f2: 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i32 @f3() { 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @i ; <i32> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; X32-LABEL: f3: 64*9880d681SAndroid Build Coastguard Worker; X64-LABEL: f3: 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine i32* @f4() nounwind { 68*9880d681SAndroid Build Coastguard Workerentry: 69*9880d681SAndroid Build Coastguard Worker ret i32* @i 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; X32-LABEL: f4: 73*9880d681SAndroid Build Coastguard Worker; X64-LABEL: f4: 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine i32 @f5() nounwind { 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @j, align 4 79*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* @k, align 4 80*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %1 81*9880d681SAndroid Build Coastguard Worker ret i32 %add 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; X32-LABEL: f5: 85*9880d681SAndroid Build Coastguard Worker; X32: leal __emutls_v.j@GOTOFF(%ebx), %eax 86*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %eax, (%esp) 87*9880d681SAndroid Build Coastguard Worker; X32-NEXT: calll __emutls_get_address@PLT 88*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl (%eax), %esi 89*9880d681SAndroid Build Coastguard Worker; X32-NEXT: leal __emutls_v.k@GOTOFF(%ebx), %eax 90*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %eax, (%esp) 91*9880d681SAndroid Build Coastguard Worker; X32-NEXT: calll __emutls_get_address@PLT 92*9880d681SAndroid Build Coastguard Worker; X32-NEXT: addl (%eax), %esi 93*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl %esi, %eax 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; X64-LABEL: f5: 96*9880d681SAndroid Build Coastguard Worker; X64: leaq __emutls_v.j(%rip), %rdi 97*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __emutls_get_address@PLT 98*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl (%rax), %ebx 99*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leaq __emutls_v.k(%rip), %rdi 100*9880d681SAndroid Build Coastguard Worker; X64-NEXT: callq __emutls_get_address@PLT 101*9880d681SAndroid Build Coastguard Worker; X64-NEXT: addl (%rax), %ebx 102*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %ebx, %eax 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker;;;;; 32-bit targets 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; X32: .data{{$}} 107*9880d681SAndroid Build Coastguard Worker; X32: .globl __emutls_v.i 108*9880d681SAndroid Build Coastguard Worker; X32-LABEL: __emutls_v.i: 109*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 4 110*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 4 111*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 0 112*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long __emutls_t.i 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; X32: .section .rodata, 115*9880d681SAndroid Build Coastguard Worker; X32-LABEL: __emutls_t.i: 116*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 15 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; X32: .data{{$}} 119*9880d681SAndroid Build Coastguard Worker; X32-NOT: .globl 120*9880d681SAndroid Build Coastguard Worker; X32-LABEL: __emutls_v.j: 121*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 4 122*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 4 123*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 0 124*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long __emutls_t.j 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; X32: .section .rodata, 127*9880d681SAndroid Build Coastguard Worker; X32-LABEL: __emutls_t.j: 128*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 42 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; X32: .data{{$}} 131*9880d681SAndroid Build Coastguard Worker; X32-NOT: .globl 132*9880d681SAndroid Build Coastguard Worker; X32-LABEL: __emutls_v.k: 133*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 4 134*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 8 135*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 0 136*9880d681SAndroid Build Coastguard Worker; X32-NEXT: .long 0 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; X32-NOT: __emutls_t.k: 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker;;;;; 64-bit targets 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; X64: .data{{$}} 143*9880d681SAndroid Build Coastguard Worker; X64: .globl __emutls_v.i 144*9880d681SAndroid Build Coastguard Worker; X64-LABEL: __emutls_v.i: 145*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 4 146*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 4 147*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 0 148*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad __emutls_t.i 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; X64: .section .rodata, 151*9880d681SAndroid Build Coastguard Worker; X64-LABEL: __emutls_t.i: 152*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 15 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker; X64: .data{{$}} 155*9880d681SAndroid Build Coastguard Worker; X64-NOT: .globl 156*9880d681SAndroid Build Coastguard Worker; X64-LABEL: __emutls_v.j: 157*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 4 158*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 4 159*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 0 160*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad __emutls_t.j 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; X64: .section .rodata, 163*9880d681SAndroid Build Coastguard Worker; X64-LABEL: __emutls_t.j: 164*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 42 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; X64: .data{{$}} 167*9880d681SAndroid Build Coastguard Worker; X64-NOT: .globl 168*9880d681SAndroid Build Coastguard Worker; X64-LABEL: __emutls_v.k: 169*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 4 170*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 8 171*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 0 172*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .quad 0 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker; X64-NOT: __emutls_t.k: 175