summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2008-04-23 18:21:02 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2008-04-23 18:21:02 +0000
commit89a0a017fbb2ab6d0afa0ec3a9c2516f404f7cb4 (patch)
tree15e151b36725ea7a7568af98171040554291e32a /llvm/lib
parentba5129073ca595871b34bfeb289dcedf8016db8a (diff)
downloadbcm5719-llvm-89a0a017fbb2ab6d0afa0ec3a9c2516f404f7cb4.tar.gz
bcm5719-llvm-89a0a017fbb2ab6d0afa0ec3a9c2516f404f7cb4.zip
If stack realignment is used - incoming args will use EBP as base register and locals - ESP
llvm-svn: 50162
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86RegisterInfo.cpp37
1 files changed, 28 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp
index 2baf3601f01..17f4d2bbf58 100644
--- a/llvm/lib/Target/X86/X86RegisterInfo.cpp
+++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp
@@ -281,16 +281,28 @@ bool X86RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
int
X86RegisterInfo::getFrameIndexOffset(MachineFunction &MF, int FI) const {
int Offset = MF.getFrameInfo()->getObjectOffset(FI) + SlotSize;
- if (!hasFP(MF))
- return Offset + MF.getFrameInfo()->getStackSize();
- // Skip the saved EBP
- Offset += SlotSize;
+ if (needsStackRealignment(MF)) {
+ if (FI < 0)
+ // Skip the saved EBP
+ Offset += SlotSize;
+ else
+ return Offset + MF.getFrameInfo()->getStackSize();
+
+ // FIXME: Support tail calls
+ } else {
+ if (!hasFP(MF))
+ return Offset + MF.getFrameInfo()->getStackSize();
+
+ // Skip the saved EBP
+ Offset += SlotSize;
+
+ // Skip the RETADDR move area
+ X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
+ int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
+ if (TailCallReturnAddrDelta < 0) Offset -= TailCallReturnAddrDelta;
+ }
- // Skip the RETADDR move area
- X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
- int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
- if (TailCallReturnAddrDelta < 0) Offset -= TailCallReturnAddrDelta;
return Offset;
}
@@ -360,9 +372,16 @@ void X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
}
int FrameIndex = MI.getOperand(i).getIndex();
+
+ unsigned BasePtr;
+ if (needsStackRealignment(MF))
+ BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
+ else
+ BasePtr = (hasFP(MF) ? FramePtr : StackPtr);
+
// This must be part of a four operand memory reference. Replace the
// FrameIndex with base register with EBP. Add an offset to the offset.
- MI.getOperand(i).ChangeToRegister(hasFP(MF) ? FramePtr : StackPtr, false);
+ MI.getOperand(i).ChangeToRegister(BasePtr, false);
// Now add the frame object offset to the offset from EBP.
int64_t Offset = getFrameIndexOffset(MF, FrameIndex) +
OpenPOWER on IntegriCloud