diff options
| author | Reid Kleckner <reid@kleckner.net> | 2015-03-24 23:46:01 +0000 |
|---|---|---|
| committer | Reid Kleckner <reid@kleckner.net> | 2015-03-24 23:46:01 +0000 |
| commit | 11470c48d05b3b9073080cc5702df66f184a3e6c (patch) | |
| tree | af4f470b306764352a138f7e63242d31d3a3fc08 /llvm/lib/Target | |
| parent | 037f6b9c0f52ed46882ec8800a6c3aeff3a84d35 (diff) | |
| download | bcm5719-llvm-11470c48d05b3b9073080cc5702df66f184a3e6c.tar.gz bcm5719-llvm-11470c48d05b3b9073080cc5702df66f184a3e6c.zip | |
X86: Fix frameescape when not using an FP
We can't use TargetFrameLowering::getFrameIndexOffset directly, because
Win64 really wants the offset from the stack pointer at the end of the
prologue. Instead, use X86FrameLowering::getFrameIndexOffsetFromSP(),
which is a pretty close approximiation of that. It fails to handle cases
with interestingly large stack alignments, which is pretty uncommon on
Win64 and is TODO.
llvm-svn: 233137
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index 6d031830b42..06545bc2096 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -14,6 +14,7 @@ //===----------------------------------------------------------------------===// #include "X86RegisterInfo.h" +#include "X86FrameLowering.h" #include "X86InstrBuilder.h" #include "X86MachineFunctionInfo.h" #include "X86Subtarget.h" @@ -507,15 +508,14 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, // offset is from the SP at the end of the prologue, not the FP location. This // matches the behavior of llvm.frameaddress. if (Opc == TargetOpcode::FRAME_ALLOC) { - assert(TFI->hasFP(MF) && "frame alloc requires FP"); MachineOperand &FI = MI.getOperand(FIOperandNum); - const MachineFrameInfo *MFI = MF.getFrameInfo(); - int Offset = MFI->getObjectOffset(FrameIndex) - TFI->getOffsetOfLocalArea(); bool IsWinEH = MF.getTarget().getMCAsmInfo()->usesWindowsCFI(); + int Offset; if (IsWinEH) - Offset += MFI->getStackSize(); + Offset = static_cast<const X86FrameLowering *>(TFI) + ->getFrameIndexOffsetFromSP(MF, FrameIndex); else - Offset += SlotSize; + Offset = TFI->getFrameIndexOffset(MF, FrameIndex); FI.ChangeToImmediate(Offset); return; } |

