Win64 SEH: Emit the constant 1 for catch-all into xdata
authorReid Kleckner <reid@kleckner.net>
Thu, 22 Jan 2015 02:27:44 +0000 (02:27 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 22 Jan 2015 02:27:44 +0000 (02:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226767 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 80edc405ca93206e3b1ce409e29bb07bf9da20e1..73278c835bc9f6f4d821255dafd5b96f2199164a 100644 (file)
@@ -145,7 +145,7 @@ const MCSymbolRefExpr *Win64Exception::createImageRel32(const MCSymbol *Value) {
 ///     struct Entry {
 ///       imagerel32 LabelStart;
 ///       imagerel32 LabelEnd;
-///       imagerel32 FilterOrFinally;  // Zero means catch-all.
+///       imagerel32 FilterOrFinally;  // One means catch-all.
 ///       imagerel32 LabelLPad;        // Zero means __finally.
 ///     } Entries[NumEntries];
 ///   };
@@ -241,7 +241,7 @@ void Win64Exception::emitCSpecificHandlerTable() {
         if (TI) // Emit the filter function pointer.
           Asm->OutStreamer.EmitValue(createImageRel32(Asm->getSymbol(TI)), 4);
         else  // Otherwise, this is a "catch i8* null", or catch all.
-          Asm->OutStreamer.EmitIntValue(0, 4);
+          Asm->OutStreamer.EmitIntValue(1, 4);
       }
       Asm->OutStreamer.EmitValue(createImageRel32(ClauseLabel), 4);
     }
diff --git a/test/CodeGen/X86/seh-catch-all.ll b/test/CodeGen/X86/seh-catch-all.ll
new file mode 100644 (file)
index 0000000..9ac269d
--- /dev/null
@@ -0,0 +1,29 @@
+; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s
+
+@str = internal unnamed_addr constant [10 x i8] c"recovered\00", align 1
+
+declare i32 @__C_specific_handler(...)
+declare void @crash()
+declare i32 @puts(i8*)
+
+define i32 @main() {
+entry:
+  invoke void @crash()
+          to label %__try.cont unwind label %lpad
+
+lpad:
+  %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
+          catch i8* null
+  call i32 @puts(i8* getelementptr inbounds ([10 x i8]* @str, i64 0, i64 0))
+  br label %__try.cont
+
+__try.cont:
+  ret i32 0
+
+eh.resume:
+  resume { i8*, i32 } %0
+}
+
+; CHECK-LABEL: main:
+; CHECK: .seh_handlerdata
+; CHECK: .long