1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm -mtriple=arm-linux-gnueabi < %s \ 2*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=CHECK-NONPIC -check-prefix=COMMON %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \ 4*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=CHECK-PIC -check-prefix=COMMON %s 5*9880d681SAndroid Build Coastguard Worker; RUN: llc -emulated-tls -march=arm -mtriple=arm-linux-gnueabi < %s \ 6*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=EMUNONPIC -check-prefix=EMU -check-prefix=COMMON %s 7*9880d681SAndroid Build Coastguard Worker; RUN: llc -emulated-tls -march=arm -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \ 8*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck -check-prefix=EMUPIC -check-prefix=EMU -check-prefix=COMMON %s 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker@external_gd = external thread_local global i32 12*9880d681SAndroid Build Coastguard Worker@internal_gd = internal thread_local global i32 42 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker@external_ld = external thread_local(localdynamic) global i32 15*9880d681SAndroid Build Coastguard Worker@internal_ld = internal thread_local(localdynamic) global i32 42 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker@external_ie = external thread_local(initialexec) global i32 18*9880d681SAndroid Build Coastguard Worker@internal_ie = internal thread_local(initialexec) global i32 42 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker@external_le = external thread_local(localexec) global i32 21*9880d681SAndroid Build Coastguard Worker@internal_le = internal thread_local(localexec) global i32 42 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; ----- no model specified ----- 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine i32* @f1() { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker ret i32* @external_gd 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f1: 30*9880d681SAndroid Build Coastguard Worker ; Non-PIC code can use initial-exec, PIC code has to use general dynamic. 31*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: external_gd(GOTTPOFF) 32*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: external_gd(TLSGD) 33*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine i32* @f2() { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker ret i32* @internal_gd 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f2: 41*9880d681SAndroid Build Coastguard Worker ; Non-PIC code can use local exec, PIC code can use local dynamic, 42*9880d681SAndroid Build Coastguard Worker ; but that is not implemented, so falls back to general dynamic. 43*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: internal_gd(TPOFF) 44*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: internal_gd(TLSGD) 45*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; ----- localdynamic specified ----- 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine i32* @f3() { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker ret i32* @external_ld 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f3: 56*9880d681SAndroid Build Coastguard Worker ; Non-PIC code can use initial exec, PIC should use local dynamic, 57*9880d681SAndroid Build Coastguard Worker ; but that is not implemented, so falls back to general dynamic. 58*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: external_ld(GOTTPOFF) 59*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: external_ld(TLSGD) 60*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine i32* @f4() { 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker ret i32* @internal_ld 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f4: 68*9880d681SAndroid Build Coastguard Worker ; Non-PIC code can use local exec, PIC code can use local dynamic, 69*9880d681SAndroid Build Coastguard Worker ; but that is not implemented, so it falls back to general dynamic. 70*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: internal_ld(TPOFF) 71*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: internal_ld(TLSGD) 72*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; ----- initialexec specified ----- 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i32* @f5() { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker ret i32* @external_ie 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f5: 83*9880d681SAndroid Build Coastguard Worker ; Non-PIC and PIC code will use initial exec as specified. 84*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: external_ie(GOTTPOFF) 85*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: external_ie(GOTTPOFF) 86*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine i32* @f6() { 90*9880d681SAndroid Build Coastguard Workerentry: 91*9880d681SAndroid Build Coastguard Worker ret i32* @internal_ie 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f6: 94*9880d681SAndroid Build Coastguard Worker ; Non-PIC code can use local exec, PIC code use initial exec as specified. 95*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: internal_ie(TPOFF) 96*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: internal_ie(GOTTPOFF) 97*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; ----- localexec specified ----- 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine i32* @f7() { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker ret i32* @external_le 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f7: 108*9880d681SAndroid Build Coastguard Worker ; Non-PIC and PIC code will use local exec as specified. 109*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: external_le(TPOFF) 110*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: external_le(TPOFF) 111*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine i32* @f8() { 115*9880d681SAndroid Build Coastguard Workerentry: 116*9880d681SAndroid Build Coastguard Worker ret i32* @internal_le 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker ; COMMON-LABEL: f8: 119*9880d681SAndroid Build Coastguard Worker ; Non-PIC and PIC code will use local exec as specified. 120*9880d681SAndroid Build Coastguard Worker ; CHECK-NONPIC: internal_le(TPOFF) 121*9880d681SAndroid Build Coastguard Worker ; CHECK-PIC: internal_le(TPOFF) 122*9880d681SAndroid Build Coastguard Worker ; EMU: __emutls_get_address 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; ----- emulated specified ----- 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; External declaration has no initializer. 129*9880d681SAndroid Build Coastguard Worker; Internal definition has initializer. 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; EMU-NOT: __emutls_t.external_gd 132*9880d681SAndroid Build Coastguard Worker; EMU-NOT: __emutls_v.external_gd 133*9880d681SAndroid Build Coastguard Worker; EMU: .p2align 2 134*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_v.internal_gd: 135*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 4 136*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 4 137*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 0 138*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long __emutls_t.internal_gd 139*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_t.internal_gd: 140*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 42 141*9880d681SAndroid Build Coastguard Worker; EMU-NOT: __emutls_t.external_gd 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; __emutls_t and __emutls_v are the same for PIC and non-PIC modes. 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; EMU-NOT: __emutls_t.external_gd 146*9880d681SAndroid Build Coastguard Worker; EMU-NOT: __emutls_v.external_gd 147*9880d681SAndroid Build Coastguard Worker; EMU: .p2align 2 148*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_v.internal_le: 149*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 4 150*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 4 151*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 0 152*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long __emutls_t.internal_le 153*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_t.internal_le: 154*9880d681SAndroid Build Coastguard Worker; EMU-NEXT: .long 42 155*9880d681SAndroid Build Coastguard Worker; EMU-NOT: __emutls_t.external_le 156