274 lines · plain
1; RUN: llc -emulated-tls -mtriple=arm-linux-android \2; RUN: -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %s3; RUN: llc -mtriple=arm-linux-android \4; RUN: -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %s5 6; Copied from X86/emutls.ll7 8; Use my_emutls_get_address like __emutls_get_address.9@my_emutls_v_xyz = external global ptr, align 410declare ptr @my_emutls_get_address(ptr)11 12define i32 @my_get_xyz() {13; ARM32-LABEL: my_get_xyz:14; ARM32: ldr r0,15; ARM32: ldr r0, [pc, r0]16; ARM32-NEXT: bl my_emutls_get_address17; ARM32-NEXT: ldr r0, [r0]18; ARM32: .long my_emutls_v_xyz(GOT_PREL)19 20entry:21 %call = call ptr @my_emutls_get_address(ptr @my_emutls_v_xyz)22 %0 = load i32, ptr %call, align 423 ret i32 %024}25 26@i1 = thread_local global i32 1527@i2 = external thread_local global i3228@i3 = internal thread_local global i32 1529@i4 = hidden thread_local global i32 1530@i5 = external hidden thread_local global i3231@s1 = thread_local global i16 1532@b1 = thread_local global i8 033 34define i32 @f1() {35; ARM32-LABEL: f1:36; ARM32: ldr r0,37; ARM32: ldr r0, [pc, r0]38; ARM32-NEXT: bl __emutls_get_address39; ARM32-NEXT: ldr r0, [r0]40; ARM32: .long __emutls_v.i1(GOT_PREL)41 42entry:43 %tmp1 = load i32, ptr @i144 ret i32 %tmp145}46 47define ptr @f2() {48; ARM32-LABEL: f2:49; ARM32: ldr r0,50; ARM32: ldr r0, [pc, r0]51; ARM32-NEXT: bl __emutls_get_address52; ARM32-NEXT: pop53; ARM32: .long __emutls_v.i1(GOT_PREL)54 55entry:56 ret ptr @i157}58 59define i32 @f3() nounwind {60; ARM32-LABEL: f3:61; ARM32: ldr r0,62; ARM32: ldr r0, [pc, r0]63; ARM32-NEXT: bl __emutls_get_address64; ARM32-NEXT: ldr r0, [r0]65; ARM32: .long __emutls_v.i2(GOT_PREL)66 67entry:68 %tmp1 = load i32, ptr @i269 ret i32 %tmp170}71 72define ptr @f4() {73; ARM32-LABEL: f4:74; ARM32: ldr r0,75; ARM32: ldr r0, [pc, r0]76; ARM32-NEXT: bl __emutls_get_address77; ARM32-NEXT: pop78; ARM32: .long __emutls_v.i2(GOT_PREL)79 80entry:81 ret ptr @i282}83 84define i32 @f5() nounwind {85; ARM32-LABEL: f5:86; ARM32: ldr r0,87; ARM32: add r0, pc, r088; ARM32-NEXT: bl __emutls_get_address89; ARM32-NEXT: ldr r0, [r0]90; ARM32: .long __emutls_v.i3-91 92entry:93 %tmp1 = load i32, ptr @i394 ret i32 %tmp195}96 97define ptr @f6() {98; ARM32-LABEL: f6:99; ARM32: ldr r0,100; ARM32: add r0, pc, r0101; ARM32-NEXT: bl __emutls_get_address102; ARM32-NEXT: pop103; ARM32: .long __emutls_v.i3-104 105entry:106 ret ptr @i3107}108 109define i32 @f7() {110; ARM32-LABEL: f7:111; ARM32: ldr r0,112; ARM32: add r0, pc, r0113; ARM32-NEXT: bl __emutls_get_address114; ARM32-NEXT: ldr r0, [r0]115; ARM32: .long __emutls_v.i4-(.LPC116 117entry:118 %tmp1 = load i32, ptr @i4119 ret i32 %tmp1120}121 122define ptr @f8() {123; ARM32-LABEL: f8:124; ARM32: ldr r0,125; ARM32: add r0, pc, r0126; ARM32-NEXT: bl __emutls_get_address127; ARM32-NEXT: pop128; ARM32: .long __emutls_v.i4-(.LPC129 130entry:131 ret ptr @i4132}133 134define i32 @f9() {135; ARM32-LABEL: f9:136; ARM32: ldr r0,137; ARM32: add r0, pc, r0138; ARM32-NEXT: bl __emutls_get_address139; ARM32-NEXT: ldr r0, [r0]140 141entry:142 %tmp1 = load i32, ptr @i5143 ret i32 %tmp1144}145 146define ptr @f10() {147; ARM32-LABEL: f10:148; ARM32: ldr r0,149; ARM32: add r0, pc, r0150; ARM32-NEXT: bl __emutls_get_address151; ARM32-NEXT: pop152 153entry:154 ret ptr @i5155}156 157define i16 @f11() {158; ARM32-LABEL: f11:159; ARM32: ldr r0,160; ARM32: ldr r0, [pc, r0]161; ARM32-NEXT: bl __emutls_get_address162; ARM32-NEXT: ldrh r0, [r0]163 164entry:165 %tmp1 = load i16, ptr @s1166 ret i16 %tmp1167}168 169define i32 @f12() {170; ARM32-LABEL: f12:171; ARM32: ldr r0,172; ARM32: ldr r0, [pc, r0]173; ARM32-NEXT: bl __emutls_get_address174; ARM32-NEXT: ldrsh r0, [r0]175 176entry:177 %tmp1 = load i16, ptr @s1178 %tmp2 = sext i16 %tmp1 to i32179 ret i32 %tmp2180}181 182define i8 @f13() {183; ARM32-LABEL: f13:184; ARM32: ldr r0,185; ARM32: ldr r0, [pc, r0]186; ARM32-NEXT: bl __emutls_get_address187; ARM32-NEXT: ldrb r0, [r0]188; ARM32-NEXT: pop189 190entry:191 %tmp1 = load i8, ptr @b1192 ret i8 %tmp1193}194 195define i32 @f14() {196; ARM32-LABEL: f14:197; ARM32: ldr r0,198; ARM32: ldr r0, [pc, r0]199; ARM32-NEXT: bl __emutls_get_address200; ARM32-NEXT: ldrsb r0, [r0]201; ARM32-NEXT: pop202 203entry:204 %tmp1 = load i8, ptr @b1205 %tmp2 = sext i8 %tmp1 to i32206 ret i32 %tmp2207}208 209;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t.210 211; ARM32: .data{{$}}212; ARM32: .globl __emutls_v.i1213; ARM32-LABEL: __emutls_v.i1:214; ARM32-NEXT: .long 4215; ARM32-NEXT: .long 4216; ARM32-NEXT: .long 0217; ARM32-NEXT: .long __emutls_t.i1218 219; ARM32: .section .rodata,220; ARM32-LABEL: __emutls_t.i1:221; ARM32-NEXT: .long 15222 223; ARM32-NOT: __emutls_v.i2224 225; ARM32: .data{{$}}226; ARM32-NOT: .globl227; ARM32-LABEL: __emutls_v.i3:228; ARM32-NEXT: .long 4229; ARM32-NEXT: .long 4230; ARM32-NEXT: .long 0231; ARM32-NEXT: .long __emutls_t.i3232 233; ARM32: .section .rodata,234; ARM32-LABEL: __emutls_t.i3:235; ARM32-NEXT: .long 15236 237; ARM32: .data{{$}}238; ARM32: .globl __emutls_v.i4239; ARM32-LABEL: __emutls_v.i4:240; ARM32-NEXT: .long 4241; ARM32-NEXT: .long 4242; ARM32-NEXT: .long 0243; ARM32-NEXT: .long __emutls_t.i4244 245; ARM32: .section .rodata,246; ARM32-LABEL: __emutls_t.i4:247; ARM32-NEXT: .long 15248 249; ARM32-NOT: __emutls_v.i5:250; ARM32: .hidden __emutls_v.i5251; ARM32-NOT: __emutls_v.i5:252 253; ARM32: .data{{$}}254; ARM32: .globl __emutls_v.s1255; ARM32-LABEL: __emutls_v.s1:256; ARM32-NEXT: .long 2257; ARM32-NEXT: .long 2258; ARM32-NEXT: .long 0259; ARM32-NEXT: .long __emutls_t.s1260 261; ARM32: .section .rodata,262; ARM32-LABEL: __emutls_t.s1:263; ARM32-NEXT: .short 15264 265; ARM32: .data{{$}}266; ARM32: .globl __emutls_v.b1267; ARM32-LABEL: __emutls_v.b1:268; ARM32-NEXT: .long 1269; ARM32-NEXT: .long 1270; ARM32-NEXT: .long 0271; ARM32-NEXT: .long 0272 273; ARM32-NOT: __emutls_t.b1274