mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-29 10:32:47 +00:00
d80979b25d
The code this patch removes was there to make sure the text sections went before the dwarf sections. That is necessary because MachO uses offsets relative to the start of the file, so adding a section can change relaxations. The dwarf sections were being printed at the start just to produce symbols pointing at the start of those sections. The underlying issue was fixed in r231898. The dwarf sections are now printed when they are about to be used, which is after we printed the text sections. To make sure we don't regress, the patch makes the MachO streamer assert if CodeGen puts anything unexpected after the DWARF sections. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232842 91177308-0d34-0410-b5e6-96231b3b80d8
95 lines
2.7 KiB
LLVM
95 lines
2.7 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
|
|
|
|
@var = external global i32
|
|
|
|
define i32 @test_litpool() minsize {
|
|
; CHECK-LABEL: test_litpool:
|
|
%val = load i32, 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, 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 r11.
|
|
; CHECK: mov r11, 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, %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.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; ...
|
|
; CHECK-NON-FAST: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, 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: bl ___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
|