Fix .seh_stackalloc 0
authorReid Kleckner <reid@kleckner.net>
Tue, 1 Jul 2014 00:42:47 +0000 (00:42 +0000)
committerReid Kleckner <reid@kleckner.net>
Tue, 1 Jul 2014 00:42:47 +0000 (00:42 +0000)
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

lib/MC/MCStreamer.cpp
lib/Target/X86/X86FrameLowering.cpp
test/MC/COFF/seh-stackalloc-zero.s [new file with mode: 0644]

index eca1ed7d7fe315673cf61138caa9deb633b04421..bdcdb970cc178fc39c00739bf7cb476dede58cdd 100644 (file)
@@ -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;
index 1544549e5e9995d52550ee20d76cbcb10e80d547..8c029a8c22d5f864233272d1687505a7ab4b5f2f 100644 (file)
@@ -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 (file)
index 0000000..898ac84
--- /dev/null
@@ -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