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