summaryrefslogtreecommitdiff
path: root/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2007-01-24 18:45:13 +0000
committerJim Laskey <jlaskey@mac.com>2007-01-24 18:45:13 +0000
commit5e73d5bd2e98afda12fa69a7ea83050c69be0d34 (patch)
tree0b1ab52ac594e70591f43d7d8847aee36dfb27bf /lib/Target/PowerPC/PPCRegisterInfo.cpp
parent7cce0ac42b6bb2fbbbadb542a0b589bd6db7de2e (diff)
downloadllvm-5e73d5bd2e98afda12fa69a7ea83050c69be0d34.tar.gz
llvm-5e73d5bd2e98afda12fa69a7ea83050c69be0d34.tar.bz2
llvm-5e73d5bd2e98afda12fa69a7ea83050c69be0d34.tar.xz
Repair debug frames as a prelude to eh_frames. Switched to using MachineMoves
by value so that clean up is less confusing (these vectors tend to be small.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33488 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCRegisterInfo.cpp')
-rw-r--r--lib/Target/PowerPC/PPCRegisterInfo.cpp58
1 files changed, 43 insertions, 15 deletions
diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp
index e4bea7c4a4..465960afda 100644
--- a/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -762,6 +762,10 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
MachineFrameInfo *MFI = MF.getFrameInfo();
MachineDebugInfo *DebugInfo = MFI->getMachineDebugInfo();
+ // Prepare for debug frame info.
+ bool hasInfo = DebugInfo && DebugInfo->hasInfo();
+ unsigned FrameLabelId = 0;
+
// Scan the prolog, looking for an UPDATE_VRSAVE instruction. If we find it,
// process it.
for (unsigned i = 0; MBBI != MBB.end(); ++i, ++MBBI) {
@@ -821,6 +825,12 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
unsigned MaxAlign = MFI->getMaxAlignment();
+ if (hasInfo) {
+ // Mark effective beginning of when frame pointer becomes valid.
+ FrameLabelId = DebugInfo->NextLabelID();
+ BuildMI(MBB, MBBI, TII.get(PPC::DWARF_LABEL)).addImm(FrameLabelId);
+ }
+
// Adjust stack pointer: r1 += NegFrameSize.
// If there is a preferred stack alignment, align R1 now
if (!IsPPC64) {
@@ -866,26 +876,44 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
}
}
- if (DebugInfo && DebugInfo->hasInfo()) {
- std::vector<MachineMove *> &Moves = DebugInfo->getFrameMoves();
- unsigned LabelID = DebugInfo->NextLabelID();
+ if (hasInfo) {
+ std::vector<MachineMove> &Moves = DebugInfo->getFrameMoves();
- // Mark effective beginning of when frame pointer becomes valid.
- BuildMI(MBB, MBBI, TII.get(PPC::DWARF_LABEL)).addImm(LabelID);
+ if (NegFrameSize) {
+ // Show update of SP.
+ MachineLocation SPDst(MachineLocation::VirtualFP);
+ MachineLocation SPSrc(MachineLocation::VirtualFP, NegFrameSize);
+ Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
+ } else {
+ MachineLocation SP(IsPPC64 ? PPC::X31 : PPC::R31);
+ Moves.push_back(MachineMove(FrameLabelId, SP, SP));
+ }
- // Show update of SP.
- MachineLocation SPDst(MachineLocation::VirtualFP);
- MachineLocation SPSrc(MachineLocation::VirtualFP, NegFrameSize);
- Moves.push_back(new MachineMove(LabelID, SPDst, SPSrc));
+ if (HasFP) {
+ MachineLocation FPDst(MachineLocation::VirtualFP, FPOffset);
+ MachineLocation FPSrc(IsPPC64 ? PPC::X31 : PPC::R31);
+ Moves.push_back(MachineMove(FrameLabelId, FPDst, FPSrc));
+ }
// Add callee saved registers to move list.
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
- MachineLocation CSDst(MachineLocation::VirtualFP,
- MFI->getObjectOffset(CSI[I].getFrameIdx()));
- MachineLocation CSSrc(CSI[I].getReg());
- Moves.push_back(new MachineMove(LabelID, CSDst, CSSrc));
+ int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx());
+ unsigned Reg = CSI[I].getReg();
+ if (Reg == PPC::LR || Reg == PPC::LR8) continue;
+ 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(PPC::DWARF_LABEL)).addImm(ReadyLabelId);
+
+ MachineLocation FPDst(HasFP ? (IsPPC64 ? PPC::X31 : PPC::R31) :
+ (IsPPC64 ? PPC::X1 : PPC::R1));
+ MachineLocation FPSrc(MachineLocation::VirtualFP);
+ Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc));
}
// If there is a frame pointer, copy R1 into R31
@@ -983,12 +1011,12 @@ unsigned PPCRegisterInfo::getFrameRegister(MachineFunction &MF) const {
return hasFP(MF) ? PPC::X31 : PPC::X1;
}
-void PPCRegisterInfo::getInitialFrameState(std::vector<MachineMove *> &Moves)
+void PPCRegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
const {
// Initial state of the frame pointer is R1.
MachineLocation Dst(MachineLocation::VirtualFP);
MachineLocation Src(PPC::R1, 0);
- Moves.push_back(new MachineMove(0, Dst, Src));
+ Moves.push_back(MachineMove(0, Dst, Src));
}
#include "PPCGenRegisterInfo.inc"