mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
ce9450a337
Enabling and using dwarf exceptions seems like an easier path to take, than to make the COFF/ARM backend output EHABI directives. Previously, no EH model was enabled at all on this target. There's no point in setting UseIntegratedAssembler to false since GNU binutils doesn't support Windows on ARM, and since we don't need to support external assembler, we don't need to use register numbers in cfi directives. Differential Revision: https://reviews.llvm.org/D39532 llvm-svn: 318510
592 lines
19 KiB
LLVM
592 lines
19 KiB
LLVM
; ARM EHABI integrated test
|
|
|
|
; This test case checks whether the ARM unwind directives are properly
|
|
; generated or not.
|
|
|
|
; The purpose of the test:
|
|
; (1) .fnstart and .fnend directives should wrap the function.
|
|
; (2) .setfp directive should be available if frame pointer is not eliminated.
|
|
; (3) .save directive should come with push instruction.
|
|
; (4) .vsave directive should come with vpush instruction.
|
|
; (5) .pad directive should come with stack pointer adjustment.
|
|
; (6) .cantunwind directive should be available if the function is marked with
|
|
; nounwind function attribute.
|
|
|
|
; We have to check several cases:
|
|
; (1) arm with -disable-fp-elim
|
|
; (2) arm without -disable-fp-elim
|
|
; (3) armv7 with -disable-fp-elim
|
|
; (4) armv7 without -disable-fp-elim
|
|
|
|
; RUN: llc -mtriple arm-unknown-linux-gnueabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-FP
|
|
|
|
; RUN: llc -mtriple arm-unknown-linux-gnueabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-FP-ELIM
|
|
|
|
; RUN: llc -mtriple armv7-unknown-linux-gnueabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP
|
|
|
|
; RUN: llc -mtriple armv7-unknown-linux-gnueabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM
|
|
|
|
; RUN: llc -mtriple arm-unknown-linux-musleabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-FP
|
|
|
|
; RUN: llc -mtriple arm-unknown-linux-musleabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-FP-ELIM
|
|
|
|
; RUN: llc -mtriple armv7-unknown-linux-musleabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP
|
|
|
|
; RUN: llc -mtriple armv7-unknown-linux-musleabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM
|
|
|
|
; RUN: llc -mtriple arm-unknown-linux-androideabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-FP
|
|
|
|
; RUN: llc -mtriple arm-unknown-linux-androideabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-FP-ELIM
|
|
|
|
; RUN: llc -mtriple armv7-unknown-linux-androideabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP
|
|
|
|
; RUN: llc -mtriple armv7-unknown-linux-androideabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-V7-FP-ELIM
|
|
|
|
; RUN: llc -mtriple arm-unknown-netbsd-eabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=DWARF-FP
|
|
|
|
; RUN: llc -mtriple arm-unknown-netbsd-eabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=DWARF-FP-ELIM
|
|
|
|
; RUN: llc -mtriple armv7-unknown-netbsd-eabi \
|
|
; RUN: -disable-fp-elim -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=DWARF-V7-FP
|
|
|
|
; RUN: llc -mtriple armv7-unknown-netbsd-eabi \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=DWARF-V7-FP-ELIM
|
|
|
|
; RUN: llc -mtriple thumbv7-windows-gnu \
|
|
; RUN: -filetype=asm -o - %s \
|
|
; RUN: | FileCheck %s --check-prefix=DWARF-WIN-FP-ELIM
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; Test 1
|
|
;-------------------------------------------------------------------------------
|
|
; This is the LLVM assembly generated from following C++ code:
|
|
;
|
|
; extern void print(int, int, int, int, int);
|
|
; extern void print(double, double, double, double, double);
|
|
;
|
|
; void test(int a, int b, int c, int d, int e,
|
|
; double m, double n, double p, double q, double r) {
|
|
; try {
|
|
; print(a, b, c, d, e);
|
|
; } catch (...) {
|
|
; print(m, n, p, q, r);
|
|
; }
|
|
; }
|
|
|
|
declare void @_Z5printiiiii(i32, i32, i32, i32, i32)
|
|
|
|
declare void @_Z5printddddd(double, double, double, double, double)
|
|
|
|
define void @_Z4testiiiiiddddd(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e,
|
|
double %m, double %n, double %p,
|
|
double %q, double %r) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
|
entry:
|
|
invoke void @_Z5printiiiii(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e)
|
|
to label %try.cont unwind label %lpad
|
|
|
|
lpad:
|
|
%0 = landingpad { i8*, i32 }
|
|
catch i8* null
|
|
%1 = extractvalue { i8*, i32 } %0, 0
|
|
%2 = tail call i8* @__cxa_begin_catch(i8* %1)
|
|
invoke void @_Z5printddddd(double %m, double %n, double %p,
|
|
double %q, double %r)
|
|
to label %invoke.cont2 unwind label %lpad1
|
|
|
|
invoke.cont2:
|
|
tail call void @__cxa_end_catch()
|
|
br label %try.cont
|
|
|
|
try.cont:
|
|
ret void
|
|
|
|
lpad1:
|
|
%3 = landingpad { i8*, i32 }
|
|
cleanup
|
|
invoke void @__cxa_end_catch()
|
|
to label %eh.resume unwind label %terminate.lpad
|
|
|
|
eh.resume:
|
|
resume { i8*, i32 } %3
|
|
|
|
terminate.lpad:
|
|
%4 = landingpad { i8*, i32 }
|
|
catch i8* null
|
|
%5 = extractvalue { i8*, i32 } %4, 0
|
|
tail call void @__clang_call_terminate(i8* %5)
|
|
unreachable
|
|
}
|
|
|
|
declare void @__clang_call_terminate(i8*)
|
|
|
|
declare i32 @__gxx_personality_v0(...)
|
|
|
|
declare i8* @__cxa_begin_catch(i8*)
|
|
|
|
declare void @__cxa_end_catch()
|
|
|
|
declare void @_ZSt9terminatev()
|
|
|
|
; CHECK-FP-LABEL: _Z4testiiiiiddddd:
|
|
; CHECK-FP: .fnstart
|
|
; CHECK-FP: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; CHECK-FP: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; CHECK-FP: .setfp r11, sp, #28
|
|
; CHECK-FP: add r11, sp, #28
|
|
; CHECK-FP: .pad #44
|
|
; CHECK-FP: sub sp, sp, #44
|
|
; CHECK-FP: .personality __gxx_personality_v0
|
|
; CHECK-FP: .handlerdata
|
|
; CHECK-FP: .fnend
|
|
|
|
; CHECK-FP-ELIM-LABEL: _Z4testiiiiiddddd:
|
|
; CHECK-FP-ELIM: .fnstart
|
|
; CHECK-FP-ELIM: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; CHECK-FP-ELIM: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; CHECK-FP-ELIM: .pad #36
|
|
; CHECK-FP-ELIM: sub sp, sp, #36
|
|
; CHECK-FP-ELIM: .personality __gxx_personality_v0
|
|
; CHECK-FP-ELIM: .handlerdata
|
|
; CHECK-FP-ELIM: .fnend
|
|
|
|
; CHECK-V7-FP-LABEL: _Z4testiiiiiddddd:
|
|
; CHECK-V7-FP: .fnstart
|
|
; CHECK-V7-FP: .save {r4, r10, r11, lr}
|
|
; CHECK-V7-FP: push {r4, r10, r11, lr}
|
|
; CHECK-V7-FP: .setfp r11, sp, #8
|
|
; CHECK-V7-FP: add r11, sp, #8
|
|
; CHECK-V7-FP: .vsave {d8, d9, d10, d11, d12}
|
|
; CHECK-V7-FP: vpush {d8, d9, d10, d11, d12}
|
|
; CHECK-V7-FP: .pad #24
|
|
; CHECK-V7-FP: sub sp, sp, #24
|
|
; CHECK-V7-FP: .personality __gxx_personality_v0
|
|
; CHECK-V7-FP: .handlerdata
|
|
; CHECK-V7-FP: .fnend
|
|
|
|
; CHECK-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
|
|
; CHECK-V7-FP-ELIM: .fnstart
|
|
; CHECK-V7-FP-ELIM: .save {r4, lr}
|
|
; CHECK-V7-FP-ELIM: push {r4, lr}
|
|
; CHECK-V7-FP-ELIM: .vsave {d8, d9, d10, d11, d12}
|
|
; CHECK-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12}
|
|
; CHECK-V7-FP-ELIM: .pad #24
|
|
; CHECK-V7-FP-ELIM: sub sp, sp, #24
|
|
; CHECK-V7-FP-ELIM: .personality __gxx_personality_v0
|
|
; CHECK-V7-FP-ELIM: .handlerdata
|
|
; CHECK-V7-FP-ELIM: .fnend
|
|
|
|
; DWARF-FP-LABEL: _Z4testiiiiiddddd:
|
|
; DWARF-FP: .cfi_startproc
|
|
; DWARF-FP: .cfi_personality 0, __gxx_personality_v0
|
|
; DWARF-FP: .cfi_lsda 0, .Lexception0
|
|
; DWARF-FP: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; DWARF-FP: .cfi_def_cfa_offset 36
|
|
; DWARF-FP: .cfi_offset lr, -4
|
|
; DWARF-FP: .cfi_offset r11, -8
|
|
; DWARF-FP: .cfi_offset r10, -12
|
|
; DWARF-FP: .cfi_offset r9, -16
|
|
; DWARF-FP: .cfi_offset r8, -20
|
|
; DWARF-FP: .cfi_offset r7, -24
|
|
; DWARF-FP: .cfi_offset r6, -28
|
|
; DWARF-FP: .cfi_offset r5, -32
|
|
; DWARF-FP: .cfi_offset r4, -36
|
|
; DWARF-FP: add r11, sp, #28
|
|
; DWARF-FP: .cfi_def_cfa r11, 8
|
|
; DWARF-FP: sub sp, sp, #44
|
|
; DWARF-FP: sub sp, r11, #28
|
|
; DWARF-FP: pop {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; DWARF-FP: mov pc, lr
|
|
; DWARF-FP: .cfi_endproc
|
|
|
|
; DWARF-FP-ELIM-LABEL: _Z4testiiiiiddddd:
|
|
; DWARF-FP-ELIM: .cfi_startproc
|
|
; DWARF-FP-ELIM: .cfi_personality 0, __gxx_personality_v0
|
|
; DWARF-FP-ELIM: .cfi_lsda 0, .Lexception0
|
|
; DWARF-FP-ELIM: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; DWARF-FP-ELIM: .cfi_def_cfa_offset 36
|
|
; DWARF-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-FP-ELIM: .cfi_offset r11, -8
|
|
; DWARF-FP-ELIM: .cfi_offset r10, -12
|
|
; DWARF-FP-ELIM: .cfi_offset r9, -16
|
|
; DWARF-FP-ELIM: .cfi_offset r8, -20
|
|
; DWARF-FP-ELIM: .cfi_offset r7, -24
|
|
; DWARF-FP-ELIM: .cfi_offset r6, -28
|
|
; DWARF-FP-ELIM: .cfi_offset r5, -32
|
|
; DWARF-FP-ELIM: .cfi_offset r4, -36
|
|
; DWARF-FP-ELIM: sub sp, sp, #36
|
|
; DWARF-FP-ELIM: .cfi_def_cfa_offset 72
|
|
; DWARF-FP-ELIM: add sp, sp, #36
|
|
; DWARF-FP-ELIM: pop {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
|
; DWARF-FP-ELIM: mov pc, lr
|
|
; DWARF-FP-ELIM: .cfi_endproc
|
|
|
|
; DWARF-V7-FP-LABEL: _Z4testiiiiiddddd:
|
|
; DWARF-V7-FP: .cfi_startproc
|
|
; DWARF-V7-FP: .cfi_personality 0, __gxx_personality_v0
|
|
; DWARF-V7-FP: .cfi_lsda 0, .Lexception0
|
|
; DWARF-V7-FP: push {r4, r10, r11, lr}
|
|
; DWARF-V7-FP: .cfi_def_cfa_offset 16
|
|
; DWARF-V7-FP: .cfi_offset lr, -4
|
|
; DWARF-V7-FP: .cfi_offset r11, -8
|
|
; DWARF-V7-FP: .cfi_offset r10, -12
|
|
; DWARF-V7-FP: .cfi_offset r4, -16
|
|
; DWARF-V7-FP: add r11, sp, #8
|
|
; DWARF-V7-FP: .cfi_def_cfa r11, 8
|
|
; DWARF-V7-FP: vpush {d8, d9, d10, d11, d12}
|
|
; DWARF-V7-FP: .cfi_offset d12, -24
|
|
; DWARF-V7-FP: .cfi_offset d11, -32
|
|
; DWARF-V7-FP: .cfi_offset d10, -40
|
|
; DWARF-V7-FP: .cfi_offset d9, -48
|
|
; DWARF-V7-FP: sub sp, sp, #24
|
|
; DWARF-V7-FP: sub sp, r11, #48
|
|
; DWARF-V7-FP: vpop {d8, d9, d10, d11, d12}
|
|
; DWARF-V7-FP: pop {r4, r10, r11, pc}
|
|
; DWARF-V7-FP: .cfi_endproc
|
|
|
|
; DWARF-V7-FP-ELIM-LABEL: _Z4testiiiiiddddd:
|
|
; DWARF-V7-FP-ELIM: .cfi_startproc
|
|
; DWARF-V7-FP-ELIM: .cfi_personality 0, __gxx_personality_v0
|
|
; DWARF-V7-FP-ELIM: .cfi_lsda 0, .Lexception0
|
|
; DWARF-V7-FP-ELIM: push {r4, lr}
|
|
; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 8
|
|
; DWARF-V7-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-V7-FP-ELIM: .cfi_offset r4, -8
|
|
; DWARF-V7-FP-ELIM: vpush {d8, d9, d10, d11, d12}
|
|
; DWARF-V7-FP-ELIM: .cfi_offset d12, -16
|
|
; DWARF-V7-FP-ELIM: .cfi_offset d11, -24
|
|
; DWARF-V7-FP-ELIM: .cfi_offset d10, -32
|
|
; DWARF-V7-FP-ELIM: .cfi_offset d9, -40
|
|
; DWARF-V7-FP-ELIM: sub sp, sp, #24
|
|
; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 72
|
|
; DWARF-V7-FP-ELIM: add sp, sp, #24
|
|
; DWARF-V7-FP-ELIM: vpop {d8, d9, d10, d11, d12}
|
|
; DWARF-V7-FP-ELIM: pop {r4, pc}
|
|
; DWARF-V7-FP-ELIM: .cfi_endproc
|
|
|
|
; DWARF-WIN-FP-ELIM-LABEL: _Z4testiiiiiddddd:
|
|
; DWARF-WIN-FP-ELIM: .cfi_startproc
|
|
; DWARF-WIN-FP-ELIM: .cfi_personality 0, __gxx_personality_v0
|
|
; DWARF-WIN-FP-ELIM: .cfi_lsda 0, .Lexception0
|
|
; DWARF-WIN-FP-ELIM: push {r4, lr}
|
|
; DWARF-WIN-FP-ELIM: .cfi_def_cfa_offset 8
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset r4, -8
|
|
; DWARF-WIN-FP-ELIM: vpush {d8, d9, d10, d11, d12}
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset d12, -16
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset d11, -24
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset d10, -32
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset d9, -40
|
|
; DWARF-WIN-FP-ELIM: sub sp, #8
|
|
; DWARF-WIN-FP-ELIM: .cfi_def_cfa_offset 56
|
|
; DWARF-WIN-FP-ELIM: add sp, #8
|
|
; DWARF-WIN-FP-ELIM: vpop {d8, d9, d10, d11, d12}
|
|
; DWARF-WIN-FP-ELIM: pop {r4, pc}
|
|
; DWARF-WIN-FP-ELIM: .cfi_endproc
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; Test 2
|
|
;-------------------------------------------------------------------------------
|
|
|
|
declare void @throw_exception_2()
|
|
|
|
define void @test2() {
|
|
entry:
|
|
call void @throw_exception_2()
|
|
ret void
|
|
}
|
|
|
|
; CHECK-FP-LABEL: test2:
|
|
; CHECK-FP: .fnstart
|
|
; CHECK-FP: .save {r11, lr}
|
|
; CHECK-FP: push {r11, lr}
|
|
; CHECK-FP: .setfp r11, sp
|
|
; CHECK-FP: mov r11, sp
|
|
; CHECK-FP: pop {r11, lr}
|
|
; CHECK-FP: mov pc, lr
|
|
; CHECK-FP: .fnend
|
|
|
|
; CHECK-FP-ELIM-LABEL: test2:
|
|
; CHECK-FP-ELIM: .fnstart
|
|
; CHECK-FP-ELIM: .save {r11, lr}
|
|
; CHECK-FP-ELIM: push {r11, lr}
|
|
; CHECK-FP-ELIM: pop {r11, lr}
|
|
; CHECK-FP-ELIM: mov pc, lr
|
|
; CHECK-FP-ELIM: .fnend
|
|
|
|
; CHECK-V7-FP-LABEL: test2:
|
|
; CHECK-V7-FP: .fnstart
|
|
; CHECK-V7-FP: .save {r11, lr}
|
|
; CHECK-V7-FP: push {r11, lr}
|
|
; CHECK-V7-FP: .setfp r11, sp
|
|
; CHECK-V7-FP: mov r11, sp
|
|
; CHECK-V7-FP: pop {r11, pc}
|
|
; CHECK-V7-FP: .fnend
|
|
|
|
; CHECK-V7-FP-ELIM-LABEL: test2:
|
|
; CHECK-V7-FP-ELIM: .fnstart
|
|
; CHECK-V7-FP-ELIM: .save {r11, lr}
|
|
; CHECK-V7-FP-ELIM: push {r11, lr}
|
|
; CHECK-V7-FP-ELIM: pop {r11, pc}
|
|
; CHECK-V7-FP-ELIM: .fnend
|
|
|
|
; DWARF-FP-LABEL: test2:
|
|
; DWARF-FP: .cfi_startproc
|
|
; DWARF-FP: push {r11, lr}
|
|
; DWARF-FP: .cfi_def_cfa_offset 8
|
|
; DWARF-FP: .cfi_offset lr, -4
|
|
; DWARF-FP: .cfi_offset r11, -8
|
|
; DWARF-FP: mov r11, sp
|
|
; DWARF-FP: .cfi_def_cfa_register r11
|
|
; DWARF-FP: pop {r11, lr}
|
|
; DWARF-FP: mov pc, lr
|
|
; DWARF-FP: .cfi_endproc
|
|
|
|
; DWARF-FP-ELIM-LABEL: test2:
|
|
; DWARF-FP-ELIM: .cfi_startproc
|
|
; DWARF-FP-ELIM: push {r11, lr}
|
|
; DWARF-FP-ELIM: .cfi_def_cfa_offset 8
|
|
; DWARF-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-FP-ELIM: .cfi_offset r11, -8
|
|
; DWARF-FP-ELIM: pop {r11, lr}
|
|
; DWARF-FP-ELIM: mov pc, lr
|
|
; DWARF-FP-ELIM: .cfi_endproc
|
|
|
|
; DWARF-V7-FP-LABEL: test2:
|
|
; DWARF-V7-FP: .cfi_startproc
|
|
; DWARF-V7-FP: push {r11, lr}
|
|
; DWARF-V7-FP: .cfi_def_cfa_offset 8
|
|
; DWARF-V7-FP: .cfi_offset lr, -4
|
|
; DWARF-V7-FP: .cfi_offset r11, -8
|
|
; DWARF-V7-FP: mov r11, sp
|
|
; DWARF-V7-FP: .cfi_def_cfa_register r11
|
|
; DWARF-V7-FP: pop {r11, pc}
|
|
; DWARF-V7-FP: .cfi_endproc
|
|
|
|
; DWARF-V7-FP-ELIM-LABEL: test2:
|
|
; DWARF-V7-FP-ELIM: .cfi_startproc
|
|
; DWARF-V7-FP-ELIM: push {r11, lr}
|
|
; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 8
|
|
; DWARF-V7-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-V7-FP-ELIM: .cfi_offset r11, -8
|
|
; DWARF-V7-FP-ELIM: pop {r11, pc}
|
|
; DWARF-V7-FP-ELIM: .cfi_endproc
|
|
|
|
; DWARF-WIN-FP-ELIM-LABEL: test2:
|
|
; DWARF-WIN-FP-ELIM: .cfi_startproc
|
|
; DWARF-WIN-FP-ELIM: push.w {r11, lr}
|
|
; DWARF-WIN-FP-ELIM: .cfi_def_cfa_offset 8
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset r11, -8
|
|
; DWARF-WIN-FP-ELIM: pop.w {r11, pc}
|
|
; DWARF-WIN-FP-ELIM: .cfi_endproc
|
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; Test 3
|
|
;-------------------------------------------------------------------------------
|
|
|
|
declare void @throw_exception_3(i32)
|
|
|
|
define i32 @test3(i32 %a, i32 %b, i32 %c, i32 %d,
|
|
i32 %e, i32 %f, i32 %g, i32 %h) {
|
|
entry:
|
|
%add = add nsw i32 %b, %a
|
|
%add1 = add nsw i32 %add, %c
|
|
%add2 = add nsw i32 %add1, %d
|
|
tail call void @throw_exception_3(i32 %add2)
|
|
%add3 = add nsw i32 %f, %e
|
|
%add4 = add nsw i32 %add3, %g
|
|
%add5 = add nsw i32 %add4, %h
|
|
tail call void @throw_exception_3(i32 %add5)
|
|
%add6 = add nsw i32 %add5, %add2
|
|
ret i32 %add6
|
|
}
|
|
|
|
; CHECK-FP-LABEL: test3:
|
|
; CHECK-FP: .fnstart
|
|
; CHECK-FP: .save {r4, r5, r11, lr}
|
|
; CHECK-FP: push {r4, r5, r11, lr}
|
|
; CHECK-FP: .setfp r11, sp, #8
|
|
; CHECK-FP: add r11, sp, #8
|
|
; CHECK-FP: pop {r4, r5, r11, lr}
|
|
; CHECK-FP: mov pc, lr
|
|
; CHECK-FP: .fnend
|
|
|
|
; CHECK-FP-ELIM-LABEL: test3:
|
|
; CHECK-FP-ELIM: .fnstart
|
|
; CHECK-FP-ELIM: .save {r4, r5, r11, lr}
|
|
; CHECK-FP-ELIM: push {r4, r5, r11, lr}
|
|
; CHECK-FP-ELIM: pop {r4, r5, r11, lr}
|
|
; CHECK-FP-ELIM: mov pc, lr
|
|
; CHECK-FP-ELIM: .fnend
|
|
|
|
; CHECK-V7-FP-LABEL: test3:
|
|
; CHECK-V7-FP: .fnstart
|
|
; CHECK-V7-FP: .save {r4, r5, r11, lr}
|
|
; CHECK-V7-FP: push {r4, r5, r11, lr}
|
|
; CHECK-V7-FP: .setfp r11, sp, #8
|
|
; CHECK-V7-FP: add r11, sp, #8
|
|
; CHECK-V7-FP: pop {r4, r5, r11, pc}
|
|
; CHECK-V7-FP: .fnend
|
|
|
|
; CHECK-V7-FP-ELIM-LABEL: test3:
|
|
; CHECK-V7-FP-ELIM: .fnstart
|
|
; CHECK-V7-FP-ELIM: .save {r4, r5, r11, lr}
|
|
; CHECK-V7-FP-ELIM: push {r4, r5, r11, lr}
|
|
; CHECK-V7-FP-ELIM: pop {r4, r5, r11, pc}
|
|
; CHECK-V7-FP-ELIM: .fnend
|
|
|
|
; DWARF-FP-LABEL: test3:
|
|
; DWARF-FP: .cfi_startproc
|
|
; DWARF-FP: push {r4, r5, r11, lr}
|
|
; DWARF-FP: .cfi_def_cfa_offset 16
|
|
; DWARF-FP: .cfi_offset lr, -4
|
|
; DWARF-FP: .cfi_offset r11, -8
|
|
; DWARF-FP: .cfi_offset r5, -12
|
|
; DWARF-FP: .cfi_offset r4, -16
|
|
; DWARF-FP: add r11, sp, #8
|
|
; DWARF-FP: .cfi_def_cfa r11, 8
|
|
; DWARF-FP: pop {r4, r5, r11, lr}
|
|
; DWARF-FP: mov pc, lr
|
|
; DWARF-FP: .cfi_endproc
|
|
|
|
; DWARF-FP-ELIM-LABEL: test3:
|
|
; DWARF-FP-ELIM: .cfi_startproc
|
|
; DWARF-FP-ELIM: push {r4, r5, r11, lr}
|
|
; DWARF-FP-ELIM: .cfi_def_cfa_offset 16
|
|
; DWARF-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-FP-ELIM: .cfi_offset r11, -8
|
|
; DWARF-FP-ELIM: .cfi_offset r5, -12
|
|
; DWARF-FP-ELIM: .cfi_offset r4, -16
|
|
; DWARF-FP-ELIM: pop {r4, r5, r11, lr}
|
|
; DWARF-FP-ELIM: mov pc, lr
|
|
; DWARF-FP-ELIM: .cfi_endproc
|
|
|
|
; DWARF-V7-FP-LABEL: test3:
|
|
; DWARF-V7-FP: .cfi_startproc
|
|
; DWARF-V7-FP: push {r4, r5, r11, lr}
|
|
; DWARF-V7-FP: .cfi_def_cfa_offset 16
|
|
; DWARF-V7-FP: .cfi_offset lr, -4
|
|
; DWARF-V7-FP: .cfi_offset r11, -8
|
|
; DWARF-V7-FP: .cfi_offset r5, -12
|
|
; DWARF-V7-FP: .cfi_offset r4, -16
|
|
; DWARF-V7-FP: add r11, sp, #8
|
|
; DWARF-V7-FP: .cfi_def_cfa r11, 8
|
|
; DWARF-V7-FP: pop {r4, r5, r11, pc}
|
|
; DWARF-V7-FP: .cfi_endproc
|
|
|
|
; DWARF-V7-FP-ELIM-LABEL: test3:
|
|
; DWARF-V7-FP-ELIM: .cfi_startproc
|
|
; DWARF-V7-FP-ELIM: push {r4, r5, r11, lr}
|
|
; DWARF-V7-FP-ELIM: .cfi_def_cfa_offset 16
|
|
; DWARF-V7-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-V7-FP-ELIM: .cfi_offset r11, -8
|
|
; DWARF-V7-FP-ELIM: .cfi_offset r5, -12
|
|
; DWARF-V7-FP-ELIM: .cfi_offset r4, -16
|
|
; DWARF-V7-FP-ELIM: pop {r4, r5, r11, pc}
|
|
; DWARF-V7-FP-ELIM: .cfi_endproc
|
|
|
|
; DWARF-WIN-FP-ELIM-LABEL: test3:
|
|
; DWARF-WIN-FP-ELIM: .cfi_startproc
|
|
; DWARF-WIN-FP-ELIM: push.w {r4, r5, r11, lr}
|
|
; DWARF-WIN-FP-ELIM: .cfi_def_cfa_offset 16
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset lr, -4
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset r11, -8
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset r5, -12
|
|
; DWARF-WIN-FP-ELIM: .cfi_offset r4, -16
|
|
; DWARF-WIN-FP-ELIM: pop.w {r4, r5, r11, pc}
|
|
; DWARF-WIN-FP-ELIM: .cfi_endproc
|
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; Test 4
|
|
;-------------------------------------------------------------------------------
|
|
|
|
define void @test4() nounwind {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
; CHECK-FP-LABEL: test4:
|
|
; CHECK-FP: .fnstart
|
|
; CHECK-FP: mov pc, lr
|
|
; CHECK-FP: .cantunwind
|
|
; CHECK-FP: .fnend
|
|
|
|
; CHECK-FP-ELIM-LABEL: test4:
|
|
; CHECK-FP-ELIM: .fnstart
|
|
; CHECK-FP-ELIM: mov pc, lr
|
|
; CHECK-FP-ELIM: .cantunwind
|
|
; CHECK-FP-ELIM: .fnend
|
|
|
|
; CHECK-V7-FP-LABEL: test4:
|
|
; CHECK-V7-FP: .fnstart
|
|
; CHECK-V7-FP: bx lr
|
|
; CHECK-V7-FP: .cantunwind
|
|
; CHECK-V7-FP: .fnend
|
|
|
|
; CHECK-V7-FP-ELIM-LABEL: test4:
|
|
; CHECK-V7-FP-ELIM: .fnstart
|
|
; CHECK-V7-FP-ELIM: bx lr
|
|
; CHECK-V7-FP-ELIM: .cantunwind
|
|
; CHECK-V7-FP-ELIM: .fnend
|
|
|
|
; DWARF-FP-LABEL: test4:
|
|
; DWARF-FP-NOT: .cfi_startproc
|
|
; DWARF-FP: mov pc, lr
|
|
; DWARF-FP-NOT: .cfi_endproc
|
|
; DWARF-FP: .size test4,
|
|
|
|
; DWARF-FP-ELIM-LABEL: test4:
|
|
; DWARF-FP-ELIM-NOT: .cfi_startproc
|
|
; DWARF-FP-ELIM: mov pc, lr
|
|
; DWARF-FP-ELIM-NOT: .cfi_endproc
|
|
; DWARF-FP-ELIM: .size test4,
|
|
|
|
; DWARF-V7-FP-LABEL: test4:
|
|
; DWARF-V7-FP-NOT: .cfi_startproc
|
|
; DWARF-V7-FP: bx lr
|
|
; DWARF-V7-FP-NOT: .cfi_endproc
|
|
; DWARF-V7-FP: .size test4,
|
|
|
|
; DWARF-V7-FP-ELIM-LABEL: test4:
|
|
; DWARF-V7-FP-ELIM-NOT: .cfi_startproc
|
|
; DWARF-V7-FP-ELIM: bx lr
|
|
; DWARF-V7-FP-ELIM-NOT: .cfi_endproc
|
|
; DWARF-V7-FP-ELIM: .size test4,
|
|
|
|
; DWARF-WIN-FP-ELIM-LABEL: test4:
|
|
; DWARF-WIN-FP-ELIM-NOT: .cfi_startproc
|
|
; DWARF-WIN-FP-ELIM: bx lr
|
|
; DWARF-WIN-FP-ELIM-NOT: .cfi_endproc
|