1; RUN: llc < %s -emulated-tls -mtriple=i386-linux-gnu | FileCheck -check-prefix=X86 %s 2; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=X64 %s 3; RUN: llc < %s -emulated-tls -mtriple=i386-linux-android | FileCheck -check-prefix=X86 %s 4; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android | FileCheck -check-prefix=X64 %s 5 6; RUN: llc < %s -mtriple=i386-linux-gnu | FileCheck -check-prefix=NoEMU %s 7; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=NoEMU %s 8; RUN: llc < %s -mtriple=i386-linux-android | FileCheck -check-prefix=X86 %s 9; RUN: llc < %s -mtriple=x86_64-linux-android | FileCheck -check-prefix=X64 %s 10 11; Copied from tls.ll; emulated TLS model is not implemented 12; for *-pc-win32 and *-pc-windows targets yet. 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 dso_local i32 @my_get_xyz() { 21; X86-LABEL: my_get_xyz: 22; X86: movl $my_emutls_v_xyz, (%esp) 23; X86-NEXT: calll my_emutls_get_address 24; X86-NEXT: movl (%eax), %eax 25; X86-NEXT: addl $12, %esp 26; X86-NEXT: .cfi_def_cfa_offset 4 27; X86-NEXT: retl 28; 29; X64-LABEL: my_get_xyz: 30; X64: movq my_emutls_v_xyz@GOTPCREL(%rip), %rdi 31; X64-NEXT: callq my_emutls_get_address 32; X64-NEXT: movl (%rax), %eax 33; X64-NEXT: popq %rcx 34; X64-NEXT: .cfi_def_cfa_offset 8 35; X64-NEXT: retq 36entry: 37 %call = call ptr @my_emutls_get_address(ptr @my_emutls_v_xyz) 38 %0 = load i32, ptr %call, align 4 39 ret i32 %0 40} 41 42@i1 = dso_local thread_local global i32 15 43@i2 = external thread_local global i32 44@i3 = internal thread_local global i32 15 45@i4 = hidden thread_local global i32 15 46@i5 = external hidden thread_local global i32 47@s1 = dso_local thread_local global i16 15 48@b1 = dso_local thread_local global i8 0 49 50define dso_local i32 @f1() { 51; X86-LABEL: f1: 52; X86: movl $__emutls_v.i1, (%esp) 53; X86-NEXT: calll __emutls_get_address 54; X86-NEXT: movl (%eax), %eax 55; X86-NEXT: addl $12, %esp 56; X86-NEXT: .cfi_def_cfa_offset 4 57; X86-NEXT: retl 58; 59; X64-LABEL: f1: 60; X64: movl $__emutls_v.i1, %edi 61; X64-NEXT: callq __emutls_get_address 62; X64-NEXT: movl (%rax), %eax 63; X64-NEXT: popq %rcx 64; X64-NEXT: .cfi_def_cfa_offset 8 65; X64-NEXT: retq 66entry: 67 %tmp1 = load i32, ptr @i1 68 ret i32 %tmp1 69} 70 71define dso_local ptr @f2() { 72; X86-LABEL: f2: 73; X86: movl $__emutls_v.i1, (%esp) 74; X86-NEXT: calll __emutls_get_address 75; X86-NEXT: addl $12, %esp 76; X86-NEXT: .cfi_def_cfa_offset 4 77; X86-NEXT: retl 78; 79; X64-LABEL: f2: 80; X64: movl $__emutls_v.i1, %edi 81; X64-NEXT: callq __emutls_get_address 82; X64-NEXT: popq %rcx 83; X64-NEXT: .cfi_def_cfa_offset 8 84; X64-NEXT: retq 85entry: 86 ret ptr @i1 87} 88 89define dso_local i32 @f3() nounwind { 90; X86-LABEL: f3: 91; X86: movl $__emutls_v.i2, (%esp) 92; X86-NEXT: calll __emutls_get_address 93; X86-NEXT: movl (%eax), %eax 94; X86-NEXT: addl $12, %esp 95; X86-NEXT: retl 96entry: 97 %tmp1 = load i32, ptr @i2 98 ret i32 %tmp1 99} 100 101define dso_local ptr @f4() { 102; X86-LABEL: f4: 103; X86: movl $__emutls_v.i2, (%esp) 104; X86-NEXT: calll __emutls_get_address 105; X86-NEXT: addl $12, %esp 106; X86-NEXT: .cfi_def_cfa_offset 4 107; X86-NEXT: retl 108entry: 109 ret ptr @i2 110} 111 112define dso_local i32 @f5() nounwind { 113; X86-LABEL: f5: 114; X86: movl $__emutls_v.i3, (%esp) 115; X86-NEXT: calll __emutls_get_address 116; X86-NEXT: movl (%eax), %eax 117; X86-NEXT: addl $12, %esp 118; X86-NEXT: retl 119entry: 120 %tmp1 = load i32, ptr @i3 121 ret i32 %tmp1 122} 123 124define dso_local ptr @f6() { 125; X86-LABEL: f6: 126; X86: movl $__emutls_v.i3, (%esp) 127; X86-NEXT: calll __emutls_get_address 128; X86-NEXT: addl $12, %esp 129; X86-NEXT: .cfi_def_cfa_offset 4 130; X86-NEXT: retl 131entry: 132 ret ptr @i3 133} 134 135define dso_local i32 @f7() { 136; X86-LABEL: f7: 137; X86: movl $__emutls_v.i4, (%esp) 138; X86-NEXT: calll __emutls_get_address 139; X86-NEXT: movl (%eax), %eax 140; X86-NEXT: addl $12, %esp 141; X86-NEXT: .cfi_def_cfa_offset 4 142; X86-NEXT: retl 143entry: 144 %tmp1 = load i32, ptr @i4 145 ret i32 %tmp1 146} 147 148define dso_local ptr @f8() { 149; X86-LABEL: f8: 150; X86: movl $__emutls_v.i4, (%esp) 151; X86-NEXT: calll __emutls_get_address 152; X86-NEXT: addl $12, %esp 153; X86-NEXT: .cfi_def_cfa_offset 4 154; X86-NEXT: retl 155entry: 156 ret ptr @i4 157} 158 159define dso_local i32 @f9() { 160; X86-LABEL: f9: 161; X86: movl $__emutls_v.i5, (%esp) 162; X86-NEXT: calll __emutls_get_address 163; X86-NEXT: movl (%eax), %eax 164; X86-NEXT: addl $12, %esp 165; X86-NEXT: .cfi_def_cfa_offset 4 166; X86-NEXT: retl 167entry: 168 %tmp1 = load i32, ptr @i5 169 ret i32 %tmp1 170} 171 172define dso_local ptr @f10() { 173; X86-LABEL: f10: 174; X86: movl $__emutls_v.i5, (%esp) 175; X86-NEXT: calll __emutls_get_address 176; X86-NEXT: addl $12, %esp 177; X86-NEXT: .cfi_def_cfa_offset 4 178; X86-NEXT: retl 179entry: 180 ret ptr @i5 181} 182 183define dso_local i16 @f11() { 184; X86-LABEL: f11: 185; X86: movl $__emutls_v.s1, (%esp) 186; X86-NEXT: calll __emutls_get_address 187; X86-NEXT: movzwl (%eax), %eax 188; X86-NEXT: addl $12, %esp 189; X86-NEXT: .cfi_def_cfa_offset 4 190; X86-NEXT: retl 191entry: 192 %tmp1 = load i16, ptr @s1 193 ret i16 %tmp1 194} 195 196define dso_local i32 @f12() { 197; X86-LABEL: f12: 198; X86: movl $__emutls_v.s1, (%esp) 199; X86-NEXT: calll __emutls_get_address 200; X86-NEXT: movswl (%eax), %eax 201; X86-NEXT: addl $12, %esp 202; X86-NEXT: .cfi_def_cfa_offset 4 203; X86-NEXT: retl 204entry: 205 %tmp1 = load i16, ptr @s1 206 %tmp2 = sext i16 %tmp1 to i32 207 ret i32 %tmp2 208} 209 210define dso_local i8 @f13() { 211; X86-LABEL: f13: 212; X86: movl $__emutls_v.b1, (%esp) 213; X86-NEXT: calll __emutls_get_address 214; X86-NEXT: movzbl (%eax), %eax 215; X86-NEXT: addl $12, %esp 216; X86-NEXT: .cfi_def_cfa_offset 4 217; X86-NEXT: retl 218entry: 219 %tmp1 = load i8, ptr @b1 220 ret i8 %tmp1 221} 222 223define dso_local i32 @f14() { 224; X86-LABEL: f14: 225; X86: movl $__emutls_v.b1, (%esp) 226; X86-NEXT: calll __emutls_get_address 227; X86-NEXT: movsbl (%eax), %eax 228; X86-NEXT: addl $12, %esp 229; X86-NEXT: .cfi_def_cfa_offset 4 230; X86-NEXT: retl 231entry: 232 %tmp1 = load i8, ptr @b1 233 %tmp2 = sext i8 %tmp1 to i32 234 ret i32 %tmp2 235} 236 237;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t. 238 239; X86-LABEL: __emutls_v.i1: 240; X86-NEXT: .long 4 241; X86-NEXT: .long 4 242; X86-NEXT: .long 0 243; X86-NEXT: .long __emutls_t.i1 244 245; X86-LABEL: __emutls_t.i1: 246; X86-NEXT: .long 15 247 248; X86-NOT: __emutls_v.i2 249 250; X86-LABEL: __emutls_v.i3: 251; X86-NEXT: .long 4 252; X86-NEXT: .long 4 253; X86-NEXT: .long 0 254; X86-NEXT: .long __emutls_t.i3 255 256; X86-LABEL: __emutls_t.i3: 257; X86-NEXT: .long 15 258 259; X86-LABEL: __emutls_v.i4: 260; X86-NEXT: .long 4 261; X86-NEXT: .long 4 262; X86-NEXT: .long 0 263; X86-NEXT: .long __emutls_t.i4 264 265; X86-LABEL: __emutls_t.i4: 266; X86-NEXT: .long 15 267 268; X86-NOT: __emutls_v.i5: 269; X86: .hidden __emutls_v.i5 270; X86-NOT: __emutls_v.i5: 271 272; X86-LABEL: __emutls_v.s1: 273; X86-NEXT: .long 2 274; X86-NEXT: .long 2 275; X86-NEXT: .long 0 276; X86-NEXT: .long __emutls_t.s1 277 278; X86-LABEL: __emutls_t.s1: 279; X86-NEXT: .short 15 280 281; X86-LABEL: __emutls_v.b1: 282; X86-NEXT: .long 1 283; X86-NEXT: .long 1 284; X86-NEXT: .long 0 285; X86-NEXT: .long 0 286 287; X86-NOT: __emutls_t.b1 288 289;;;;;;;;;;;;;; 64-bit __emutls_v. and __emutls_t. 290 291; X64-LABEL: __emutls_v.i1: 292; X64-NEXT: .quad 4 293; X64-NEXT: .quad 4 294; X64-NEXT: .quad 0 295; X64-NEXT: .quad __emutls_t.i1 296 297; X64-LABEL: __emutls_t.i1: 298; X64-NEXT: .long 15 299 300; X64-NOT: __emutls_v.i2 301 302; X64-LABEL: __emutls_v.i3: 303; X64-NEXT: .quad 4 304; X64-NEXT: .quad 4 305; X64-NEXT: .quad 0 306; X64-NEXT: .quad __emutls_t.i3 307 308; X64-LABEL: __emutls_t.i3: 309; X64-NEXT: .long 15 310 311; X64-LABEL: __emutls_v.i4: 312; X64-NEXT: .quad 4 313; X64-NEXT: .quad 4 314; X64-NEXT: .quad 0 315; X64-NEXT: .quad __emutls_t.i4 316 317; X64-LABEL: __emutls_t.i4: 318; X64-NEXT: .long 15 319 320; X64-NOT: __emutls_v.i5: 321; X64: .hidden __emutls_v.i5 322; X64-NOT: __emutls_v.i5: 323 324; X64-LABEL: __emutls_v.s1: 325; X64-NEXT: .quad 2 326; X64-NEXT: .quad 2 327; X64-NEXT: .quad 0 328; X64-NEXT: .quad __emutls_t.s1 329 330; X64-LABEL: __emutls_t.s1: 331; X64-NEXT: .short 15 332 333; X64-LABEL: __emutls_v.b1: 334; X64-NEXT: .quad 1 335; X64-NEXT: .quad 1 336; X64-NEXT: .quad 0 337; X64-NEXT: .quad 0 338 339; X64-NOT: __emutls_t.b1 340