mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Make the following changes in MipsISelLowering.cpp:
- Stop creating stack frame objects needed for saving $gp. - Insert a node that copies the global pointer register to register $gp before the call node. This will ensure $gp is valid at the entry of the called function. llvm-svn: 156692
This commit is contained in:
parent
f6e9e7cbc7
commit
ae43b7da61
@ -2455,11 +2455,6 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
Chain = CallSeqStart = DAG.getCALLSEQ_START(InChain, NextStackOffsetVal);
|
||||
ByValChain = InChain;
|
||||
|
||||
// If this is the first call, create a stack frame object that points to
|
||||
// a location to which .cprestore saves $gp.
|
||||
if (IsO32 && IsPIC && MipsFI->globalBaseRegFixed() && !MipsFI->getGPFI())
|
||||
MipsFI->setGPFI(MFI->CreateFixedObject(4, 0, true));
|
||||
|
||||
// Get the frame index of the stack frame object that points to the location
|
||||
// of dynamically allocated area on the stack.
|
||||
int DynAllocFI = MipsFI->getDynAllocFI();
|
||||
@ -2482,9 +2477,6 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
NextStackOffset = (NextStackOffset + StackAlignment - 1) /
|
||||
StackAlignment * StackAlignment;
|
||||
|
||||
if (MipsFI->needGPSaveRestore())
|
||||
MFI->setObjectOffset(MipsFI->getGPFI(), NextStackOffset);
|
||||
|
||||
MFI->setObjectOffset(DynAllocFI, NextStackOffset);
|
||||
}
|
||||
|
||||
@ -2656,6 +2648,14 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
|
||||
Callee = DAG.getRegister(T9Reg, getPointerTy());
|
||||
}
|
||||
|
||||
// Insert node "GP copy globalreg" before call to function.
|
||||
// Lazy-binding stubs require GP to point to the GOT.
|
||||
if (IsPICCall) {
|
||||
unsigned GPReg = IsN64 ? Mips::GP_64 : Mips::GP;
|
||||
EVT Ty = IsN64 ? MVT::i64 : MVT::i32;
|
||||
RegsToPass.push_back(std::make_pair(GPReg, GetGlobalReg(DAG, Ty)));
|
||||
}
|
||||
|
||||
// Build a sequence of copy-to-reg nodes chained together with token
|
||||
// chain and flag operands which copy the outgoing args into registers.
|
||||
// The InFlag in necessary since all emitted instructions must be
|
||||
|
Loading…
Reference in New Issue
Block a user