From: Jim Laskey Date: Wed, 24 Jan 2007 18:45:13 +0000 (+0000) Subject: Repair debug frames as a prelude to eh_frames. Switched to using MachineMoves X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5e73d5bd2e98afda12fa69a7ea83050c69be0d34;p=oota-llvm.git 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 --- diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h index aa968f49a80..1676f6b85b3 100644 --- a/include/llvm/CodeGen/MachineDebugInfo.h +++ b/include/llvm/CodeGen/MachineDebugInfo.h @@ -985,7 +985,7 @@ private: // FrameMoves - List of moves done by a function's prolog. Used to construct // frame maps by debug consumers. - std::vector FrameMoves; + std::vector FrameMoves; public: MachineDebugInfo(); @@ -1145,7 +1145,7 @@ public: /// 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 &getFrameMoves() { return FrameMoves; } + std::vector &getFrameMoves() { return FrameMoves; } }; // End class MachineDebugInfo diff --git a/include/llvm/CodeGen/MachineLocation.h b/include/llvm/CodeGen/MachineLocation.h index ab6a82b14fc..023962dd6af 100644 --- a/include/llvm/CodeGen/MachineLocation.h +++ b/include/llvm/CodeGen/MachineLocation.h @@ -79,10 +79,16 @@ private: 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) diff --git a/include/llvm/Target/MRegisterInfo.h b/include/llvm/Target/MRegisterInfo.h index 29fd6b19f00..e0f0cd428ca 100644 --- a/include/llvm/Target/MRegisterInfo.h +++ b/include/llvm/Target/MRegisterInfo.h @@ -456,7 +456,7 @@ public: /// 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 &Moves) const; + virtual void getInitialFrameState(std::vector &Moves) const; }; // This is useful when building DenseMaps keyed on virtual registers diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index bdf91fda066..5d9720ba298 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -2112,16 +2112,25 @@ private: /// EmitFrameMoves - Emit frame instructions to describe the layout of the /// frame. void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID, - std::vector &Moves) { + std::vector &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) { @@ -2134,11 +2143,6 @@ private: 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()) { @@ -2159,6 +2163,16 @@ private: } 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; @@ -2433,10 +2447,9 @@ private: EmitSLEB128Bytes(stackGrowth); EOL("CIE Data Alignment Factor"); EmitInt8(RI->getDwarfRegNum(RI->getRARegister())); EOL("CIE RA Column"); - std::vector Moves; + std::vector 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); @@ -2467,7 +2480,7 @@ private: "func_begin", SubprogramCount); EOL("FDE address range"); - std::vector &Moves = DebugInfo->getFrameMoves(); + std::vector &Moves = DebugInfo->getFrameMoves(); EmitFrameMoves("func_begin", SubprogramCount, Moves); diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index 0a6d3acb9cb..2ad1ba0ada9 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -1505,7 +1505,6 @@ void MachineDebugInfo::EndFunction() { } // Clean up frame info. - for (unsigned i = 0, N = FrameMoves.size(); i < N; ++i) delete FrameMoves[i]; FrameMoves.clear(); } diff --git a/lib/Target/MRegisterInfo.cpp b/lib/Target/MRegisterInfo.cpp index 515ff9af737..01295e802a3 100644 --- a/lib/Target/MRegisterInfo.cpp +++ b/lib/Target/MRegisterInfo.cpp @@ -64,7 +64,7 @@ void MRegisterInfo::getLocation(MachineFunction &MF, unsigned Index, /// getInitialFrameState - Returns a list of machine moves that are assumed /// on entry to a function. void -MRegisterInfo::getInitialFrameState(std::vector &Moves) const { +MRegisterInfo::getInitialFrameState(std::vector &Moves) const { // Default is to do nothing. } diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp index e4bea7c4a40..465960afda4 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 &Moves = DebugInfo->getFrameMoves(); - unsigned LabelID = DebugInfo->NextLabelID(); + if (hasInfo) { + std::vector &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 &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 &Moves) +void PPCRegisterInfo::getInitialFrameState(std::vector &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" diff --git a/lib/Target/PowerPC/PPCRegisterInfo.h b/lib/Target/PowerPC/PPCRegisterInfo.h index 5408c9f0c42..7d35c6a26ae 100644 --- a/lib/Target/PowerPC/PPCRegisterInfo.h +++ b/lib/Target/PowerPC/PPCRegisterInfo.h @@ -81,7 +81,7 @@ public: // Debug information queries. unsigned getRARegister() const; unsigned getFrameRegister(MachineFunction &MF) const; - void getInitialFrameState(std::vector &Moves) const; + void getInitialFrameState(std::vector &Moves) const; }; } // end namespace llvm