1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=X64
; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=X86
declare void @throw()
declare i32 @__CxxFrameHandler3(...)
declare void @llvm.trap()
define void @test1() personality i32 (...)* @__CxxFrameHandler3 {
entry:
%alloca2 = alloca i8*, align 4
%alloca1 = alloca i8*, align 4
store volatile i8* null, i8** %alloca1
invoke void @throw()
to label %unreachable unwind label %catch.dispatch
; X64-LABEL: test1:
; X64: movq $0, -8(%rbp)
; X64: callq throw
; X86-LABEL: _test1:
; X86: pushl %ebp
; X86: movl %esp, %ebp
; X86: pushl %ebx
; X86: pushl %edi
; X86: pushl %esi
; X86: subl $24, %esp
; X86: movl $0, -32(%ebp)
; X86: calll _throw
catch.dispatch: ; preds = %entry
%cs = catchswitch within none [label %catch.pad] unwind to caller
catch.pad: ; preds = %catch.dispatch
%cp = catchpad within %cs [i8* null, i32 0, i8** %alloca1]
%v = load volatile i8*, i8** %alloca1
store volatile i8* null, i8** %alloca1
%bc1 = bitcast i8** %alloca1 to i8*
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %bc1)
%bc2 = bitcast i8** %alloca2 to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* %bc2)
store volatile i8* null, i8** %alloca1
call void @llvm.trap()
unreachable
; X64-LABEL: "?catch$2@?0?test1@4HA"
; X64: movq $0, -8(%rbp)
; X64: movq $0, -8(%rbp)
; X64: ud2
; X86-LABEL: "?catch$2@?0?test1@4HA"
; X86: movl $0, -32(%ebp)
; X86: movl $0, -32(%ebp)
; X86: ud2
unreachable: ; preds = %entry
unreachable
}
; X64-LABEL: $cppxdata$test1:
; X64: .long 56 # CatchObjOffset
; -20 is difference between the end of the EH reg node stack object and the
; catch object at EBP -32.
; X86-LABEL: L__ehtable$test1:
; X86: .long -20 # CatchObjOffset
define void @test2() personality i32 (...)* @__CxxFrameHandler3 {
entry:
%alloca2 = alloca i8*, align 4
%alloca1 = alloca i8*, align 4
store volatile i8* null, i8** %alloca1
invoke void @throw()
to label %unreachable unwind label %catch.dispatch
; X64-LABEL: test2:
; X64: movq $0, -16(%rbp)
; X64: callq throw
; X86-LABEL: _test2:
; X86: movl $0, -32(%ebp)
; X86: calll _throw
catch.dispatch: ; preds = %entry
%cs = catchswitch within none [label %catch.pad] unwind to caller
catch.pad: ; preds = %catch.dispatch
%cp = catchpad within %cs [i8* null, i32 0, i8** null]
store volatile i8* null, i8** %alloca1
%bc1 = bitcast i8** %alloca1 to i8*
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %bc1)
%bc2 = bitcast i8** %alloca2 to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* %bc2)
store volatile i8* null, i8** %alloca1
call void @llvm.trap()
unreachable
; X64-LABEL: "?catch$2@?0?test2@4HA"
; X64: movq $0, -16(%rbp)
; X64: movq $0, -16(%rbp)
; X64: ud2
; X86-LABEL: "?catch$2@?0?test2@4HA"
; X86: movl $0, -32(%ebp)
; X86: movl $0, -32(%ebp)
; X86: ud2
unreachable: ; preds = %entry
unreachable
}
; X64-LABEL: $cppxdata$test2:
; X64: .long 0 # CatchObjOffset
; X86-LABEL: L__ehtable$test2:
; X86: .long 0 # CatchObjOffset
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #0
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0
attributes #0 = { argmemonly nounwind }
|