Fix assertion when C++ EH filters are present in functions using SEH
authorReid Kleckner <reid@kleckner.net>
Fri, 23 Jan 2015 23:51:25 +0000 (23:51 +0000)
committerReid Kleckner <reid@kleckner.net>
Fri, 23 Jan 2015 23:51:25 +0000 (23:51 +0000)
Should fix PR22305.

llvm-svn: 226969

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

index a1719a5..ff12d5d 100644 (file)
@@ -221,12 +221,11 @@ void Win64Exception::emitCSpecificHandlerTable() {
 
     // 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::emitCSpecificHandlerTable() {
         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);
     }
   }
diff --git a/llvm/test/CodeGen/X86/seh-filter.ll b/llvm/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