[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
This commit is contained in:
David Majnemer 2015-09-11 17:34:34 +00:00
parent 8ae5f645e7
commit 4c53124330
2 changed files with 38 additions and 1 deletions

View File

@ -172,7 +172,7 @@ void WinException::endFunction(const MachineFunction *MF) {
Asm->OutStreamer->PopSection();
}
if (shouldEmitMoves)
if (shouldEmitMoves || shouldEmitPersonality)
Asm->OutStreamer->EmitWinCFIEndProc();
}

View File

@ -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 }