From ce50a165c784d71abf1b2f981be18f867787d972 Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Tue, 29 Aug 2006 16:24:26 +0000 Subject: [PATCH] Handle callee saved registers in dwarf frame info (lead up to exception handling.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29954 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/DwarfWriter.cpp | 44 +++++++++++++++++++++++++++------- lib/Target/PowerPC/PPCRegisterInfo.cpp | 19 ++++++++++----- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index 54942b8098e..5b5be545aad 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -35,7 +35,7 @@ using namespace llvm::dwarf; static cl::opt 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"); + } } } } diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp index d0a21e661a0..bf50e3579ee 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.cpp +++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp @@ -668,15 +668,22 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const { std::vector &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 &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) -- 2.11.0