mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
PPC LinkageSize can be computed at initialization time, do so.
llvm-svn: 229163
This commit is contained in:
parent
f99210d18e
commit
1c5ae15916
@ -1237,9 +1237,7 @@ bool PPCFastISel::processCallArgs(SmallVectorImpl<Value*> &Args,
|
||||
CCState CCInfo(CC, IsVarArg, *FuncInfo.MF, ArgLocs, *Context);
|
||||
|
||||
// Reserve space for the linkage area on the stack.
|
||||
bool isELFv2ABI = PPCSubTarget->isELFv2ABI();
|
||||
unsigned LinkageSize = PPCFrameLowering::getLinkageSize(true, false,
|
||||
isELFv2ABI);
|
||||
unsigned LinkageSize = PPCSubTarget->getFrameLowering()->getLinkageSize();
|
||||
CCInfo.AllocateStack(LinkageSize, 8);
|
||||
|
||||
CCInfo.AnalyzeCallOperands(ArgVTs, ArgFlags, CC_PPC64_ELF_FIS);
|
||||
|
@ -60,12 +60,21 @@ static unsigned computeFramePointerSaveOffset(const PPCSubtarget &STI) {
|
||||
return STI.isPPC64() ? -8U : -4U;
|
||||
}
|
||||
|
||||
static unsigned computeLinkageSize(const PPCSubtarget &STI) {
|
||||
if (STI.isDarwinABI() || STI.isPPC64())
|
||||
return (STI.isELFv2ABI() ? 4 : 6) * (STI.isPPC64() ? 8 : 4);
|
||||
|
||||
// SVR4 ABI:
|
||||
return 8;
|
||||
}
|
||||
|
||||
PPCFrameLowering::PPCFrameLowering(const PPCSubtarget &STI)
|
||||
: TargetFrameLowering(TargetFrameLowering::StackGrowsDown,
|
||||
(STI.hasQPX() || STI.isBGQ()) ? 32 : 16, 0),
|
||||
Subtarget(STI), ReturnSaveOffset(computeReturnSaveOffset(Subtarget)),
|
||||
TOCSaveOffset(computeTOCSaveOffset(Subtarget)),
|
||||
FramePointerSaveOffset(computeFramePointerSaveOffset(Subtarget)) {}
|
||||
FramePointerSaveOffset(computeFramePointerSaveOffset(Subtarget)),
|
||||
LinkageSize(computeLinkageSize(Subtarget)) {}
|
||||
|
||||
// With the SVR4 ABI, callee-saved registers have fixed offsets on the stack.
|
||||
const PPCFrameLowering::SpillSlot *PPCFrameLowering::getCalleeSavedSpillSlots(
|
||||
@ -441,9 +450,7 @@ unsigned PPCFrameLowering::determineFrameLayout(MachineFunction &MF,
|
||||
unsigned maxCallFrameSize = MFI->getMaxCallFrameSize();
|
||||
|
||||
// Maximum call frame needs to be at least big enough for linkage area.
|
||||
unsigned minCallFrameSize = getLinkageSize(Subtarget.isPPC64(),
|
||||
Subtarget.isDarwinABI(),
|
||||
Subtarget.isELFv2ABI());
|
||||
unsigned minCallFrameSize = getLinkageSize();
|
||||
maxCallFrameSize = std::max(maxCallFrameSize, minCallFrameSize);
|
||||
|
||||
// If we have dynamic alloca then maxCallFrameSize needs to be aligned so
|
||||
|
@ -26,6 +26,7 @@ class PPCFrameLowering: public TargetFrameLowering {
|
||||
const unsigned ReturnSaveOffset;
|
||||
const unsigned TOCSaveOffset;
|
||||
const unsigned FramePointerSaveOffset;
|
||||
const unsigned LinkageSize;
|
||||
|
||||
public:
|
||||
PPCFrameLowering(const PPCSubtarget &STI);
|
||||
@ -94,14 +95,7 @@ public:
|
||||
|
||||
/// getLinkageSize - Return the size of the PowerPC ABI linkage area.
|
||||
///
|
||||
static unsigned getLinkageSize(bool isPPC64, bool isDarwinABI,
|
||||
bool isELFv2ABI) {
|
||||
if (isDarwinABI || isPPC64)
|
||||
return (isELFv2ABI ? 4 : 6) * (isPPC64 ? 8 : 4);
|
||||
|
||||
// SVR4 ABI:
|
||||
return 8;
|
||||
}
|
||||
unsigned getLinkageSize() const { return LinkageSize; }
|
||||
|
||||
const SpillSlot *
|
||||
getCalleeSavedSpillSlots(unsigned &NumEntries) const override;
|
||||
|
@ -2432,7 +2432,7 @@ PPCTargetLowering::LowerFormalArguments_32SVR4(
|
||||
*DAG.getContext());
|
||||
|
||||
// Reserve space for the linkage area on the stack.
|
||||
unsigned LinkageSize = PPCFrameLowering::getLinkageSize(false, false, false);
|
||||
unsigned LinkageSize = Subtarget.getFrameLowering()->getLinkageSize();
|
||||
CCInfo.AllocateStack(LinkageSize, PtrByteSize);
|
||||
|
||||
CCInfo.AnalyzeFormalArguments(Ins, CC_PPC32_SVR4);
|
||||
@ -2642,9 +2642,7 @@ PPCTargetLowering::LowerFormalArguments_64SVR4(
|
||||
bool isImmutable = !(getTargetMachine().Options.GuaranteedTailCallOpt &&
|
||||
(CallConv == CallingConv::Fast));
|
||||
unsigned PtrByteSize = 8;
|
||||
|
||||
unsigned LinkageSize = PPCFrameLowering::getLinkageSize(true, false,
|
||||
isELFv2ABI);
|
||||
unsigned LinkageSize = Subtarget.getFrameLowering()->getLinkageSize();
|
||||
|
||||
static const MCPhysReg GPR[] = {
|
||||
PPC::X3, PPC::X4, PPC::X5, PPC::X6,
|
||||
@ -3009,9 +3007,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
|
||||
bool isImmutable = !(getTargetMachine().Options.GuaranteedTailCallOpt &&
|
||||
(CallConv == CallingConv::Fast));
|
||||
unsigned PtrByteSize = isPPC64 ? 8 : 4;
|
||||
|
||||
unsigned LinkageSize = PPCFrameLowering::getLinkageSize(isPPC64, true,
|
||||
false);
|
||||
unsigned LinkageSize = Subtarget.getFrameLowering()->getLinkageSize();
|
||||
unsigned ArgOffset = LinkageSize;
|
||||
// Area that is at least reserved in caller of this function.
|
||||
unsigned MinReservedArea = ArgOffset;
|
||||
@ -4067,7 +4063,7 @@ PPCTargetLowering::LowerCall_32SVR4(SDValue Chain, SDValue Callee,
|
||||
*DAG.getContext());
|
||||
|
||||
// Reserve space for the linkage area on the stack.
|
||||
CCInfo.AllocateStack(PPCFrameLowering::getLinkageSize(false, false, false),
|
||||
CCInfo.AllocateStack(Subtarget.getFrameLowering()->getLinkageSize(),
|
||||
PtrByteSize);
|
||||
|
||||
if (isVarArg) {
|
||||
@ -4303,8 +4299,7 @@ PPCTargetLowering::LowerCall_64SVR4(SDValue Chain, SDValue Callee,
|
||||
// area, and parameter passing area. On ELFv1, the linkage area is 48 bytes
|
||||
// reserved space for [SP][CR][LR][2 x unused][TOC]; on ELFv2, the linkage
|
||||
// area is 32 bytes reserved space for [SP][CR][LR][TOC].
|
||||
unsigned LinkageSize = PPCFrameLowering::getLinkageSize(true, false,
|
||||
isELFv2ABI);
|
||||
unsigned LinkageSize = Subtarget.getFrameLowering()->getLinkageSize();
|
||||
unsigned NumBytes = LinkageSize;
|
||||
unsigned GPR_idx = 0, FPR_idx = 0, VR_idx = 0;
|
||||
|
||||
@ -4848,8 +4843,7 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,
|
||||
// Count how many bytes are to be pushed on the stack, including the linkage
|
||||
// area, and parameter passing area. We start with 24/48 bytes, which is
|
||||
// prereserved space for [SP][CR][LR][3 x unused].
|
||||
unsigned LinkageSize = PPCFrameLowering::getLinkageSize(isPPC64, true,
|
||||
false);
|
||||
unsigned LinkageSize = Subtarget.getFrameLowering()->getLinkageSize();
|
||||
unsigned NumBytes = LinkageSize;
|
||||
|
||||
// Add up all the space actually used.
|
||||
|
Loading…
x
Reference in New Issue
Block a user