From c3ab51cd9267db85a55ba0bb2ac03db453bd0316 Mon Sep 17 00:00:00 2001
From: Tom Stellard <thomas.stellard@amd.com>
Date: Sat, 21 Nov 2015 01:08:13 +0000
Subject: [PATCH] Merging r247435:

------------------------------------------------------------------------
r247435 | david.majnemer | 2015-09-11 13:34:34 -0400 (Fri, 11 Sep 2015) | 8 lines

[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.

------------------------------------------------------------------------

llvm-svn: 253742
---
 llvm/lib/CodeGen/AsmPrinter/WinException.cpp |  2 +-
 llvm/test/CodeGen/X86/pr24374.ll             | 37 ++++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/X86/pr24374.ll

diff --git a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
index 71c77815e281..a2b9316aa875 100644
--- a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
@@ -169,7 +169,7 @@ void WinException::endFunction(const MachineFunction *MF) {
     Asm->OutStreamer->PopSection();
   }
 
-  if (shouldEmitMoves)
+  if (shouldEmitMoves || shouldEmitPersonality)
     Asm->OutStreamer->EmitWinCFIEndProc();
 }
 
diff --git a/llvm/test/CodeGen/X86/pr24374.ll b/llvm/test/CodeGen/X86/pr24374.ll
new file mode 100644
index 000000000000..7f331e103966
--- /dev/null
+++ b/llvm/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 }
-- 
GitLab