diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2007-01-31 22:25:33 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2007-01-31 22:25:33 +0000 |
| commit | 3548006a29ea9e5b63b53c9923fff96326fdc302 (patch) | |
| tree | f694e3d2a59c02214fd73795f377175f169e2d89 /lib/Target/ARM/ARMRegisterInfo.cpp | |
| parent | 11a065e599ff593acbdffebba1981c88ee0a9d4e (diff) | |
Darwin ABI requires FP to point to stack slot of prev FP.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33724 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMRegisterInfo.cpp')
| -rw-r--r-- | lib/Target/ARM/ARMRegisterInfo.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/Target/ARM/ARMRegisterInfo.cpp b/lib/Target/ARM/ARMRegisterInfo.cpp index 75cc48bf80..4d48a7a078 100644 --- a/lib/Target/ARM/ARMRegisterInfo.cpp +++ b/lib/Target/ARM/ARMRegisterInfo.cpp @@ -900,6 +900,13 @@ processFunctionBeforeCalleeSavedScan(MachineFunction &MF) const { ForceLRSpill = false; } + // Darwin ABI requires FP to point to the stack slot that contains the + // previous FP. + if (STI.isTargetDarwin()) { + MF.changePhyRegUsed(FramePtr, true); + NumGPRSpills++; + } + // If stack and double are 8-byte aligned and we are spilling an odd number // of GPRs. Spill one extra callee save GPR so we won't have to pad between // the integer and double callee save areas. @@ -1029,8 +1036,9 @@ void ARMRegisterInfo::emitPrologue(MachineFunction &MF) const { } else if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH) ++MBBI; - // Point FP to the stack slot that contains the previous FP. - if (hasFP(MF)) + // Darwin ABI requires FP to point to the stack slot that contains the + // previous FP. + if (STI.isTargetDarwin() || hasFP(MF)) BuildMI(MBB, MBBI, TII.get(isThumb ? ARM::tADDrSPi : ARM::ADDri), FramePtr) .addFrameIndex(FramePtrSpillFI).addImm(0); @@ -1116,7 +1124,9 @@ void ARMRegisterInfo::emitEpilogue(MachineFunction &MF, if (isThumb) emitSPUpdate(MBB, MBBI, NumBytes, isThumb, TII); else { - if (hasFP(MF)){ + // Darwin ABI requires FP to point to the stack slot that contains the + // previous FP. + if (STI.isTargetDarwin() || hasFP(MF)) { NumBytes = AFI->getFramePtrSpillOffset() - NumBytes; // Reset SP based on frame pointer only if the stack frame extends beyond // frame pointer stack slot. @@ -1131,6 +1141,7 @@ void ARMRegisterInfo::emitEpilogue(MachineFunction &MF, } else if (NumBytes) { emitSPUpdate(MBB, MBBI, NumBytes, false, TII); } + // Move SP to start of integer callee save spill area 2. movePastCSLoadStoreOps(MBB, MBBI, ARM::FLDD, 3, STI); emitSPUpdate(MBB, MBBI, AFI->getDPRCalleeSavedAreaSize(), false, TII); |
