OSDN Git Service

[Verifier] Don't abort on invalid cleanuprets
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 1 Mar 2016 18:59:50 +0000 (18:59 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 1 Mar 2016 18:59:50 +0000 (18:59 +0000)
Code in visitEHPadPredecessors assume a little too much about the
validity of a cleanupret with an invalid cleanuppad operand.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262364 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/Verifier.cpp
test/Verifier/invalid-eh.ll

index bea9b34..48792fb 100644 (file)
@@ -3055,7 +3055,7 @@ void Verifier::visitEHPadPredecessors(Instruction &I) {
       else
         FromPad = ConstantTokenNone::get(II->getContext());
     } else if (auto *CRI = dyn_cast<CleanupReturnInst>(TI)) {
-      FromPad = CRI->getCleanupPad();
+      FromPad = CRI->getOperand(0);
       Assert(FromPad != ToPadParent, "A cleanupret must exit its cleanup", CRI);
     } else if (auto *CSI = dyn_cast<CatchSwitchInst>(TI)) {
       FromPad = CSI;
index e631715..db7dec7 100644 (file)
@@ -23,6 +23,7 @@
 ; RUN: sed -e s/.T23:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK23 %s
 ; RUN: sed -e s/.T24:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK24 %s
 ; RUN: sed -e s/.T25:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK25 %s
+; RUN: sed -e s/.T26:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK26 %s
 
 declare void @g()
 
@@ -439,3 +440,17 @@ declare void @g()
 ;T25:   %cp3 = cleanuppad within none []
 ;T25:   cleanupret from %cp3 unwind to caller
 ;T25: }
+
+;T26: define void @f() personality void ()* @g {
+;T26: entry:
+;T26:   ret void
+;T26:
+;T26: ehcleanup:
+;T26:   cleanuppad within none []
+;T26:   cleanupret from none unwind label %ehcleanup
+;T26:   ; CHECK26: A cleanupret must exit its cleanup
+;T26:   ; CHECK26:   cleanupret from none unwind label %ehcleanup
+;T26:   ; CHECK26: CleanupReturnInst needs to be provided a CleanupPad
+;T26:   ; CHECK26:   cleanupret from none unwind label %ehcleanup
+;T26:   ; CHECK26: token none
+;T26: }