167b07531SAlex Richardson; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 267b07531SAlex Richardson; RUN: llc -mtriple=armv7-linux-gnueabi -relocation-model=static < %s \ 367b07531SAlex Richardson; RUN: | FileCheck %s --check-prefix=STATIC 467b07531SAlex Richardson; RUN: llc -mtriple=armv7-linux-gnueabi -relocation-model=pic < %s \ 567b07531SAlex Richardson; RUN: | FileCheck %s --check-prefix=PIC 667b07531SAlex Richardson 767b07531SAlex Richardson@preemptable_var = dso_preemptable global i32 42 867b07531SAlex Richardsondefine ptr @get_preemptable_var() nounwind { 967b07531SAlex Richardson; STATIC-LABEL: get_preemptable_var: 1067b07531SAlex Richardson; STATIC: @ %bb.0: 1167b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:preemptable_var 1267b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:preemptable_var 1367b07531SAlex Richardson; STATIC-NEXT: bx lr 1467b07531SAlex Richardson; 1567b07531SAlex Richardson; PIC-LABEL: get_preemptable_var: 1667b07531SAlex Richardson; PIC: @ %bb.0: 1767b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI0_0 1867b07531SAlex Richardson; PIC-NEXT: .LPC0_0: 1967b07531SAlex Richardson; PIC-NEXT: ldr r0, [pc, r0] 2067b07531SAlex Richardson; PIC-NEXT: bx lr 2167b07531SAlex Richardson; PIC-NEXT: .p2align 2 2267b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 2367b07531SAlex Richardson; PIC-NEXT: .LCPI0_0: 2467b07531SAlex Richardson; PIC-NEXT: .Ltmp0: 2567b07531SAlex Richardson; PIC-NEXT: .long preemptable_var(GOT_PREL)-((.LPC0_0+8)-.Ltmp0) 2667b07531SAlex Richardson ret ptr @preemptable_var 2767b07531SAlex Richardson} 2867b07531SAlex Richardson 2967b07531SAlex Richardson@dsolocal_var = dso_local global i32 42 3067b07531SAlex Richardsondefine ptr @get_dsolocal_var() nounwind { 3167b07531SAlex Richardson; STATIC-LABEL: get_dsolocal_var: 3267b07531SAlex Richardson; STATIC: @ %bb.0: 3367b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:dsolocal_var 3467b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:dsolocal_var 3567b07531SAlex Richardson; STATIC-NEXT: bx lr 3667b07531SAlex Richardson; 3767b07531SAlex Richardson; PIC-LABEL: get_dsolocal_var: 3867b07531SAlex Richardson; PIC: @ %bb.0: 3967b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI1_0 4067b07531SAlex Richardson; PIC-NEXT: .LPC1_0: 4167b07531SAlex Richardson; PIC-NEXT: add r0, pc, r0 4267b07531SAlex Richardson; PIC-NEXT: bx lr 4367b07531SAlex Richardson; PIC-NEXT: .p2align 2 4467b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 4567b07531SAlex Richardson; PIC-NEXT: .LCPI1_0: 46*df00dac8SAlex Richardson; PIC-NEXT: .long .Ldsolocal_var$local-(.LPC1_0+8) 4767b07531SAlex Richardson ret ptr @dsolocal_var 4867b07531SAlex Richardson} 4967b07531SAlex Richardson 5067b07531SAlex Richardson@weak_dsolocal_var = weak dso_local global i32 42 5167b07531SAlex Richardsondefine ptr @get_weak_dsolocal_var() nounwind { 5267b07531SAlex Richardson; STATIC-LABEL: get_weak_dsolocal_var: 5367b07531SAlex Richardson; STATIC: @ %bb.0: 5467b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:weak_dsolocal_var 5567b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:weak_dsolocal_var 5667b07531SAlex Richardson; STATIC-NEXT: bx lr 5767b07531SAlex Richardson; 5867b07531SAlex Richardson; PIC-LABEL: get_weak_dsolocal_var: 5967b07531SAlex Richardson; PIC: @ %bb.0: 6067b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI2_0 6167b07531SAlex Richardson; PIC-NEXT: .LPC2_0: 6267b07531SAlex Richardson; PIC-NEXT: add r0, pc, r0 6367b07531SAlex Richardson; PIC-NEXT: bx lr 6467b07531SAlex Richardson; PIC-NEXT: .p2align 2 6567b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 6667b07531SAlex Richardson; PIC-NEXT: .LCPI2_0: 6767b07531SAlex Richardson; PIC-NEXT: .long weak_dsolocal_var-(.LPC2_0+8) 6867b07531SAlex Richardson ret ptr @weak_dsolocal_var 6967b07531SAlex Richardson} 7067b07531SAlex Richardson 7167b07531SAlex Richardson@hidden_var = hidden global i32 42 7267b07531SAlex Richardsondefine ptr @get_hidden_var() nounwind { 7367b07531SAlex Richardson; STATIC-LABEL: get_hidden_var: 7467b07531SAlex Richardson; STATIC: @ %bb.0: 7567b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:hidden_var 7667b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:hidden_var 7767b07531SAlex Richardson; STATIC-NEXT: bx lr 7867b07531SAlex Richardson; 7967b07531SAlex Richardson; PIC-LABEL: get_hidden_var: 8067b07531SAlex Richardson; PIC: @ %bb.0: 8167b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI3_0 8267b07531SAlex Richardson; PIC-NEXT: .LPC3_0: 8367b07531SAlex Richardson; PIC-NEXT: add r0, pc, r0 8467b07531SAlex Richardson; PIC-NEXT: bx lr 8567b07531SAlex Richardson; PIC-NEXT: .p2align 2 8667b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 8767b07531SAlex Richardson; PIC-NEXT: .LCPI3_0: 8867b07531SAlex Richardson; PIC-NEXT: .long hidden_var-(.LPC3_0+8) 8967b07531SAlex Richardson ret ptr @hidden_var 9067b07531SAlex Richardson} 9167b07531SAlex Richardson 9267b07531SAlex Richardson@protected_var = protected global i32 42 9367b07531SAlex Richardsondefine ptr @get_protected_var() nounwind { 9467b07531SAlex Richardson; STATIC-LABEL: get_protected_var: 9567b07531SAlex Richardson; STATIC: @ %bb.0: 9667b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:protected_var 9767b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:protected_var 9867b07531SAlex Richardson; STATIC-NEXT: bx lr 9967b07531SAlex Richardson; 10067b07531SAlex Richardson; PIC-LABEL: get_protected_var: 10167b07531SAlex Richardson; PIC: @ %bb.0: 10267b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI4_0 10367b07531SAlex Richardson; PIC-NEXT: .LPC4_0: 10467b07531SAlex Richardson; PIC-NEXT: add r0, pc, r0 10567b07531SAlex Richardson; PIC-NEXT: bx lr 10667b07531SAlex Richardson; PIC-NEXT: .p2align 2 10767b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 10867b07531SAlex Richardson; PIC-NEXT: .LCPI4_0: 10967b07531SAlex Richardson; PIC-NEXT: .long protected_var-(.LPC4_0+8) 11067b07531SAlex Richardson ret ptr @protected_var 11167b07531SAlex Richardson} 11267b07531SAlex Richardson 11367b07531SAlex Richardsondefine dso_preemptable ptr @preemptable_func() nounwind { 11467b07531SAlex Richardson; STATIC-LABEL: preemptable_func: 11567b07531SAlex Richardson; STATIC: @ %bb.0: 11667b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:preemptable_func 11767b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:preemptable_func 11867b07531SAlex Richardson; STATIC-NEXT: bx lr 11967b07531SAlex Richardson; 12067b07531SAlex Richardson; PIC-LABEL: preemptable_func: 12167b07531SAlex Richardson; PIC: @ %bb.0: 12267b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI5_0 12367b07531SAlex Richardson; PIC-NEXT: .LPC5_0: 12467b07531SAlex Richardson; PIC-NEXT: ldr r0, [pc, r0] 12567b07531SAlex Richardson; PIC-NEXT: bx lr 12667b07531SAlex Richardson; PIC-NEXT: .p2align 2 12767b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 12867b07531SAlex Richardson; PIC-NEXT: .LCPI5_0: 12967b07531SAlex Richardson; PIC-NEXT: .Ltmp1: 13067b07531SAlex Richardson; PIC-NEXT: .long preemptable_func(GOT_PREL)-((.LPC5_0+8)-.Ltmp1) 13167b07531SAlex Richardson ret ptr @preemptable_func 13267b07531SAlex Richardson} 13367b07531SAlex Richardson 13467b07531SAlex Richardsondefine dso_local ptr @dsolocal_func() nounwind { 13567b07531SAlex Richardson; STATIC-LABEL: dsolocal_func: 13667b07531SAlex Richardson; STATIC: @ %bb.0: 13767b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:dsolocal_func 13867b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:dsolocal_func 13967b07531SAlex Richardson; STATIC-NEXT: bx lr 14067b07531SAlex Richardson; 14167b07531SAlex Richardson; PIC-LABEL: dsolocal_func: 14267b07531SAlex Richardson; PIC: @ %bb.0: 14367b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI6_0 14467b07531SAlex Richardson; PIC-NEXT: .LPC6_0: 14567b07531SAlex Richardson; PIC-NEXT: add r0, pc, r0 14667b07531SAlex Richardson; PIC-NEXT: bx lr 14767b07531SAlex Richardson; PIC-NEXT: .p2align 2 14867b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 14967b07531SAlex Richardson; PIC-NEXT: .LCPI6_0: 150*df00dac8SAlex Richardson; PIC-NEXT: .long .Ldsolocal_func$local-(.LPC6_0+8) 15167b07531SAlex Richardson ret ptr @dsolocal_func 15267b07531SAlex Richardson} 15367b07531SAlex Richardson 15467b07531SAlex Richardsondefine weak dso_local ptr @weak_dsolocal_func() nounwind { 15567b07531SAlex Richardson; STATIC-LABEL: weak_dsolocal_func: 15667b07531SAlex Richardson; STATIC: @ %bb.0: 15767b07531SAlex Richardson; STATIC-NEXT: movw r0, :lower16:weak_dsolocal_func 15867b07531SAlex Richardson; STATIC-NEXT: movt r0, :upper16:weak_dsolocal_func 15967b07531SAlex Richardson; STATIC-NEXT: bx lr 16067b07531SAlex Richardson; 16167b07531SAlex Richardson; PIC-LABEL: weak_dsolocal_func: 16267b07531SAlex Richardson; PIC: @ %bb.0: 16367b07531SAlex Richardson; PIC-NEXT: ldr r0, .LCPI7_0 16467b07531SAlex Richardson; PIC-NEXT: .LPC7_0: 16567b07531SAlex Richardson; PIC-NEXT: add r0, pc, r0 16667b07531SAlex Richardson; PIC-NEXT: bx lr 16767b07531SAlex Richardson; PIC-NEXT: .p2align 2 16867b07531SAlex Richardson; PIC-NEXT: @ %bb.1: 16967b07531SAlex Richardson; PIC-NEXT: .LCPI7_0: 17067b07531SAlex Richardson; PIC-NEXT: .long weak_dsolocal_func-(.LPC7_0+8) 17167b07531SAlex Richardson ret ptr @weak_dsolocal_func 17267b07531SAlex Richardson} 17367b07531SAlex Richardson 17467b07531SAlex Richardson;; call .Ldsolocal_func$local either resolves to a constant at assembly time 17567b07531SAlex Richardson;; or produces a relocation referencing a non-preemptible local symbol. 17667b07531SAlex Richardsondefine dso_local void @call_dsolocal_func() nounwind { 17767b07531SAlex Richardson; STATIC-LABEL: call_dsolocal_func: 17867b07531SAlex Richardson; STATIC: @ %bb.0: 17967b07531SAlex Richardson; STATIC-NEXT: .save {r11, lr} 18067b07531SAlex Richardson; STATIC-NEXT: push {r11, lr} 18167b07531SAlex Richardson; STATIC-NEXT: bl dsolocal_func 18267b07531SAlex Richardson; STATIC-NEXT: pop {r11, pc} 18367b07531SAlex Richardson; 18467b07531SAlex Richardson; PIC-LABEL: call_dsolocal_func: 18567b07531SAlex Richardson; PIC: @ %bb.0: 18667b07531SAlex Richardson; PIC-NEXT: .save {r11, lr} 18767b07531SAlex Richardson; PIC-NEXT: push {r11, lr} 188*df00dac8SAlex Richardson; PIC-NEXT: bl .Ldsolocal_func$local 18967b07531SAlex Richardson; PIC-NEXT: pop {r11, pc} 19067b07531SAlex Richardson call ptr @dsolocal_func() 19167b07531SAlex Richardson ret void 19267b07531SAlex Richardson} 193