summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2009-11-21 21:40:08 +0000
committerJim Grosbach <grosbach@apple.com>2009-11-21 21:40:08 +0000
commit43fd8222494b7391154a0e77f8b400ce5d18e076 (patch)
tree6ea468a615ef53af26b63cd0dbf8bca9c6fdb099 /llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp
parent252ba5fb6f2888b990a9d3b4c18f42295436fbd9 (diff)
downloadbcm5719-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.cpp5
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());
OpenPOWER on IntegriCloud