[WinEH] Verify catchswitch handlers

Summary:
The handler list must be nonempty and consist solely of CatchPads.


Reviewers: rnk, andrew.w.kaylor, majnemer

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D15842

llvm-svn: 256691
This commit is contained in:
Joseph Tremoulet 2016-01-02 15:25:25 +00:00
parent 06125e52a7
commit 131a462690
2 changed files with 16 additions and 0 deletions

View File

@ -3079,6 +3079,13 @@ void Verifier::visitCatchSwitchInst(CatchSwitchInst &CatchSwitch) {
Assert(isa<ConstantTokenNone>(ParentPad) || isa<FuncletPadInst>(ParentPad),
"CatchSwitchInst has an invalid parent.", ParentPad);
Assert(CatchSwitch.getNumHandlers() != 0,
"CatchSwitchInst cannot have empty handler list", &CatchSwitch);
for (BasicBlock *Handler : CatchSwitch.handlers())
Assert(isa<CatchPadInst>(Handler->getFirstNonPHI()),
"CatchSwitchInst handlers must be catchpads", &CatchSwitch, Handler);
visitTerminatorInst(CatchSwitch);
}

View File

@ -5,6 +5,7 @@
; RUN: sed -e s/.T5:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK5 %s
; RUN: sed -e s/.T6:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK6 %s
; RUN: sed -e s/.T7:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK7 %s
; RUN: sed -e s/.T8:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK8 %s
declare void @g()
@ -87,3 +88,11 @@ declare void @g()
;T7: catchpad within %cs2 []
;T7: unreachable
;T7: }
;T8: define void @f() personality void ()* @g {
;T8: entry:
;T8: ret void
;T8: switch1:
;T8: %cs1 = catchswitch within none [ label %switch1 ] unwind to caller
;T8: ; CHECK8: CatchSwitchInst handlers must be catchpads
;T8: }