156 lines · plain
1; RUN: llc -mtriple=arm-linux-gnueabi < %s \2; RUN: | FileCheck -check-prefix=CHECK-NONPIC -check-prefix=COMMON %s3; RUN: llc -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \4; RUN: | FileCheck -check-prefix=CHECK-PIC -check-prefix=COMMON %s5; RUN: llc -emulated-tls -mtriple=arm-linux-gnueabi < %s \6; RUN: | FileCheck -check-prefix=EMU -check-prefix=COMMON %s7; RUN: llc -emulated-tls -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \8; RUN: | FileCheck -check-prefix=EMU -check-prefix=COMMON %s9 10 11@external_gd = external thread_local global i3212@internal_gd = internal thread_local global i32 4213 14@external_ld = external thread_local(localdynamic) global i3215@internal_ld = internal thread_local(localdynamic) global i32 4216 17@external_ie = external thread_local(initialexec) global i3218@internal_ie = internal thread_local(initialexec) global i32 4219 20@external_le = external thread_local(localexec) global i3221@internal_le = internal thread_local(localexec) global i32 4222 23; ----- no model specified -----24 25define ptr @f1() {26entry:27 ret ptr @external_gd28 29 ; COMMON-LABEL: f1:30 ; Non-PIC code can use initial-exec, PIC code has to use general dynamic.31 ; CHECK-NONPIC: external_gd(GOTTPOFF)32 ; CHECK-PIC: external_gd(TLSGD)33 ; EMU: __emutls_get_address34}35 36define ptr @f2() {37entry:38 ret ptr @internal_gd39 40 ; COMMON-LABEL: f2:41 ; Non-PIC code can use local exec, PIC code can use local dynamic,42 ; but that is not implemented, so falls back to general dynamic.43 ; CHECK-NONPIC: internal_gd(TPOFF)44 ; CHECK-PIC: internal_gd(TLSGD)45 ; EMU: __emutls_get_address46}47 48 49; ----- localdynamic specified -----50 51define ptr @f3() {52entry:53 ret ptr @external_ld54 55 ; COMMON-LABEL: f3:56 ; Non-PIC code can use initial exec, PIC should use local dynamic,57 ; but that is not implemented, so falls back to general dynamic.58 ; CHECK-NONPIC: external_ld(GOTTPOFF)59 ; CHECK-PIC: external_ld(TLSGD)60 ; EMU: __emutls_get_address61}62 63define ptr @f4() {64entry:65 ret ptr @internal_ld66 67 ; COMMON-LABEL: f4:68 ; Non-PIC code can use local exec, PIC code can use local dynamic,69 ; but that is not implemented, so it falls back to general dynamic.70 ; CHECK-NONPIC: internal_ld(TPOFF)71 ; CHECK-PIC: internal_ld(TLSGD)72 ; EMU: __emutls_get_address73}74 75 76; ----- initialexec specified -----77 78define ptr @f5() {79entry:80 ret ptr @external_ie81 82 ; COMMON-LABEL: f5:83 ; Non-PIC and PIC code will use initial exec as specified.84 ; CHECK-NONPIC: external_ie(GOTTPOFF)85 ; CHECK-PIC: external_ie(GOTTPOFF)86 ; EMU: __emutls_get_address87}88 89define ptr @f6() {90entry:91 ret ptr @internal_ie92 93 ; COMMON-LABEL: f6:94 ; Non-PIC code can use local exec, PIC code use initial exec as specified.95 ; CHECK-NONPIC: internal_ie(TPOFF)96 ; CHECK-PIC: internal_ie(GOTTPOFF)97 ; EMU: __emutls_get_address98}99 100 101; ----- localexec specified -----102 103define ptr @f7() {104entry:105 ret ptr @external_le106 107 ; COMMON-LABEL: f7:108 ; Non-PIC and PIC code will use local exec as specified.109 ; CHECK-NONPIC: external_le(TPOFF)110 ; CHECK-PIC: external_le(TPOFF)111 ; EMU: __emutls_get_address112}113 114define ptr @f8() {115entry:116 ret ptr @internal_le117 118 ; COMMON-LABEL: f8:119 ; Non-PIC and PIC code will use local exec as specified.120 ; CHECK-NONPIC: internal_le(TPOFF)121 ; CHECK-PIC: internal_le(TPOFF)122 ; EMU: __emutls_get_address123}124 125 126; ----- emulated specified -----127 128; External declaration has no initializer.129; Internal definition has initializer.130 131; EMU-NOT: __emutls_t.external_gd132; EMU-NOT: __emutls_v.external_gd133; EMU: .p2align 2134; EMU-LABEL: __emutls_v.internal_gd:135; EMU-NEXT: .long 4136; EMU-NEXT: .long 4137; EMU-NEXT: .long 0138; EMU-NEXT: .long __emutls_t.internal_gd139; EMU-LABEL: __emutls_t.internal_gd:140; EMU-NEXT: .long 42141; EMU-NOT: __emutls_t.external_gd142 143; __emutls_t and __emutls_v are the same for PIC and non-PIC modes.144 145; EMU-NOT: __emutls_t.external_gd146; EMU-NOT: __emutls_v.external_gd147; EMU: .p2align 2148; EMU-LABEL: __emutls_v.internal_le:149; EMU-NEXT: .long 4150; EMU-NEXT: .long 4151; EMU-NEXT: .long 0152; EMU-NEXT: .long __emutls_t.internal_le153; EMU-LABEL: __emutls_t.internal_le:154; EMU-NEXT: .long 42155; EMU-NOT: __emutls_t.external_le156