From 0e41094d499efa585c11904cf088016140c462d1 Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Wed, 24 Jan 2007 19:15:24 +0000 Subject: [PATCH] Call frames for intel. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33490 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86RegisterInfo.cpp | 51 ++++++++++++++++++++++++++++++ lib/Target/X86/X86RegisterInfo.h | 1 + 2 files changed, 52 insertions(+) diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index adcc5fdeecf..c47d1c79822 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/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(); 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 &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 &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 &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/lib/Target/X86/X86RegisterInfo.h b/lib/Target/X86/X86RegisterInfo.h index 904c1fb8ac0..0066fb6e1ec 100644 --- a/lib/Target/X86/X86RegisterInfo.h +++ b/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 &Moves) const; }; // getX86SubSuperRegister - X86 utility function. It returns the sub or super -- 2.34.1