diff options
author | Jim Grosbach <grosbach@apple.com> | 2009-11-21 21:40:08 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2009-11-21 21:40:08 +0000 |
commit | 43fd8222494b7391154a0e77f8b400ce5d18e076 (patch) | |
tree | 6ea468a615ef53af26b63cd0dbf8bca9c6fdb099 /llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp | |
parent | 252ba5fb6f2888b990a9d3b4c18f42295436fbd9 (diff) | |
download | bcm5719-llvm-43fd8222494b7391154a0e77f8b400ce5d18e076.tar.gz bcm5719-llvm-43fd8222494b7391154a0e77f8b400ce5d18e076.zip |
Darwin requires a frame pointer for all non-leaf functions to support correct
backtraces.
llvm-svn: 89562
Diffstat (limited to 'llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp index 19762ee5cfb..df458689733 100644 --- a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp @@ -222,6 +222,7 @@ BitVector ARMBaseRegisterInfo::getReservedRegs(const MachineFunction &MF) const BitVector Reserved(getNumRegs()); Reserved.set(ARM::SP); Reserved.set(ARM::PC); + // FP is reserved on Darwin even if we're not using it in this function. if (STI.isTargetDarwin() || hasFP(MF)) Reserved.set(FramePtr); // Some targets reserve R9. @@ -239,6 +240,7 @@ bool ARMBaseRegisterInfo::isReservedReg(const MachineFunction &MF, return true; case ARM::R7: case ARM::R11: + // FP is reserved on Darwin even if we're not using it in this function. if (FramePtr == Reg && (STI.isTargetDarwin() || hasFP(MF))) return true; break; @@ -492,7 +494,8 @@ static unsigned calculateMaxStackAlignment(const MachineFrameInfo *FFI) { /// bool ARMBaseRegisterInfo::hasFP(const MachineFunction &MF) const { const MachineFrameInfo *MFI = MF.getFrameInfo(); - return (NoFramePointerElim || + return ((STI.isTargetDarwin() && MFI->hasCalls()) || + NoFramePointerElim || needsStackRealignment(MF) || MFI->hasVarSizedObjects() || MFI->isFrameAddressTaken()); |