summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2015-11-21 01:08:13 +0000
committerTom Stellard <thomas.stellard@amd.com>2015-11-21 01:08:13 +0000
commit33c352b3eda89abc24e7511d9045fa2e499a42e3 (patch)
tree7bd6db5b620f10e2d846176f12468061bcf46869
parent3f4c496a9449877189c27c537c0c7699610d6ddb (diff)
downloadllvm-release_37.tar.gz
Merging r247435:release_37
------------------------------------------------------------------------ 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. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_37@253742 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/AsmPrinter/WinException.cpp2
-rw-r--r--test/CodeGen/X86/pr24374.ll37
2 files changed, 38 insertions, 1 deletions
diff --git a/lib/CodeGen/AsmPrinter/WinException.cpp b/lib/CodeGen/AsmPrinter/WinException.cpp
index 71c77815e281..a2b9316aa875 100644
--- a/lib/CodeGen/AsmPrinter/WinException.cpp
+++ b/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/test/CodeGen/X86/pr24374.ll b/test/CodeGen/X86/pr24374.ll
new file mode 100644
index 000000000000..7f331e103966
--- /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 }