summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-09-11 17:34:34 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-09-11 17:34:34 +0000
commit0e70598a5b5797bb2f119f8c39f6f5b3cd904c67 (patch)
tree333997fc2bed0b51e498b06fcff8fa34341f1610 /llvm
parent9e8f2b46b2c45f37b9f7f2af73815cccd4265928 (diff)
downloadbcm5719-llvm-0e70598a5b5797bb2f119f8c39f6f5b3cd904c67.tar.gz
bcm5719-llvm-0e70598a5b5797bb2f119f8c39f6f5b3cd904c67.zip
[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: 247435
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/WinException.cpp2
-rw-r--r--llvm/test/CodeGen/X86/pr24374.ll37
2 files changed, 38 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
index 095315809cb..cd360218f36 100644
--- a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
+++ b/llvm/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/llvm/test/CodeGen/X86/pr24374.ll b/llvm/test/CodeGen/X86/pr24374.ll
new file mode 100644
index 00000000000..7f331e10396
--- /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 }
OpenPOWER on IntegriCloud