diff options
author | Nicolas Geoffray <nicolas.geoffray@lip6.fr> | 2007-03-21 16:44:14 +0000 |
---|---|---|
committer | Nicolas Geoffray <nicolas.geoffray@lip6.fr> | 2007-03-21 16:44:14 +0000 |
commit | 82d4264c1fe71480bcaa63235e385a01e38dbe8c (patch) | |
tree | 7769ff10854980058b1240da39aa150335a81c57 | |
parent | 6dbe233959eed02971f3075e0c48234238ff6fa3 (diff) |
Protect R31's frame offset from being used by callee-saved registers, when R31
is the frame pointer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35233 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/PowerPC/PPCRegisterInfo.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp index 0b9602be36..a2ee919946 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -891,6 +891,26 @@ void PPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF, unsigned LR = getRARegister(); FI->setUsesLR(MF.isPhysRegUsed(LR)); MF.changePhyRegUsed(LR, false); + + + // Save R31 if necessary + int FPSI = FI->getFramePointerSaveIndex(); + bool IsPPC64 = Subtarget.isPPC64(); + bool IsELF_ABI = Subtarget.isELF_ABI(); + const MachineFrameInfo *MFI = MF.getFrameInfo(); + + // If the frame pointer save index hasn't been defined yet. + if (!FPSI && (NoFramePointerElim || MFI->hasVarSizedObjects()) + && IsELF_ABI) { + // Find out what the fix offset of the frame pointer save area. + int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, + !IsELF_ABI); + // Allocate the frame index for frame pointer save area. + FPSI = MF.getFrameInfo()->CreateFixedObject(IsPPC64? 8 : 4, FPOffset); + // Save the result. + FI->setFramePointerSaveIndex(FPSI); + } + } void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const { |