Repair debug frames as a prelude to eh_frames. Switched to using MachineMoves
authorJim Laskey <jlaskey@mac.com>
Wed, 24 Jan 2007 18:45:13 +0000 (18:45 +0000)
committerJim Laskey <jlaskey@mac.com>
Wed, 24 Jan 2007 18:45:13 +0000 (18:45 +0000)
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

include/llvm/CodeGen/MachineDebugInfo.h
include/llvm/CodeGen/MachineLocation.h
include/llvm/Target/MRegisterInfo.h
lib/CodeGen/DwarfWriter.cpp
lib/CodeGen/MachineDebugInfo.cpp
lib/Target/MRegisterInfo.cpp
lib/Target/PowerPC/PPCRegisterInfo.cpp
lib/Target/PowerPC/PPCRegisterInfo.h

index aa968f49a80f1e711e9e1d7569f6b6ae2d3ca39e..1676f6b85b3ffb655efa2a0e0899f7793c6ac19a 100644 (file)
@@ -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<MachineMove *> FrameMoves;
+  std::vector<MachineMove> 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<MachineMove *> &getFrameMoves() { return FrameMoves; }
+  std::vector<MachineMove> &getFrameMoves() { return FrameMoves; }
 
 }; // End class MachineDebugInfo
 
index ab6a82b14fc97e8b810de6207599ed496cd839e9..023962dd6af1801be914fe36e005fce909d81497 100644 (file)
@@ -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)
index 29fd6b19f00bb2e5380a479bfb0f5821f669403b..e0f0cd428ca7e99a3d07448600ea1d4f19525218 100644 (file)
@@ -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<MachineMove *> &Moves) const;
+  virtual void getInitialFrameState(std::vector<MachineMove> &Moves) const;
 };
 
 // This is useful when building DenseMaps keyed on virtual registers
index bdf91fda0663eaa936b4d3410dd6f5ca10c9e599..5d9720ba2983d3f519e2cebe95364570c69e9a3b 100644 (file)
@@ -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<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) {
@@ -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<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);
@@ -2467,7 +2480,7 @@ private:
                    "func_begin", SubprogramCount);
     EOL("FDE address range");
     
-    std::vector<MachineMove *> &Moves = DebugInfo->getFrameMoves();
+    std::vector<MachineMove> &Moves = DebugInfo->getFrameMoves();
     
     EmitFrameMoves("func_begin", SubprogramCount, Moves);
     
index 0a6d3acb9cb4dd1b60eba614ba407868129bb70c..2ad1ba0ada99acd9fa8deb27a1b3cd10c202ebac 100644 (file)
@@ -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();
 }
 
index 515ff9af7376049cfd3afd01c38f5016a7999ab9..01295e802a3fe84395aa401f0eca30f58213a071 100644 (file)
@@ -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<MachineMove *> &Moves) const {
+MRegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves) const {
   // Default is to do nothing.
 }
 
index e4bea7c4a40ad67ec42c8fb11a46318906a17e56..465960afda41390148d0de34714bbba27886283d 100644 (file)
@@ -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"
index 5408c9f0c42cfab34e0c3c7a3a96e61668721a23..7d35c6a26ae35da20c1ff5e8252c928598eb19e2 100644 (file)
@@ -81,7 +81,7 @@ public:
   // 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