From 4c531243304e9405ec244f802c6da37217952456 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 11 Sep 2015 17:34:34 +0000 Subject: [PATCH] [X86] Make sure startproc/endproc are paired We used different conditions to determine if we should emit startproc vs endproc. Use the same condition to ensure that they will always be paired. This fixes PR24374. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247435 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/WinException.cpp | 2 +- test/CodeGen/X86/pr24374.ll | 37 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/pr24374.ll diff --git a/lib/CodeGen/AsmPrinter/WinException.cpp b/lib/CodeGen/AsmPrinter/WinException.cpp index 095315809cb..cd360218f36 100644 --- a/lib/CodeGen/AsmPrinter/WinException.cpp +++ b/lib/CodeGen/AsmPrinter/WinException.cpp @@ -172,7 +172,7 @@ void WinException::endFunction(const MachineFunction *MF) { Asm->OutStreamer->PopSection(); } - if (shouldEmitMoves) + if (shouldEmitMoves || shouldEmitPersonality) Asm->OutStreamer->EmitWinCFIEndProc(); } diff --git a/test/CodeGen/X86/pr24374.ll b/test/CodeGen/X86/pr24374.ll new file mode 100644 index 00000000000..7f331e10396 --- /dev/null +++ b/test/CodeGen/X86/pr24374.ll @@ -0,0 +1,37 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-w64-windows-gnu" + +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @g, i8* null }] + +declare i32 @__gxx_personality_seh0(...) + +; Function Attrs: nounwind +define void @f() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_seh0 to i8*) { +entry: + invoke void @g() + to label %exit unwind label %lpad + +lpad: ; preds = %entry + landingpad { i8*, i32 } + cleanup + unreachable + +exit: ; preds = %entry + unreachable +} +; CHECK-LABEL: f: +; CHECK: .seh_proc f +; CHECK: .seh_handler __gxx_personality_seh0, @unwind, @except +; CHECK: callq g +; CHECK: .seh_handlerdata +; CHECK: .seh_endproc + +define void @g() { + unreachable +} +; CHECK-LABEL: g: +; CHECK: .seh_proc g +; CHECK: .seh_endproc + +attributes #0 = { nounwind } -- 2.34.1