llvm/test/CodeGen/ARM/none-macho.ll
Tim Northover 0aba46f4cd ARM MachO: sort out isTargetDarwin/isTargetIOS/... checks.
The ARM backend has been using most of the MachO related subtarget
checks almost interchangeably, and since the only target it's had to
run on has been IOS (which is all three of MachO, Darwin and IOS) it's
worked out OK so far.

But we'd like to support embedded targets under the "*-*-none-macho"
triple, which means everything starts falling apart and inconsistent
behaviours emerge.

This patch should pick a reasonably sensible set of behaviours for the
new triple (and any others that come along, with luck). Some choices
were debatable (notably FP == r7 or r11), but we can revisit those
later when deficiencies become apparent.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198617 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-06 14:28:05 +00:00

102 lines
2.9 KiB
LLVM

; RUN: llc -mtriple=thumbv7m-none-macho %s -o - -relocation-model=pic -disable-fp-elim | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NON-FAST
; RUN: llc -mtriple=thumbv7m-none-macho -O0 %s -o - -relocation-model=pic -disable-fp-elim | FileCheck %s
; RUN: llc -mtriple=thumbv7m-none-macho -filetype=obj %s -o /dev/null
; Bare-metal should probably "declare" segments just like normal MachO
; CHECK: __picsymbolstub4
; CHECK: __StaticInit
; CHECK: __text
@var = external global i32
define i32 @test_litpool() minsize {
; CHECK-LABEL: test_litpool:
%val = load i32* @var
ret i32 %val
; Lit-pool entries need to produce a "$non_lazy_ptr" version of the symbol.
; CHECK: LCPI0_0:
; CHECK-NEXT: .long L_var$non_lazy_ptr-(LPC0_0+4)
}
define i32 @test_movw_movt() {
; CHECK-LABEL: test_movw_movt:
%val = load i32* @var
ret i32 %val
; movw/movt should also address their symbols MachO-style
; CHECK: movw [[RTMP:r[0-9]+]], :lower16:(L_var$non_lazy_ptr-(LPC1_0+4))
; CHECK: movt [[RTMP]], :upper16:(L_var$non_lazy_ptr-(LPC1_0+4))
; CHECK: LPC1_0:
; CHECK: add [[RTMP]], pc
}
declare void @llvm.trap()
define void @test_trap() {
; CHECK-LABEL: test_trap:
; Bare-metal MachO gets compiled on top of normal MachO toolchain which
; understands trap natively.
call void @llvm.trap()
; CHECK: trap
ret void
}
define i32 @test_frame_ptr() {
; CHECK-LABEL: test_frame_ptr:
call void @test_trap()
; Frame pointer is r7 as for Darwin
; CHECK: mov r7, sp
ret i32 42
}
%big_arr = type [8 x i32]
define void @test_two_areas(%big_arr* %addr) {
; CHECK-LABEL: test_two_areas:
%val = load %big_arr* %addr
call void @test_trap()
store %big_arr %val, %big_arr* %addr
; This goes with the choice of r7 as FP (largely). FP and LR have to be stored
; consecutively on the stack for the frame record to be valid, which means we
; need the 2 register-save areas employed by iOS.
; CHECK-NON-FAST: push {r4, r5, r6, r7, lr}
; CHECK-NON-FAST: push.w {r8, r9, r10, r11}
; ...
; CHECK-NON-FAST: pop.w {r8, r9, r10, r11}
; CHECK-NON-FAST: pop {r4, r5, r6, r7, pc}
ret void
}
define void @test_tail_call() {
; CHECK-LABEL: test_tail_call:
tail call void @test_trap()
; Tail calls should be available and use Thumb2 branch.
; CHECK: b.w _test_trap
ret void
}
define float @test_softfloat_calls(float %in) {
; CHECK-LABEL: test_softfloat_calls:
%sum = fadd float %in, %in
; Soft-float calls should be GNU-style rather than RTABI and should not be the
; *vfp variants used for ARMv6 iOS.
; CHECK: blx ___addsf3{{$}}
ret float %sum
}
; Even bare-metal PIC needs GOT-like behaviour, in principle. Depends a bit on
; the use-case of course, but LLVM doesn't know what that is.
; CHECK: non_lazy_symbol_pointers
; CHECK: L_var$non_lazy_ptr:
; CHECK-NEXT: .indirect_symbol _var
; All MachO objects should have this to give the linker leeway in removing
; dead code.
; CHECK: .subsections_via_symbols