PEI is now responsible for adding MaxCallFrameSize to frame size and align the stack...
authorEvan Cheng <evan.cheng@apple.com>
Tue, 23 Jan 2007 09:38:11 +0000 (09:38 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 23 Jan 2007 09:38:11 +0000 (09:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33460 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/PrologEpilogInserter.cpp
lib/Target/ARM/ARMRegisterInfo.cpp
lib/Target/Alpha/AlphaRegisterInfo.cpp
lib/Target/IA64/IA64RegisterInfo.cpp
lib/Target/X86/X86RegisterInfo.cpp

index 616e2ac7efa537592e70e01ed867777d2ee0c785..915fbc252bf4e8eb359264778e7b4a884ff63f45 100644 (file)
@@ -386,7 +386,22 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
     }
   }
 
-  // Set the final value of the stack pointer...
+  // Round up the size to a multiple of the alignment, but only if there are
+  // calls or alloca's in the function.  This ensures that any calls to
+  // subroutines have their stack frames suitable aligned.
+  if (FFI->hasCalls() || FFI->hasVarSizedObjects()) {
+    // When we have no frame pointer, we reserve argument space for call sites
+    // in the function immediately on entry to the current function. This
+    // eliminates the need for add/sub sp brackets around call sites.
+    const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
+    if (!RegInfo->hasFP(Fn))
+      Offset += FFI->getMaxCallFrameSize();
+
+    unsigned AlignMask = TFI.getStackAlignment() - 1;
+    Offset = (Offset + AlignMask) & ~AlignMask;
+  }
+
+  // Update frame info to pretend that this is part of the stack...
   FFI->setStackSize(Offset+TFI.getOffsetOfLocalArea());
 
   // Remember the required stack alignment in case targets need it to perform
index 2b179cf8218505e8dccee2ad5f60e39d71224315..1338a99b0aa435b4a95302b4415fdf3fd8679f3b 100644 (file)
@@ -915,21 +915,6 @@ void ARMRegisterInfo::emitPrologue(MachineFunction &MF) const {
     }
   }
 
-  // If necessary, add one more SUBri to account for the call frame
-  // and/or local storage, alloca area.
-  if (MFI->hasCalls() || MF.getFrameInfo()->hasVarSizedObjects()) {
-    // We reserve argument space for call sites in the function immediately on
-    // entry to the current function.  This eliminates the need for add/sub
-    // brackets around call sites.
-    if (!hasFP(MF))
-      NumBytes += MFI->getMaxCallFrameSize();
-
-    // Round the size to a multiple of the alignment.
-    NumBytes = (NumBytes+Align-1)/Align*Align;
-  }
-
-  MFI->setStackSize(NumBytes);
-
   // Determine starting offsets of spill areas.
   if (AFI->hasStackFrame()) {
     unsigned DPRCSOffset  = NumBytes - (GPRCS1Size + GPRCS2Size + DPRCSSize);
index 37d4deed55faf179f9e2fb0122ceb0e130d0ab49..bee76a2146b0f9ce4f2865017a00659e3155588c 100644 (file)
@@ -302,16 +302,6 @@ void AlphaRegisterInfo::emitPrologue(MachineFunction &MF) const {
   // Get the number of bytes to allocate from the FrameInfo
   long NumBytes = MFI->getStackSize();
 
-  if (MFI->hasCalls() && !FP) {
-    // We reserve argument space for call sites in the function immediately on
-    // entry to the current function.  This eliminates the need for add/sub
-    // brackets around call sites.
-    //If there is a frame pointer, then we don't do this
-    NumBytes += MFI->getMaxCallFrameSize();
-    DOUT << "Added " << MFI->getMaxCallFrameSize()
-         << " to the stack due to calls\n";
-  }
-
   if (FP)
     NumBytes += 8; //reserve space for the old FP
 
index bd62852013c6f51923c0cdeb118d48cceb63ea0f..cb9918fcb276d4d17645ba523b3c420da5feeee6 100644 (file)
@@ -256,13 +256,6 @@ void IA64RegisterInfo::emitPrologue(MachineFunction &MF) const {
   // Get the number of bytes to allocate from the FrameInfo
   unsigned NumBytes = MFI->getStackSize();
 
-  if (MFI->hasCalls() && !FP) {
-    // We reserve argument space for call sites in the function immediately on
-    // entry to the current function.  This eliminates the need for add/sub
-    // brackets around call sites.
-    NumBytes += MFI->getMaxCallFrameSize();
-  }
-
   if(FP)
     NumBytes += 8; // reserve space for the old FP
 
index 1ca0f465ffd269f0119ca25d8daa45b59d5c5122..1b05c045408446bee080b04097444a53e7d21a57 100644 (file)
@@ -991,29 +991,12 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
   MachineBasicBlock::iterator MBBI = MBB.begin();
   MachineFrameInfo *MFI = MF.getFrameInfo();
   unsigned Align = MF.getTarget().getFrameInfo()->getStackAlignment();
-  unsigned AlignMask = Align - 1;
   const Function* Fn = MF.getFunction();
   const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
   MachineInstr *MI;
   
   // Get the number of bytes to allocate from the FrameInfo
   unsigned NumBytes = MFI->getStackSize();
-  if (MFI->hasCalls() || MFI->hasVarSizedObjects()) {
-    // When we have no frame pointer, we reserve argument space for call sites
-    // in the function immediately on entry to the current function.  This
-    // eliminates the need for add/sub ESP brackets around call sites.
-    //
-    if (!hasFP(MF))
-      NumBytes += MFI->getMaxCallFrameSize();
-
-    // Round the size to a multiple of the alignment (don't forget the 4/8 byte
-    // offset pushed by the caller though). No need to align the stack if this
-    // is a leaf function.
-    NumBytes = (((NumBytes+SlotSize) + AlignMask) & ~AlignMask) - SlotSize;
-  }
-
-  // Update frame info to pretend that this is part of the stack...
-  MFI->setStackSize(NumBytes);
 
   if (NumBytes) {   // adjust stack pointer: ESP -= numbytes
     if (NumBytes >= 4096 && Subtarget->isTargetCygMing()) {