Correctly restore stack pointer after realignment in main() on Cygwin/Mingw32
authorAnton Korobeynikov <asl@math.spbu.ru>
Wed, 26 Sep 2007 00:13:34 +0000 (00:13 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Wed, 26 Sep 2007 00:13:34 +0000 (00:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42332 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86RegisterInfo.cpp

index f7cd84fb33837d8230cfda8ab7f04858804690b2..1fdee671ef962c23607bb37eb96f41723c0087bb 100644 (file)
@@ -1545,7 +1545,9 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
 void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
                                    MachineBasicBlock &MBB) const {
   const MachineFrameInfo *MFI = MF.getFrameInfo();
+  const Function* Fn = MF.getFunction();
   X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
+  const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
   MachineBasicBlock::iterator MBBI = prior(MBB.end());
   unsigned RetOpcode = MBBI->getOpcode();
 
@@ -1602,7 +1604,12 @@ void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
 
   // If dynamic alloca is used, then reset esp to point to the last
   // callee-saved slot before popping them off!
-  if (MFI->hasVarSizedObjects()) {
+  // Also, if it's main() on Cygwin/Mingw32 we aligned stack in the prologue, - revert
+  // stack changes back. Note: we're assuming, that frame pointer was forced
+  // for main()
+  if (MFI->hasVarSizedObjects() ||
+      (Fn->hasExternalLinkage() && Fn->getName() == "main" &&
+       Subtarget->isTargetCygMing())) {
     unsigned Opc = Is64Bit ? X86::LEA64r : X86::LEA32r;
     if (CSSize) {
       MachineInstr *MI = addRegOffset(BuildMI(TII.get(Opc), StackPtr),