From 0d056fd4c33b7eb83b84c6577e3a8d8c5f7dee64 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 22 Jan 2015 02:27:44 +0000 Subject: [PATCH] Win64 SEH: Emit the constant 1 for catch-all into xdata git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226767 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/Win64Exception.cpp | 4 ++-- test/CodeGen/X86/seh-catch-all.ll | 29 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/seh-catch-all.ll diff --git a/lib/CodeGen/AsmPrinter/Win64Exception.cpp b/lib/CodeGen/AsmPrinter/Win64Exception.cpp index 80edc405ca9..73278c835bc 100644 --- a/lib/CodeGen/AsmPrinter/Win64Exception.cpp +++ b/lib/CodeGen/AsmPrinter/Win64Exception.cpp @@ -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 index 00000000000..9ac269dec65 --- /dev/null +++ b/test/CodeGen/X86/seh-catch-all.ll @@ -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