From 3c6a15b1cc56929f36fb4192d074942621c46182 Mon Sep 17 00:00:00 2001 From: Joseph Tremoulet Date: Sat, 2 Jan 2016 15:24:24 +0000 Subject: [PATCH] [WinEH] Tighten parentPad verifier checks Summary: A catchswitch cannot be a parent of a cleanuppad or another catchswitch. Reviewers: rnk, andrew.w.kaylor, majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D15841 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256690 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/Verifier.cpp | 6 ++--- test/Bitcode/compatibility.ll | 12 ++++++--- test/Verifier/invalid-eh.ll | 51 +++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index 81c87e4759b..a7a291dbf9d 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -3019,8 +3019,7 @@ void Verifier::visitCleanupPadInst(CleanupPadInst &CPI) { &CPI); auto *ParentPad = CPI.getParentPad(); - Assert(isa(ParentPad) || isa(ParentPad) || - isa(ParentPad) || isa(ParentPad), + Assert(isa(ParentPad) || isa(ParentPad), "CleanupPadInst has an invalid parent.", &CPI); User *FirstUser = nullptr; @@ -3077,8 +3076,7 @@ void Verifier::visitCatchSwitchInst(CatchSwitchInst &CatchSwitch) { } auto *ParentPad = CatchSwitch.getParentPad(); - Assert(isa(ParentPad) || isa(ParentPad) || - isa(ParentPad) || isa(ParentPad), + Assert(isa(ParentPad) || isa(ParentPad), "CatchSwitchInst has an invalid parent.", ParentPad); visitTerminatorInst(CatchSwitch); diff --git a/test/Bitcode/compatibility.ll b/test/Bitcode/compatibility.ll index 31e501de0a1..9363f503be5 100644 --- a/test/Bitcode/compatibility.ll +++ b/test/Bitcode/compatibility.ll @@ -859,17 +859,23 @@ catchpad: ; CHECK-NEXT: br label %body body: - invoke void @f.ccc() to label %continue unwind label %terminate + invoke void @f.ccc() to label %continue unwind label %terminate.inner catchret from %catch to label %return ; CHECK: catchret from %catch to label %return return: ret i32 0 +terminate.inner: + cleanuppad within %catch [] + unreachable + ; CHECK: cleanuppad within %catch [] + ; CHECK-NEXT: unreachable + terminate: - cleanuppad within %cs [] + cleanuppad within none [] unreachable - ; CHECK: cleanuppad within %cs [] + ; CHECK: cleanuppad within none [] ; CHECK-NEXT: unreachable continue: diff --git a/test/Verifier/invalid-eh.ll b/test/Verifier/invalid-eh.ll index 906b24a15c3..aae9b1ae2fd 100644 --- a/test/Verifier/invalid-eh.ll +++ b/test/Verifier/invalid-eh.ll @@ -2,6 +2,11 @@ ; RUN: sed -e s/.T2:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK2 %s ; RUN: sed -e s/.T3:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK3 %s ; RUN: sed -e s/.T4:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK4 %s +; 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 + +declare void @g() ;T1: define void @f() { ;T1: entry: @@ -36,3 +41,49 @@ ;T4: cleanupret from %x unwind to caller ;T4: ; CHECK4: CleanupReturnInst needs to be provided a CleanupPad ;T4: } + +;T5: define void @f() personality void ()* @g { +;T5: entry: +;T5: ret void +;T5: switch: +;T5: %cs = catchswitch within none [label %catch] unwind to caller +;T5: catch: +;T5: catchpad within %cs [] +;T5: unreachable +;T5: bogus: +;T5: cleanuppad within %cs [] +;T5: ; CHECK5: CleanupPadInst has an invalid parent +;T5: unreachable +;T5: } + +;T6: define void @f() personality void ()* @g { +;T6: entry: +;T6: ret void +;T6: switch1: +;T6: %cs1 = catchswitch within none [label %catch1] unwind label %catch2 +;T6: ; CHECK6: Block containg CatchPadInst must be jumped to only by its catchswitch +;T6: catch1: +;T6: catchpad within %cs1 [] +;T6: unreachable +;T6: switch2: +;T6: %cs2 = catchswitch within none [label %catch2] unwind to caller +;T6: catch2: +;T6: catchpad within %cs2 [] +;T6: unreachable +;T6: } + +;T7: define void @f() personality void ()* @g { +;T7: entry: +;T7: ret void +;T7: switch1: +;T7: %cs1 = catchswitch within none [label %catch1] unwind to caller +;T7: catch1: +;T7: catchpad within %cs1 [] +;T7: unreachable +;T7: switch2: +;T7: %cs2 = catchswitch within %cs1 [label %catch2] unwind to caller +;T7: ; CHECK7: CatchSwitchInst has an invalid parent +;T7: catch2: +;T7: catchpad within %cs2 [] +;T7: unreachable +;T7: } -- 2.34.1