[PATCH] D16011: [WinEH] Fix catchpad pred verification
Joseph Tremoulet via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 8 13:07:56 PST 2016
JosephTremoulet created this revision.
JosephTremoulet added reviewers: majnemer, andrew.w.kaylor, rnk.
JosephTremoulet added a subscriber: llvm-commits.
The code was simply ensuring that the catchpad's pred is its catchswitch,
which was letting cases slip through where the flow edge was the unwind
edge of the catchswitch rather than one of its catch clauses.
http://reviews.llvm.org/D16011
Files:
lib/IR/Verifier.cpp
test/Verifier/invalid-eh.ll
Index: test/Verifier/invalid-eh.ll
===================================================================
--- test/Verifier/invalid-eh.ll
+++ test/Verifier/invalid-eh.ll
@@ -17,6 +17,8 @@
; RUN: sed -e s/.T17:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK17 %s
; RUN: sed -e s/.T18:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK18 %s
; RUN: sed -e s/.T19:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK19 %s
+; RUN: sed -e s/.T20:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK20 %s
+; RUN: sed -e s/.T21:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK21 %s
declare void @g()
@@ -339,3 +341,32 @@
;T19: unreachable:
;T19: unreachable
;T19: }
+
+;T20: define void @f() personality void ()* @g {
+;T20: entry:
+;T20: ret void
+;T20: switch:
+;T20: %cs = catchswitch within none [label %catch] unwind label %catch
+;T20: ; CHECK20: Catchswitch cannot unwind to one of its catchpads
+;T20: ; CHECK20-NEXT: %cs = catchswitch within none [label %catch] unwind label %catch
+;T20: ; CHECK20-NEXT: %cp = catchpad within %cs [i32 4]
+;T20: catch:
+;T20: %cp = catchpad within %cs [i32 4]
+;T20: unreachable
+;T20: }
+
+;T21: define void @f() personality void ()* @g {
+;T21: entry:
+;T21: ret void
+;T21: switch:
+;T21: %cs = catchswitch within none [label %catch1] unwind label %catch2
+;T21: ; CHECK21: Catchswitch cannot unwind to one of its catchpads
+;T21: ; CHECK21-NEXT: %cs = catchswitch within none [label %catch1] unwind label %catch2
+;T21: ; CHECK21-NEXT: %cp2 = catchpad within %cs [i32 2]
+;T21: catch1:
+;T21: %cp1 = catchpad within %cs [i32 1]
+;T21: unreachable
+;T21: catch2:
+;T21: %cp2 = catchpad within %cs [i32 2]
+;T21: unreachable
+;T21: }
Index: lib/IR/Verifier.cpp
===================================================================
--- lib/IR/Verifier.cpp
+++ lib/IR/Verifier.cpp
@@ -2996,6 +2996,9 @@
"Block containg CatchPadInst must be jumped to "
"only by its catchswitch.",
CPI);
+ Assert(BB != CPI->getCatchSwitch()->getUnwindDest(),
+ "Catchswitch cannot unwind to one of its catchpads",
+ CPI->getCatchSwitch(), CPI);
return;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16011.44371.patch
Type: text/x-patch
Size: 2373 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160108/ddd76ca0/attachment.bin>
More information about the llvm-commits
mailing list