From: Reid Kleckner Date: Tue, 1 Jul 2014 00:42:47 +0000 (+0000) Subject: Fix .seh_stackalloc 0 X-Git-Tag: android-x86-7.1-r4~60145 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=cc2a78f941b98060ea8fdfcbad74aa38d833c4a1;p=android-x86%2Fexternal-llvm.git Fix .seh_stackalloc 0 seh_stackalloc 0 is not representable in Win64 SEH info, so emitting it is a bug. Reviewers: rnk Differential Revision: http://reviews.llvm.org/D4334 Patch by Vadim Chugunov! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212081 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index eca1ed7d7fe..bdcdb970cc1 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -515,6 +515,8 @@ void MCStreamer::EmitWinCFISetFrame(unsigned Register, unsigned Offset) { void MCStreamer::EmitWinCFIAllocStack(unsigned Size) { EnsureValidW64UnwindInfo(); + if (Size == 0) + report_fatal_error("Allocation size must be non-zero!"); if (Size & 7) report_fatal_error("Misaligned stack allocation!"); MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo; diff --git a/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp index 1544549e5e9..8c029a8c22d 100644 --- a/lib/Target/X86/X86FrameLowering.cpp +++ b/lib/Target/X86/X86FrameLowering.cpp @@ -751,10 +751,13 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const { SEHFrameOffset += SEHFrameOffset % 16; // ensure alignmant // This only needs to account for XMM spill slots, GPR slots - // are covered by .seh_pushreg's emitted above. - BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_StackAlloc)) - .addImm(SEHFrameOffset - X86FI->getCalleeSavedFrameSize()) - .setMIFlag(MachineInstr::FrameSetup); + // are covered by the .seh_pushreg's emitted above. + unsigned Size = SEHFrameOffset - X86FI->getCalleeSavedFrameSize(); + if (Size) { + BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_StackAlloc)) + .addImm(Size) + .setMIFlag(MachineInstr::FrameSetup); + } BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_SetFrame)) .addImm(FramePtr) diff --git a/test/MC/COFF/seh-stackalloc-zero.s b/test/MC/COFF/seh-stackalloc-zero.s new file mode 100644 index 00000000000..898ac844417 --- /dev/null +++ b/test/MC/COFF/seh-stackalloc-zero.s @@ -0,0 +1,11 @@ +// RUN: not llvm-mc -triple x86_64-pc-win32 -filetype=obj %s -o %t.o 2>&1 | FileCheck %s + +// CHECK: Allocation size must be non-zero! + + .globl smallFunc + .def smallFunc; .scl 2; .type 32; .endef + .seh_proc smallFunc + .seh_stackalloc 0 +smallFunc: + ret + .seh_endproc