diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-04-23 18:21:02 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-04-23 18:21:02 +0000 |
commit | 89a0a017fbb2ab6d0afa0ec3a9c2516f404f7cb4 (patch) | |
tree | 15e151b36725ea7a7568af98171040554291e32a /llvm/lib | |
parent | ba5129073ca595871b34bfeb289dcedf8016db8a (diff) | |
download | bcm5719-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.cpp | 37 |
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) + |