[llvm] r226969 - Fix assertion when C++ EH filters are present in functions using SEH

Reid Kleckner reid at kleckner.net
Fri Jan 23 15:51:25 PST 2015


Author: rnk
Date: Fri Jan 23 17:51:25 2015
New Revision: 226969

URL: http://llvm.org/viewvc/llvm-project?rev=226969&view=rev
Log:
Fix assertion when C++ EH filters are present in functions using SEH

Should fix PR22305.

Added:
    llvm/trunk/test/CodeGen/X86/seh-filter.ll
Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp?rev=226969&r1=226968&r2=226969&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp Fri Jan 23 17:51:25 2015
@@ -221,12 +221,11 @@ void Win64Exception::emitCSpecificHandle
 
     // Do a parallel iteration across typeids and clause labels, skipping filter
     // clauses.
-    assert(LPad->TypeIds.size() == LPad->ClauseLabels.size());
+    size_t NextClauseLabel = 0;
     for (size_t I = 0, E = LPad->TypeIds.size(); I < E; ++I) {
       // AddLandingPadInfo stores the clauses in reverse, but there is a FIXME
       // to change that.
       int Selector = LPad->TypeIds[E - I - 1];
-      MCSymbol *ClauseLabel = LPad->ClauseLabels[I];
 
       // Ignore C++ filter clauses in SEH.
       // FIXME: Implement cleanup clauses.
@@ -243,6 +242,7 @@ void Win64Exception::emitCSpecificHandle
         else  // Otherwise, this is a "catch i8* null", or catch all.
           Asm->OutStreamer.EmitIntValue(1, 4);
       }
+      MCSymbol *ClauseLabel = LPad->ClauseLabels[NextClauseLabel++];
       Asm->OutStreamer.EmitValue(createImageRel32(ClauseLabel), 4);
     }
   }

Added: llvm/trunk/test/CodeGen/X86/seh-filter.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/seh-filter.ll?rev=226969&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/seh-filter.ll (added)
+++ llvm/trunk/test/CodeGen/X86/seh-filter.ll Fri Jan 23 17:51:25 2015
@@ -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





More information about the llvm-commits mailing list