diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-03-01 18:59:50 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-03-01 18:59:50 +0000 |
commit | 45ebda4278681e7085e7f2751a3d8f9773e47d49 (patch) | |
tree | 4479508b02cd35826f544ea8ee49654769c3653d /llvm | |
parent | 8832e5e2f59ca8001d10965af9a8ad3c9b3604da (diff) | |
download | bcm5719-llvm-45ebda4278681e7085e7f2751a3d8f9773e47d49.tar.gz bcm5719-llvm-45ebda4278681e7085e7f2751a3d8f9773e47d49.zip |
[Verifier] Don't abort on invalid cleanuprets
Code in visitEHPadPredecessors assume a little too much about the
validity of a cleanupret with an invalid cleanuppad operand.
llvm-svn: 262364
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Verifier/invalid-eh.ll | 15 |
2 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index bea9b340f7b..48792fbfc42 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -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; diff --git a/llvm/test/Verifier/invalid-eh.ll b/llvm/test/Verifier/invalid-eh.ll index e631715453c..db7dec706b8 100644 --- a/llvm/test/Verifier/invalid-eh.ll +++ b/llvm/test/Verifier/invalid-eh.ll @@ -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: } |