183 lines · plain
1; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - -fast-isel %s | FileCheck %s --check-prefix=T2-MOVT-PIC2; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -mattr=+no-movt | FileCheck %s --check-prefix=T2-LIT-PIC3; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -relocation-model=static | FileCheck %s --check-prefix=T2-MOVT-STATIC4; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -mattr=+no-movt -relocation-model=static | FileCheck %s --check-prefix=T2-LIT-STATIC5; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s | FileCheck %s --check-prefix=ARM-MOVT-PIC6; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -mattr=+no-movt | FileCheck %s --check-prefix=ARM-LIT-PIC7; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -relocation-model=static | FileCheck %s --check-prefix=ARM-MOVT-STATIC8; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -mattr=+no-movt -relocation-model=static | FileCheck %s --check-prefix=ARM-LIT-STATIC9 10 11@local_tls_var = thread_local global i32 012@external_tls_var = external thread_local global i3213@hidden_external_tls_var = external hidden thread_local global i3214 15 16define i32 @test_local_tls() {17; T2-MOVT-PIC-LABEL: test_local_tls:18; T2-MOVT-PIC: movw r0, :lower16:(_local_tls_var-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+4))19; T2-MOVT-PIC: movt r0, :upper16:(_local_tls_var-([[PCREL_LOC]]+4))20; T2-MOVT-PIC: [[PCREL_LOC]]:21; T2-MOVT-PIC-NEXT: add r0, pc22; T2-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]23; T2-MOVT-PIC: blx [[TLV_GET_ADDR]]24; T2-MOVT-PIC: ldr r0, [r0]25 26; T2-LIT-PIC-LABEL: test_local_tls:27; T2-LIT-PIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]28; T2-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:29; T2-LIT-PIC-NEXT: add r0, pc30; T2-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]31; T2-LIT-PIC: blx [[TLV_GET_ADDR]]32; T2-LIT-PIC: ldr r0, [r0]33; T2-LIT-PIC: [[LOCAL_VAR_ADDR]]:34; T2-LIT-PIC-NEXT: .long _local_tls_var-([[PCREL_LOC]]+4)35 36; T2-MOVT-STATIC-LABEL: test_local_tls:37; T2-MOVT-STATIC: movw r0, :lower16:_local_tls_var38; T2-MOVT-STATIC: movt r0, :upper16:_local_tls_var39; T2-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]40; T2-MOVT-STATIC: blx [[TLV_GET_ADDR]]41; T2-MOVT-STATIC: ldr r0, [r0]42 43; T2-LIT-STATIC-LABEL: test_local_tls:44; T2-LIT-STATIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]45; T2-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]46; T2-LIT-STATIC: blx [[TLV_GET_ADDR]]47; T2-LIT-STATIC: ldr r0, [r0]48; T2-LIT-STATIC: [[LOCAL_VAR_ADDR]]:49; T2-LIT-STATIC-NEXT: .long _local_tls_var50 51; ARM-MOVT-PIC-LABEL: test_local_tls:52; ARM-MOVT-PIC: movw [[VARPC1:r[0-9]+]], :lower16:(_local_tls_var-([[PCREL_LOC1:LPC[0-9]+_[0-9]+]]+8))53; ARM-MOVT-PIC: movt [[VARPC1]], :upper16:(_local_tls_var-([[PCREL_LOC1]]+8))54; ARM-MOVT-PIC: [[PCREL_LOC1]]:55; ARM-MOVT-PIC: add r0, pc, [[VARPC1]]56; ARM-MOVT-PIC: movw [[VARPC2:r[0-9]+]], :lower16:(_local_tls_var-([[PCREL_LOC2:LPC[0-9]+_[0-9]+]]+8))57; ARM-MOVT-PIC: movt [[VARPC2]], :upper16:(_local_tls_var-([[PCREL_LOC2]]+8))58; ARM-MOVT-PIC: [[PCREL_LOC2]]:59; ARM-MOVT-PIC-NEXT: ldr [[TLV_GET_ADDR:r[0-9]+]], [pc, [[VARPC2]]]60; ARM-MOVT-PIC: blx [[TLV_GET_ADDR]]61; ARM-MOVT-PIC: ldr r0, [r0]62 63; ARM-LIT-PIC-LABEL: test_local_tls:64; ARM-LIT-PIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]65; ARM-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:66; ARM-LIT-PIC-NEXT: add r0, pc67; ARM-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]68; ARM-LIT-PIC: blx [[TLV_GET_ADDR]]69; ARM-LIT-PIC: ldr r0, [r0]70; ARM-LIT-PIC: [[LOCAL_VAR_ADDR]]:71; ARM-LIT-PIC-NEXT: .long _local_tls_var-([[PCREL_LOC]]+8)72 73; ARM-MOVT-STATIC-LABEL: test_local_tls:74; ARM-MOVT-STATIC: movw r0, :lower16:_local_tls_var75; ARM-MOVT-STATIC: movt r0, :upper16:_local_tls_var76; ARM-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]77; ARM-MOVT-STATIC: blx [[TLV_GET_ADDR]]78; ARM-MOVT-STATIC: ldr r0, [r0]79 80; ARM-LIT-STATIC-LABEL: test_local_tls:81; ARM-LIT-STATIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]82; ARM-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]83; ARM-LIT-STATIC: blx [[TLV_GET_ADDR]]84; ARM-LIT-STATIC: ldr r0, [r0]85; ARM-LIT-STATIC: [[LOCAL_VAR_ADDR]]:86; ARM-LIT-STATIC-NEXT: .long _local_tls_var87 88 89 %val = load i32, ptr @local_tls_var, align 490 ret i32 %val91}92 93define i32 @test_external_tls() {94; T2-MOVT-PIC-LABEL: test_external_tls:95; T2-MOVT-PIC: movw r[[EXTGOT:[0-9]+]], :lower16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+4))96; T2-MOVT-PIC: movt r[[EXTGOT]], :upper16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+4))97; T2-MOVT-PIC: [[PCREL_LOC]]:98; T2-MOVT-PIC-NEXT: add r[[EXTGOT]], pc99; T2-MOVT-PIC: ldr r0, [r[[EXTGOT]]]100; T2-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]101; T2-MOVT-PIC: blx [[TLV_GET_ADDR]]102; T2-MOVT-PIC: ldr r0, [r0]103 104; T2-LIT-PIC-LABEL: test_external_tls:105; T2-LIT-PIC: ldr r[[EXTGOT:[0-9]+]], [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]106; T2-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:107; T2-LIT-PIC-NEXT: add r[[EXTGOT]], pc108; T2-LIT-PIC: ldr r0, [r[[EXTGOT]]]109; T2-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]110; T2-LIT-PIC: blx [[TLV_GET_ADDR]]111; T2-LIT-PIC: ldr r0, [r0]112; T2-LIT-PIC: [[EXTERNAL_VAR_ADDR]]:113; T2-LIT-PIC-NEXT: .long L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+4)114 115; T2-MOVT-STATIC-LABEL: test_external_tls:116; T2-MOVT-STATIC: movw r0, :lower16:_external_tls_var117; T2-MOVT-STATIC: movt r0, :upper16:_external_tls_var118; T2-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]119; T2-MOVT-STATIC: blx [[TLV_GET_ADDR]]120; T2-MOVT-STATIC: ldr r0, [r0]121 122; T2-LIT-STATIC-LABEL: test_external_tls:123; T2-LIT-STATIC: ldr r0, [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]124; T2-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]125; T2-LIT-STATIC: blx [[TLV_GET_ADDR]]126; T2-LIT-STATIC: ldr r0, [r0]127; T2-LIT-STATIC: [[EXTERNAL_VAR_ADDR]]:128; T2-LIT-STATIC-NEXT: .long _external_tls_var129 130; ARM-MOVT-PIC-LABEL: test_external_tls:131; ARM-MOVT-PIC: movw r[[EXTGOT:[0-9]+]], :lower16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+8))132; ARM-MOVT-PIC: movt r[[EXTGOT]], :upper16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+8))133; ARM-MOVT-PIC: [[PCREL_LOC]]:134; ARM-MOVT-PIC-NEXT: ldr r0, [pc, r[[EXTGOT]]]135; ARM-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]136; ARM-MOVT-PIC: blx [[TLV_GET_ADDR]]137; ARM-MOVT-PIC: ldr r0, [r0]138 139; ARM-LIT-PIC-LABEL: test_external_tls:140; ARM-LIT-PIC: ldr r[[EXTGOT:[0-9]+]], [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]141; ARM-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:142; ARM-LIT-PIC-NEXT: add r[[EXTGOT]], pc143; ARM-LIT-PIC: ldr r0, [r[[EXTGOT]]]144; ARM-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]145; ARM-LIT-PIC: blx [[TLV_GET_ADDR]]146; ARM-LIT-PIC: ldr r0, [r0]147; ARM-LIT-PIC: [[EXTERNAL_VAR_ADDR]]:148; ARM-LIT-PIC-NEXT: .long L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+8)149 150; ARM-MOVT-STATIC-LABEL: test_external_tls:151; ARM-MOVT-STATIC: movw r0, :lower16:_external_tls_var152; ARM-MOVT-STATIC: movt r0, :upper16:_external_tls_var153; ARM-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]154; ARM-MOVT-STATIC: blx [[TLV_GET_ADDR]]155; ARM-MOVT-STATIC: ldr r0, [r0]156 157; ARM-LIT-STATIC-LABEL: test_external_tls:158; ARM-LIT-STATIC: ldr r0, [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]159; ARM-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]160; ARM-LIT-STATIC: blx [[TLV_GET_ADDR]]161; ARM-LIT-STATIC: ldr r0, [r0]162; ARM-LIT-STATIC: [[EXTERNAL_VAR_ADDR]]:163; ARM-LIT-STATIC-NEXT: .long _external_tls_var164 165 %val = load i32, ptr @external_tls_var, align 4166 ret i32 %val167}168 169; Just need something to trigger an indirect reference to the var.170define i32 @use_hidden_external_tls() {171 %val = load i32, ptr @hidden_external_tls_var, align 4172 ret i32 %val173}174 175; T2-MOVT-PIC: .section __DATA,__thread_ptr,thread_local_variable_pointers176; T2-MOVT-PIC: .p2align 2177; T2-MOVT-PIC: L_external_tls_var$non_lazy_ptr:178; T2-MOVT-PIC: .indirect_symbol _external_tls_var179; T2-MOVT-PIC: .long 0180; T2-MOVT-PIC: L_hidden_external_tls_var$non_lazy_ptr:181; T2-MOVT-PIC: .indirect_symbol _hidden_external_tls_var182; T2-MOVT-PIC: .long 0183