mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-04 19:26:30 +00:00
Handle callee saved registers in dwarf frame info (lead up to exception
handling.) llvm-svn: 29954
This commit is contained in:
parent
27420577d7
commit
d44e9493e6
@ -35,7 +35,7 @@ using namespace llvm::dwarf;
|
||||
|
||||
static cl::opt<bool>
|
||||
DwarfVerbose("dwarf-verbose", cl::Hidden,
|
||||
cl::desc("Add comments to Dwarf directives."));
|
||||
cl::desc("Add comments to Dwarf directives."));
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -1946,7 +1946,7 @@ void DwarfWriter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
|
||||
|
||||
// Advance row if new location.
|
||||
if (BaseLabel && LabelID && BaseLabelID != LabelID) {
|
||||
EmitULEB128Bytes(DW_CFA_advance_loc4);
|
||||
EmitInt8(DW_CFA_advance_loc4);
|
||||
EOL("DW_CFA_advance_loc4");
|
||||
EmitDifference("loc", LabelID, BaseLabel, BaseLabelID);
|
||||
EOL("");
|
||||
@ -1955,30 +1955,56 @@ void DwarfWriter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
|
||||
BaseLabel = "loc";
|
||||
}
|
||||
|
||||
int stackGrowth =
|
||||
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
|
||||
TargetFrameInfo::StackGrowsUp ?
|
||||
AddressSize : -AddressSize;
|
||||
|
||||
// If advancing cfa.
|
||||
if (Dst.isRegister() && Dst.getRegister() == MachineLocation::VirtualFP) {
|
||||
if (!Src.isRegister()) {
|
||||
if (Src.getRegister() == MachineLocation::VirtualFP) {
|
||||
EmitULEB128Bytes(DW_CFA_def_cfa_offset);
|
||||
EmitInt8(DW_CFA_def_cfa_offset);
|
||||
EOL("DW_CFA_def_cfa_offset");
|
||||
} else {
|
||||
EmitULEB128Bytes(DW_CFA_def_cfa);
|
||||
EmitInt8(DW_CFA_def_cfa);
|
||||
EOL("DW_CFA_def_cfa");
|
||||
|
||||
EmitULEB128Bytes(RI->getDwarfRegNum(Src.getRegister()));
|
||||
EOL("Register");
|
||||
}
|
||||
|
||||
int stackGrowth =
|
||||
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
|
||||
TargetFrameInfo::StackGrowsUp ?
|
||||
AddressSize : -AddressSize;
|
||||
int Offset = Src.getOffset() / stackGrowth;
|
||||
|
||||
EmitULEB128Bytes(Src.getOffset() / stackGrowth);
|
||||
EmitULEB128Bytes(Offset);
|
||||
EOL("Offset");
|
||||
} else {
|
||||
assert(0 && "Machine move no supported yet.");
|
||||
}
|
||||
} else {
|
||||
unsigned Reg = RI->getDwarfRegNum(Src.getRegister());
|
||||
int Offset = Dst.getOffset() / stackGrowth;
|
||||
|
||||
if (Offset < 0) {
|
||||
EmitInt8(DW_CFA_offset_extended_sf);
|
||||
EOL("DW_CFA_offset_extended_sf");
|
||||
EmitULEB128Bytes(Reg);
|
||||
EOL("Reg");
|
||||
EmitSLEB128Bytes(Offset);
|
||||
EOL("Offset");
|
||||
} else if (Reg < 64) {
|
||||
EmitInt8(DW_CFA_offset + Reg);
|
||||
EOL("DW_CFA_offset + Reg");
|
||||
EmitULEB128Bytes(Offset);
|
||||
EOL("Offset");
|
||||
} else {
|
||||
EmitInt8(DW_CFA_offset_extended);
|
||||
EOL("DW_CFA_offset_extended");
|
||||
EmitULEB128Bytes(Reg);
|
||||
EOL("Reg");
|
||||
EmitULEB128Bytes(Offset);
|
||||
EOL("Offset");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -668,15 +668,22 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
|
||||
std::vector<MachineMove *> &Moves = DebugInfo->getFrameMoves();
|
||||
unsigned LabelID = DebugInfo->NextLabelID();
|
||||
|
||||
// Show update of SP.
|
||||
MachineLocation Dst(MachineLocation::VirtualFP);
|
||||
MachineLocation Src(MachineLocation::VirtualFP, NegNumbytes);
|
||||
Moves.push_back(new MachineMove(LabelID, Dst, Src));
|
||||
|
||||
// Mark effective beginning of when frame pointer becomes valid.
|
||||
BuildMI(MBB, MBBI, PPC::DWARF_LABEL, 1).addImm(LabelID);
|
||||
|
||||
|
||||
// Show update of SP.
|
||||
MachineLocation SPDst(MachineLocation::VirtualFP);
|
||||
MachineLocation SPSrc(MachineLocation::VirtualFP, NegNumbytes);
|
||||
Moves.push_back(new MachineMove(LabelID, SPDst, SPSrc));
|
||||
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
|
||||
// If there is a frame pointer, copy R1 (SP) into R31 (FP)
|
||||
|
Loading…
x
Reference in New Issue
Block a user