Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc -emulated-tls -mtriple=arm-linux-android \
      2 ; RUN:     -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %s
      3 
      4 ; Copied from X86/emutls.ll
      5 
      6 ; Use my_emutls_get_address like __emutls_get_address.
      7 @my_emutls_v_xyz = external global i8*, align 4
      8 declare i8* @my_emutls_get_address(i8*)
      9 
     10 define i32 @my_get_xyz() {
     11 ; ARM32-LABEL: my_get_xyz:
     12 ; ARM32:        ldr r0,
     13 ; ARM32:        ldr r0, [pc, r0]
     14 ; ARM32-NEXT:   bl my_emutls_get_address
     15 ; ARM32-NEXT:   ldr r0, [r0]
     16 ; ARM32:        .long my_emutls_v_xyz(GOT_PREL)
     17 
     18 entry:
     19   %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*))
     20   %0 = bitcast i8* %call to i32*
     21   %1 = load i32, i32* %0, align 4
     22   ret i32 %1
     23 }
     24 
     25 @i1 = thread_local global i32 15
     26 @i2 = external thread_local global i32
     27 @i3 = internal thread_local global i32 15
     28 @i4 = hidden thread_local global i32 15
     29 @i5 = external hidden thread_local global i32
     30 @s1 = thread_local global i16 15
     31 @b1 = thread_local global i8 0
     32 
     33 define i32 @f1() {
     34 ; ARM32-LABEL: f1:
     35 ; ARM32:        ldr r0,
     36 ; ARM32:        ldr r0, [pc, r0]
     37 ; ARM32-NEXT:   bl __emutls_get_address
     38 ; ARM32-NEXT:   ldr r0, [r0]
     39 ; ARM32:        .long __emutls_v.i1(GOT_PREL)
     40 
     41 entry:
     42   %tmp1 = load i32, i32* @i1
     43   ret i32 %tmp1
     44 }
     45 
     46 define i32* @f2() {
     47 ; ARM32-LABEL: f2:
     48 ; ARM32:        ldr r0,
     49 ; ARM32:        ldr r0, [pc, r0]
     50 ; ARM32-NEXT:   bl __emutls_get_address
     51 ; ARM32-NEXT:   pop
     52 ; ARM32:        .long __emutls_v.i1(GOT_PREL)
     53 
     54 entry:
     55   ret i32* @i1
     56 }
     57 
     58 define i32 @f3() nounwind {
     59 ; ARM32-LABEL: f3:
     60 ; ARM32:        ldr r0,
     61 ; ARM32:        ldr r0, [pc, r0]
     62 ; ARM32-NEXT:   bl __emutls_get_address
     63 ; ARM32-NEXT:   ldr r0, [r0]
     64 ; ARM32:        .long __emutls_v.i2(GOT_PREL)
     65 
     66 entry:
     67   %tmp1 = load i32, i32* @i2
     68   ret i32 %tmp1
     69 }
     70 
     71 define i32* @f4() {
     72 ; ARM32-LABEL: f4:
     73 ; ARM32:        ldr r0,
     74 ; ARM32:        ldr r0, [pc, r0]
     75 ; ARM32-NEXT:   bl __emutls_get_address
     76 ; ARM32-NEXT:   pop
     77 ; ARM32:        .long __emutls_v.i2(GOT_PREL)
     78 
     79 entry:
     80   ret i32* @i2
     81 }
     82 
     83 define i32 @f5() nounwind {
     84 ; ARM32-LABEL: f5:
     85 ; ARM32:        ldr r0,
     86 ; ARM32:        add	r0, pc, r0
     87 ; ARM32-NEXT:   bl __emutls_get_address
     88 ; ARM32-NEXT:   ldr r0, [r0]
     89 ; ARM32:        .long __emutls_v.i3-
     90 
     91 entry:
     92   %tmp1 = load i32, i32* @i3
     93   ret i32 %tmp1
     94 }
     95 
     96 define i32* @f6() {
     97 ; ARM32-LABEL: f6:
     98 ; ARM32:        ldr r0,
     99 ; ARM32:        add	r0, pc, r0
    100 ; ARM32-NEXT:   bl __emutls_get_address
    101 ; ARM32-NEXT:   pop
    102 ; ARM32:        .long __emutls_v.i3-
    103 
    104 entry:
    105   ret i32* @i3
    106 }
    107 
    108 define i32 @f7() {
    109 ; ARM32-LABEL: f7:
    110 ; ARM32:        ldr r0,
    111 ; ARM32:        add r0, pc, r0
    112 ; ARM32-NEXT:   bl __emutls_get_address
    113 ; ARM32-NEXT:   ldr r0, [r0]
    114 ; ARM32:        .long __emutls_v.i4-(.LPC
    115 
    116 entry:
    117   %tmp1 = load i32, i32* @i4
    118   ret i32 %tmp1
    119 }
    120 
    121 define i32* @f8() {
    122 ; ARM32-LABEL: f8:
    123 ; ARM32:        ldr r0,
    124 ; ARM32:        add r0, pc, r0
    125 ; ARM32-NEXT:   bl __emutls_get_address
    126 ; ARM32-NEXT:   pop
    127 ; ARM32:        .long __emutls_v.i4-(.LPC
    128 
    129 entry:
    130   ret i32* @i4
    131 }
    132 
    133 define i32 @f9() {
    134 ; ARM32-LABEL: f9:
    135 ; ARM32:        ldr r0,
    136 ; ARM32:        add r0, pc, r0
    137 ; ARM32-NEXT:   bl __emutls_get_address
    138 ; ARM32-NEXT:   ldr r0, [r0]
    139 
    140 entry:
    141   %tmp1 = load i32, i32* @i5
    142   ret i32 %tmp1
    143 }
    144 
    145 define i32* @f10() {
    146 ; ARM32-LABEL: f10:
    147 ; ARM32:        ldr r0,
    148 ; ARM32:        add r0, pc, r0
    149 ; ARM32-NEXT:   bl __emutls_get_address
    150 ; ARM32-NEXT:   pop
    151 
    152 entry:
    153   ret i32* @i5
    154 }
    155 
    156 define i16 @f11() {
    157 ; ARM32-LABEL: f11:
    158 ; ARM32:        ldr r0,
    159 ; ARM32:        ldr r0, [pc, r0]
    160 ; ARM32-NEXT:   bl __emutls_get_address
    161 ; ARM32-NEXT:   ldrh r0, [r0]
    162 
    163 entry:
    164   %tmp1 = load i16, i16* @s1
    165   ret i16 %tmp1
    166 }
    167 
    168 define i32 @f12() {
    169 ; ARM32-LABEL: f12:
    170 ; ARM32:        ldr r0,
    171 ; ARM32:        ldr r0, [pc, r0]
    172 ; ARM32-NEXT:   bl __emutls_get_address
    173 ; ARM32-NEXT:   ldrsh r0, [r0]
    174 
    175 entry:
    176   %tmp1 = load i16, i16* @s1
    177   %tmp2 = sext i16 %tmp1 to i32
    178   ret i32 %tmp2
    179 }
    180 
    181 define i8 @f13() {
    182 ; ARM32-LABEL: f13:
    183 ; ARM32:        ldr r0,
    184 ; ARM32:        ldr r0, [pc, r0]
    185 ; ARM32-NEXT:   bl __emutls_get_address
    186 ; ARM32-NEXT:   ldrb r0, [r0]
    187 ; ARM32-NEXT: pop
    188 
    189 entry:
    190   %tmp1 = load i8, i8* @b1
    191   ret i8 %tmp1
    192 }
    193 
    194 define i32 @f14() {
    195 ; ARM32-LABEL: f14:
    196 ; ARM32:        ldr r0,
    197 ; ARM32:        ldr r0, [pc, r0]
    198 ; ARM32-NEXT:   bl __emutls_get_address
    199 ; ARM32-NEXT:   ldrsb r0, [r0]
    200 ; ARM32-NEXT: pop
    201 
    202 entry:
    203   %tmp1 = load i8, i8* @b1
    204   %tmp2 = sext i8 %tmp1 to i32
    205   ret i32 %tmp2
    206 }
    207 
    208 ;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t.
    209 
    210 ; ARM32:      .data{{$}}
    211 ; ARM32:      .globl __emutls_v.i1
    212 ; ARM32-LABEL: __emutls_v.i1:
    213 ; ARM32-NEXT: .long 4
    214 ; ARM32-NEXT: .long 4
    215 ; ARM32-NEXT: .long 0
    216 ; ARM32-NEXT: .long __emutls_t.i1
    217 
    218 ; ARM32:      .section .rodata,
    219 ; ARM32-LABEL: __emutls_t.i1:
    220 ; ARM32-NEXT: .long 15
    221 
    222 ; ARM32-NOT:   __emutls_v.i2
    223 
    224 ; ARM32:      .data{{$}}
    225 ; ARM32-NOT:  .globl
    226 ; ARM32-LABEL: __emutls_v.i3:
    227 ; ARM32-NEXT: .long 4
    228 ; ARM32-NEXT: .long 4
    229 ; ARM32-NEXT: .long 0
    230 ; ARM32-NEXT: .long __emutls_t.i3
    231 
    232 ; ARM32:      .section .rodata,
    233 ; ARM32-LABEL: __emutls_t.i3:
    234 ; ARM32-NEXT: .long 15
    235 
    236 ; ARM32:      .data{{$}}
    237 ; ARM32:      .globl __emutls_v.i4
    238 ; ARM32-LABEL: __emutls_v.i4:
    239 ; ARM32-NEXT: .long 4
    240 ; ARM32-NEXT: .long 4
    241 ; ARM32-NEXT: .long 0
    242 ; ARM32-NEXT: .long __emutls_t.i4
    243 
    244 ; ARM32:      .section .rodata,
    245 ; ARM32-LABEL: __emutls_t.i4:
    246 ; ARM32-NEXT: .long 15
    247 
    248 ; ARM32-NOT:   __emutls_v.i5:
    249 ; ARM32:      .hidden __emutls_v.i5
    250 ; ARM32-NOT:   __emutls_v.i5:
    251 
    252 ; ARM32:      .data{{$}}
    253 ; ARM32:      .globl __emutls_v.s1
    254 ; ARM32-LABEL: __emutls_v.s1:
    255 ; ARM32-NEXT: .long 2
    256 ; ARM32-NEXT: .long 2
    257 ; ARM32-NEXT: .long 0
    258 ; ARM32-NEXT: .long __emutls_t.s1
    259 
    260 ; ARM32 .section .rodata,
    261 ; ARM32-LABEL: __emutls_t.s1:
    262 ; ARM32-NEXT: .short 15
    263 
    264 ; ARM32:      .data{{$}}
    265 ; ARM32:      .globl __emutls_v.b1
    266 ; ARM32-LABEL: __emutls_v.b1:
    267 ; ARM32-NEXT: .long 1
    268 ; ARM32-NEXT: .long 1
    269 ; ARM32-NEXT: .long 0
    270 ; ARM32-NEXT: .long 0
    271 
    272 ; ARM32-NOT:   __emutls_t.b1
    273