[llvm] r212081 - Fix .seh_stackalloc 0
Reid Kleckner
reid at kleckner.net
Mon Jun 30 17:42:47 PDT 2014
Author: rnk
Date: Mon Jun 30 19:42:47 2014
New Revision: 212081
URL: http://llvm.org/viewvc/llvm-project?rev=212081&view=rev
Log:
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!
Added:
llvm/trunk/test/MC/COFF/seh-stackalloc-zero.s
Modified:
llvm/trunk/lib/MC/MCStreamer.cpp
llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
Modified: llvm/trunk/lib/MC/MCStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=212081&r1=212080&r2=212081&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCStreamer.cpp Mon Jun 30 19:42:47 2014
@@ -515,6 +515,8 @@ void MCStreamer::EmitWinCFISetFrame(unsi
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;
Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=212081&r1=212080&r2=212081&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Mon Jun 30 19:42:47 2014
@@ -751,10 +751,13 @@ void X86FrameLowering::emitPrologue(Mach
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)
Added: llvm/trunk/test/MC/COFF/seh-stackalloc-zero.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/seh-stackalloc-zero.s?rev=212081&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/seh-stackalloc-zero.s (added)
+++ llvm/trunk/test/MC/COFF/seh-stackalloc-zero.s Mon Jun 30 19:42:47 2014
@@ -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
More information about the llvm-commits
mailing list