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