[X86] Make sure startproc/endproc are paired
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 11 Sep 2015 17:34:34 +0000 (17:34 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 11 Sep 2015 17:34:34 +0000 (17:34 +0000)
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
test/CodeGen/X86/pr24374.ll [new file with mode: 0644]

index 095315809cb0a2d2c71c9d3688cf4704440b5516..cd360218f3675d1faea0710e393b4c5fad8cde35 100644 (file)
@@ -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 (file)
index 0000000..7f331e1
--- /dev/null
@@ -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 }