Darwin ABI requires FP to point to stack slot of prev FP.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 31 Jan 2007 22:25:33 +0000 (22:25 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 31 Jan 2007 22:25:33 +0000 (22:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33724 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMRegisterInfo.cpp

index 75cc48bf80189034a7c96706d5f00f4a7d4f7e70..4d48a7a078049a206d9b208d2eafc9a67f6afc2b 100644 (file)
@@ -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);