1; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=X64 %s 2; RUN: llc < %s -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X64_PIC %s 3; RUN: llc < %s -mtriple=i386-linux-gnu | FileCheck -check-prefix=X32 %s 4; RUN: llc < %s -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X32_PIC %s 5 6; Darwin always uses the same model. 7; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck -check-prefix=DARWIN %s 8; RUN: llc < %s -mtriple=x86_64-apple-darwin -code-model=large | FileCheck -check-prefix=DARWIN %s 9 10@external_gd = external thread_local global i32 11@internal_gd = internal thread_local global i32 42 12 13@external_ld = external thread_local(localdynamic) global i32 14@internal_ld = internal thread_local(localdynamic) global i32 42 15 16@external_ie = external thread_local(initialexec) global i32 17@internal_ie = internal thread_local(initialexec) global i32 42 18 19@external_le = external thread_local(localexec) global i32 20@internal_le = internal thread_local(localexec) global i32 42 21 22; See test cases for emulated model in emutls.ll, emutls-pic.ll and emutls-pie.ll. 23 24; ----- no model specified ----- 25 26define ptr @f1() { 27entry: 28 ret ptr @external_gd 29 30 ; Non-PIC code can use initial-exec, PIC code has to use general dynamic. 31 ; X64-LABEL: f1: 32 ; X64: external_gd@GOTTPOFF 33 ; X32-LABEL: f1: 34 ; X32: external_gd@INDNTPOFF 35 ; X64_PIC-LABEL: f1: 36 ; X64_PIC: external_gd@TLSGD 37 ; X32_PIC-LABEL: f1: 38 ; X32_PIC: external_gd@TLSGD 39 ; DARWIN-LABEL: f1: 40 ; DARWIN: _external_gd@TLVP 41} 42 43define ptr @f2() { 44entry: 45 ret ptr @internal_gd 46 47 ; Non-PIC code can use local exec, PIC code can use local dynamic. 48 ; X64-LABEL: f2: 49 ; X64: internal_gd@TPOFF 50 ; X32-LABEL: f2: 51 ; X32: internal_gd@NTPOFF 52 ; X64_PIC-LABEL: f2: 53 ; X64_PIC: internal_gd@TLSLD 54 ; X32_PIC-LABEL: f2: 55 ; X32_PIC: internal_gd@TLSLDM 56 ; DARWIN-LABEL: f2: 57 ; DARWIN: _internal_gd@TLVP 58} 59 60 61; ----- localdynamic specified ----- 62 63define ptr @f3() { 64entry: 65 ret ptr @external_ld 66 67 ; Non-PIC code can use initial exec, PIC code use local dynamic as specified. 68 ; X64-LABEL: f3: 69 ; X64: external_ld@GOTTPOFF 70 ; X32-LABEL: f3: 71 ; X32: external_ld@INDNTPOFF 72 ; X64_PIC-LABEL: f3: 73 ; X64_PIC: external_ld@TLSLD 74 ; X32_PIC-LABEL: f3: 75 ; X32_PIC: external_ld@TLSLDM 76 ; DARWIN-LABEL: f3: 77 ; DARWIN: _external_ld@TLVP 78} 79 80define ptr @f4() { 81entry: 82 ret ptr @internal_ld 83 84 ; Non-PIC code can use local exec, PIC code can use local dynamic. 85 ; X64-LABEL: f4: 86 ; X64: internal_ld@TPOFF 87 ; X32-LABEL: f4: 88 ; X32: internal_ld@NTPOFF 89 ; X64_PIC-LABEL: f4: 90 ; X64_PIC: internal_ld@TLSLD 91 ; X32_PIC-LABEL: f4: 92 ; X32_PIC: internal_ld@TLSLDM 93 ; DARWIN-LABEL: f4: 94 ; DARWIN: _internal_ld@TLVP 95} 96 97 98; ----- initialexec specified ----- 99 100define ptr @f5() { 101entry: 102 ret ptr @external_ie 103 104 ; Non-PIC and PIC code will use initial exec as specified. 105 ; X64-LABEL: f5: 106 ; X64: external_ie@GOTTPOFF 107 ; X32-LABEL: f5: 108 ; X32: external_ie@INDNTPOFF 109 ; X64_PIC-LABEL: f5: 110 ; X64_PIC: external_ie@GOTTPOFF 111 ; X32_PIC-LABEL: f5: 112 ; X32_PIC: external_ie@GOTNTPOFF 113 ; DARWIN-LABEL: f5: 114 ; DARWIN: _external_ie@TLVP 115} 116 117define ptr @f6() { 118entry: 119 ret ptr @internal_ie 120 121 ; Non-PIC code can use local exec, PIC code use initial exec as specified. 122 ; X64-LABEL: f6: 123 ; X64: internal_ie@TPOFF 124 ; X32-LABEL: f6: 125 ; X32: internal_ie@NTPOFF 126 ; X64_PIC-LABEL: f6: 127 ; X64_PIC: internal_ie@GOTTPOFF 128 ; X32_PIC-LABEL: f6: 129 ; X32_PIC: internal_ie@GOTNTPOFF 130 ; DARWIN-LABEL: f6: 131 ; DARWIN: _internal_ie@TLVP 132} 133 134define i32 @PR22083() { 135entry: 136 ret i32 ptrtoint (ptr @external_ie to i32) 137 ; X64-LABEL: PR22083: 138 ; X64: movq external_ie@GOTTPOFF(%rip), %rax 139 ; X64_PIC-LABEL: PR22083: 140 ; X64_PIC: movq external_ie@GOTTPOFF(%rip), %rax 141} 142 143; ----- localexec specified ----- 144 145define ptr @f7() { 146entry: 147 ret ptr @external_le 148 149 ; Non-PIC and PIC code will use local exec as specified. 150 ; X64-LABEL: f7: 151 ; X64: external_le@TPOFF 152 ; X32-LABEL: f7: 153 ; X32: external_le@NTPOFF 154 ; X64_PIC-LABEL: f7: 155 ; X64_PIC: external_le@TPOFF 156 ; X32_PIC-LABEL: f7: 157 ; X32_PIC: external_le@NTPOFF 158 ; DARWIN-LABEL: f7: 159 ; DARWIN: _external_le@TLVP 160} 161 162define ptr @f8() { 163entry: 164 ret ptr @internal_le 165 166 ; Non-PIC and PIC code will use local exec as specified. 167 ; X64-LABEL: f8: 168 ; X64: internal_le@TPOFF 169 ; X32-LABEL: f8: 170 ; X32: internal_le@NTPOFF 171 ; X64_PIC-LABEL: f8: 172 ; X64_PIC: internal_le@TPOFF 173 ; X32_PIC-LABEL: f8: 174 ; X32_PIC: internal_le@NTPOFF 175 ; DARWIN-LABEL: f8: 176 ; DARWIN: _internal_le@TLVP 177} 178