// FrameMoves - List of moves done by a function's prolog. Used to construct
// frame maps by debug consumers.
- std::vector<MachineMove *> FrameMoves;
+ std::vector<MachineMove> FrameMoves;
public:
MachineDebugInfo();
/// getFrameMoves - Returns a reference to a list of moves done in the current
/// function's prologue. Used to construct frame maps for debug comsumers.
- std::vector<MachineMove *> &getFrameMoves() { return FrameMoves; }
+ std::vector<MachineMove> &getFrameMoves() { return FrameMoves; }
}; // End class MachineDebugInfo
unsigned LabelID; // Label ID number for post-instruction
// address when result of move takes
// effect.
- const MachineLocation Destination; // Move to location.
- const MachineLocation Source; // Move from location.
+ MachineLocation Destination; // Move to location.
+ MachineLocation Source; // Move from location.
public:
+ MachineMove()
+ : LabelID(0)
+ , Destination()
+ , Source()
+ {}
+
MachineMove(unsigned ID, MachineLocation &D, MachineLocation &S)
: LabelID(ID)
, Destination(D)
/// getInitialFrameState - Returns a list of machine moves that are assumed
/// on entry to all functions. Note that LabelID is ignored (assumed to be
/// the beginning of the function.)
- virtual void getInitialFrameState(std::vector<MachineMove *> &Moves) const;
+ virtual void getInitialFrameState(std::vector<MachineMove> &Moves) const;
};
// This is useful when building DenseMaps keyed on virtual registers
/// EmitFrameMoves - Emit frame instructions to describe the layout of the
/// frame.
void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
- std::vector<MachineMove *> &Moves) {
+ std::vector<MachineMove> &Moves) {
+ int stackGrowth =
+ Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
+ TargetFrameInfo::StackGrowsUp ?
+ TAI->getAddressSize() : -TAI->getAddressSize();
+
for (unsigned i = 0, N = Moves.size(); i < N; ++i) {
- MachineMove *Move = Moves[i];
- unsigned LabelID = DebugInfo->MappedLabel(Move->getLabelID());
+ MachineMove &Move = Moves[i];
+ unsigned LabelID = Move.getLabelID();
- // Throw out move if the label is invalid.
- if (!LabelID) continue;
+ if (LabelID) {
+ LabelID = DebugInfo->MappedLabel(LabelID);
- const MachineLocation &Dst = Move->getDestination();
- const MachineLocation &Src = Move->getSource();
+ // Throw out move if the label is invalid.
+ if (!LabelID) continue;
+ }
+
+ const MachineLocation &Dst = Move.getDestination();
+ const MachineLocation &Src = Move.getSource();
// Advance row if new location.
if (BaseLabel && LabelID && BaseLabelID != LabelID) {
BaseLabel = "loc";
}
- int stackGrowth =
- Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
- TargetFrameInfo::StackGrowsUp ?
- TAI->getAddressSize() : -TAI->getAddressSize();
-
// If advancing cfa.
if (Dst.isRegister() && Dst.getRegister() == MachineLocation::VirtualFP) {
if (!Src.isRegister()) {
} else {
assert(0 && "Machine move no supported yet.");
}
+ } else if (Src.isRegister() &&
+ Src.getRegister() == MachineLocation::VirtualFP) {
+ if (Dst.isRegister()) {
+ EmitInt8(DW_CFA_def_cfa_register);
+ EOL("DW_CFA_def_cfa_register");
+ EmitULEB128Bytes(RI->getDwarfRegNum(Dst.getRegister()));
+ EOL("Register");
+ } else {
+ assert(0 && "Machine move no supported yet.");
+ }
} else {
unsigned Reg = RI->getDwarfRegNum(Src.getRegister());
int Offset = Dst.getOffset() / stackGrowth;
EmitSLEB128Bytes(stackGrowth); EOL("CIE Data Alignment Factor");
EmitInt8(RI->getDwarfRegNum(RI->getRARegister())); EOL("CIE RA Column");
- std::vector<MachineMove *> Moves;
+ std::vector<MachineMove> Moves;
RI->getInitialFrameState(Moves);
EmitFrameMoves(NULL, 0, Moves);
- for (unsigned i = 0, N = Moves.size(); i < N; ++i) delete Moves[i];
Asm->EmitAlignment(2);
EmitLabel("frame_common_end", 0);
"func_begin", SubprogramCount);
EOL("FDE address range");
- std::vector<MachineMove *> &Moves = DebugInfo->getFrameMoves();
+ std::vector<MachineMove> &Moves = DebugInfo->getFrameMoves();
EmitFrameMoves("func_begin", SubprogramCount, Moves);
}
// Clean up frame info.
- for (unsigned i = 0, N = FrameMoves.size(); i < N; ++i) delete FrameMoves[i];
FrameMoves.clear();
}
/// getInitialFrameState - Returns a list of machine moves that are assumed
/// on entry to a function.
void
-MRegisterInfo::getInitialFrameState(std::vector<MachineMove *> &Moves) const {
+MRegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves) const {
// Default is to do nothing.
}
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) {
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) {
}
}
- 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
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"
// Debug information queries.
unsigned getRARegister() const;
unsigned getFrameRegister(MachineFunction &MF) const;
- void getInitialFrameState(std::vector<MachineMove *> &Moves) const;
+ void getInitialFrameState(std::vector<MachineMove> &Moves) const;
};
} // end namespace llvm