mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-20 12:31:40 +00:00
PEI is now responsible for adding MaxCallFrameSize to frame size and align the stack. Each target can further adjust the frame size if necessary.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33460 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c970812283
commit
367372a30c
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user