[WinEH] Ignore filter clauses while mapping landing pad blocks.
authorAndrew Kaylor <andrew.kaylor@intel.com>
Thu, 23 Apr 2015 22:38:36 +0000 (22:38 +0000)
committerAndrew Kaylor <andrew.kaylor@intel.com>
Thu, 23 Apr 2015 22:38:36 +0000 (22:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235656 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/WinEHPrepare.cpp
test/CodeGen/X86/seh-filter.ll [new file with mode: 0644]

index a1da1aefd8f456d0a72997492e4a29d6c2d77069..b1eea7dbb07b24a4530c7f870f2d2e23e56ff57e 100644 (file)
@@ -1666,6 +1666,12 @@ void WinEHPrepare::mapLandingPadBlocks(LandingPadInst *LPad,
   while (HandlersFound != NumClauses) {
     BasicBlock *NextBB = nullptr;
 
+    // Skip over filter clauses.
+    if (LPad->isFilter(HandlersFound)) {
+      ++HandlersFound;
+      continue;
+    }
+
     // See if the clause we're looking for is a catch-all.
     // If so, the catch begins immediately.
     Constant *ExpectedSelector = LPad->getClause(HandlersFound)->stripPointerCasts();
diff --git a/test/CodeGen/X86/seh-filter.ll b/test/CodeGen/X86/seh-filter.ll
new file mode 100644 (file)
index 0000000..6a3a23e
--- /dev/null
@@ -0,0 +1,21 @@
+; RUN: llc -O0 -mtriple=x86_64-windows-msvc < %s | FileCheck %s
+
+declare void @g()
+define void @f() {
+  invoke void @g() to label %return unwind label %lpad
+
+return:
+  ret void
+
+lpad:
+  %ehptrs = landingpad {i8*, i32} personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
+    filter [0 x i8*] zeroinitializer
+  call void @__cxa_call_unexpected(i8* null)
+  unreachable
+}
+declare i32 @__C_specific_handler(...)
+declare void @__cxa_call_unexpected(i8*)
+
+; We don't emit entries for filters.
+; CHECK: .seh_handlerdata
+; CHECK: .long 0