diff options
| author | Jim Laskey <jlaskey@mac.com> | 2007-01-24 19:15:24 +0000 |
|---|---|---|
| committer | Jim Laskey <jlaskey@mac.com> | 2007-01-24 19:15:24 +0000 |
| commit | 7ad04830b1b497f7d3238131f765830e8f89a0ca (patch) | |
| tree | 32098ce40b53e39afb32987018bb277162d7f161 /llvm/lib | |
| parent | 5f24d103810c5f67a07ab8fa896cbae9be790223 (diff) | |
| download | bcm5719-llvm-7ad04830b1b497f7d3238131f765830e8f89a0ca.tar.gz bcm5719-llvm-7ad04830b1b497f7d3238131f765830e8f89a0ca.zip | |
Call frames for intel.
llvm-svn: 33490
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 51 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.h | 1 |
2 files changed, 52 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index adcc5fdeecf..c47d1c79822 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -995,6 +995,11 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const { const Function* Fn = MF.getFunction(); const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>(); MachineInstr *MI; + MachineDebugInfo *DebugInfo = MFI->getMachineDebugInfo(); + + // Prepare for debug frame info. + bool hasInfo = DebugInfo && DebugInfo->hasInfo(); + unsigned FrameLabelId = 0; // Get the number of bytes to allocate from the FrameInfo unsigned NumBytes = MFI->getStackSize(); @@ -1018,6 +1023,12 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const { } } + if (hasInfo) { + // Mark effective beginning of when frame pointer becomes valid. + FrameLabelId = DebugInfo->NextLabelID(); + BuildMI(MBB, MBBI, TII.get(X86::DWARF_LABEL)).addImm(FrameLabelId); + } + if (hasFP(MF)) { // Get the offset of the stack slot for the EBP register... which is // guaranteed to be the last slot by processFunctionBeforeFrameFinalized. @@ -1042,6 +1053,38 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const { MBB.insert(MBBI, MI); } + if (hasInfo) { + std::vector<MachineMove> &Moves = DebugInfo->getFrameMoves(); + + if (NumBytes) { + // Show update of SP. + MachineLocation SPDst(MachineLocation::VirtualFP); + MachineLocation SPSrc(MachineLocation::VirtualFP, -NumBytes); + Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc)); + } else { + MachineLocation SP(StackPtr); + Moves.push_back(MachineMove(FrameLabelId, SP, SP)); + } + + // Add callee saved registers to move list. + const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo(); + for (unsigned I = 0, E = CSI.size(); I != E; ++I) { + int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx()); + unsigned Reg = CSI[I].getReg(); + MachineLocation CSDst(MachineLocation::VirtualFP, Offset); + MachineLocation CSSrc(Reg); + Moves.push_back(MachineMove(FrameLabelId, CSDst, CSSrc)); + } + + // Mark effective beginning of when frame pointer is ready. + unsigned ReadyLabelId = DebugInfo->NextLabelID(); + BuildMI(MBB, MBBI, TII.get(X86::DWARF_LABEL)).addImm(ReadyLabelId); + + MachineLocation FPDst(hasFP(MF) ? FramePtr : StackPtr); + MachineLocation FPSrc(MachineLocation::VirtualFP); + Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc)); + } + // If it's main() on Cygwin\Mingw32 we should align stack as well if (Fn->hasExternalLinkage() && Fn->getName() == "main" && Subtarget->isTargetCygMing()) { @@ -1127,6 +1170,14 @@ unsigned X86RegisterInfo::getFrameRegister(MachineFunction &MF) const { return hasFP(MF) ? FramePtr : StackPtr; } +void X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves) + const { + // Initial state of the frame pointer is esp. + MachineLocation Dst(MachineLocation::VirtualFP); + MachineLocation Src(StackPtr, 0); + Moves.push_back(MachineMove(0, Dst, Src)); +} + namespace llvm { unsigned getX86SubSuperRegister(unsigned Reg, MVT::ValueType VT, bool High) { switch (VT) { diff --git a/llvm/lib/Target/X86/X86RegisterInfo.h b/llvm/lib/Target/X86/X86RegisterInfo.h index 904c1fb8ac0..0066fb6e1ec 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.h +++ b/llvm/lib/Target/X86/X86RegisterInfo.h @@ -94,6 +94,7 @@ public: // Debug information queries. unsigned getRARegister() const; unsigned getFrameRegister(MachineFunction &MF) const; + void getInitialFrameState(std::vector<MachineMove> &Moves) const; }; // getX86SubSuperRegister - X86 utility function. It returns the sub or super |

