mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-04 07:29:20 +00:00
The code in X86TargetLowering::LowerEH_RETURN() assumes that a frame pointer exists, but the frame pointer was forced by the presence of llvm.eh.unwind.init which isn't guaranteed. If llvm.eh.unwind.init is actually required in functions calling eh.return (is it?), we should diagnose that instead of emitting bad machine code. This should fix the dragonegg-x86_64-linux-gcc-4.6-test bot. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158961 91177308-0d34-0410-b5e6-96231b3b80d8
39 lines
1.1 KiB
LLVM
39 lines
1.1 KiB
LLVM
; Check that eh_return & unwind_init were properly lowered
|
|
; RUN: llc < %s -verify-machineinstrs | FileCheck %s
|
|
|
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"
|
|
target triple = "i386-pc-linux"
|
|
|
|
; CHECK: test1
|
|
; CHECK: pushl %ebp
|
|
define i8* @test1(i32 %a, i8* %b) {
|
|
entry:
|
|
call void @llvm.eh.unwind.init()
|
|
%foo = alloca i32
|
|
call void @llvm.eh.return.i32(i32 %a, i8* %b)
|
|
; CHECK: movl 12(%ebp), %[[ECX:e..]]
|
|
; CHECK: movl 8(%ebp), %[[EAX:e..]]
|
|
; CHECK: movl %[[ECX]], 4(%ebp,%[[EAX]])
|
|
; CHECK: leal 4(%ebp,%[[EAX]]), %[[ECX2:e..]]
|
|
; CHECK: movl %[[ECX2]], %esp
|
|
; CHECK: ret
|
|
unreachable
|
|
}
|
|
|
|
; CHECK: test2
|
|
; CHECK: pushl %ebp
|
|
define i8* @test2(i32 %a, i8* %b) {
|
|
entry:
|
|
call void @llvm.eh.return.i32(i32 %a, i8* %b)
|
|
; CHECK: movl 12(%ebp), %[[ECX:e..]]
|
|
; CHECK: movl 8(%ebp), %[[EAX:e..]]
|
|
; CHECK: movl %[[ECX]], 4(%ebp,%[[EAX]])
|
|
; CHECK: leal 4(%ebp,%[[EAX]]), %[[ECX2:e..]]
|
|
; CHECK: movl %[[ECX2]], %esp
|
|
; CHECK: ret
|
|
unreachable
|
|
}
|
|
|
|
declare void @llvm.eh.return.i32(i32, i8*)
|
|
declare void @llvm.eh.unwind.init()
|