[llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineDebugInfo.cpp PrologEpilogInserter.cpp

Jim Laskey jlaskey at apple.com
Fri Apr 7 09:35:04 PDT 2006



Changes in directory llvm/lib/CodeGen:

DwarfWriter.cpp updated: 1.53 -> 1.54
MachineDebugInfo.cpp updated: 1.36 -> 1.37
PrologEpilogInserter.cpp updated: 1.52 -> 1.53
---
Log message:

Foundation for call frame information.


---
Diffs of the changes:  (+153 -43)

 DwarfWriter.cpp          |  153 +++++++++++++++++++++++++++++++++++++----------
 MachineDebugInfo.cpp     |   37 +++++++----
 PrologEpilogInserter.cpp |    6 +
 3 files changed, 153 insertions(+), 43 deletions(-)


Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.53 llvm/lib/CodeGen/DwarfWriter.cpp:1.54
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.53	Tue Mar 28 08:58:32 2006
+++ llvm/lib/CodeGen/DwarfWriter.cpp	Fri Apr  7 11:34:45 2006
@@ -18,6 +18,7 @@
 #include "llvm/Type.h"
 #include "llvm/CodeGen/AsmPrinter.h"
 #include "llvm/CodeGen/MachineDebugInfo.h"
+#include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineLocation.h"
 #include "llvm/Support/Dwarf.h"
 #include "llvm/Support/CommandLine.h"
@@ -1073,8 +1074,6 @@
   if (Asm->Data64bitsDirective) {
     O << Asm->Data64bitsDirective << "0x" << std::hex << Value << std::dec;
   } else {
-    const TargetData &TD = Asm->TM.getTargetData();
-    
     if (TD.isBigEndian()) {
       EmitInt32(unsigned(Value >> 32)); O << "\n";
       EmitInt32(unsigned(Value));
@@ -1216,12 +1215,14 @@
 /// AddAddress - Add an address attribute to a die based on the location
 /// provided.
 void DwarfWriter::AddAddress(DIE *Die, unsigned Attribute,
-                             MachineLocation &Location) {
+                             const MachineLocation &Location) {
   DIEBlock *Block = new DIEBlock();
   if (Location.isRegister()) {
-    Block->AddUInt(DW_FORM_data1, DW_OP_reg0 + Location.getRegister());
+    Block->AddUInt(DW_FORM_data1,
+                   DW_OP_reg0 + RI->getDwarfRegNum(Location.getRegister()));
   } else {
-    Block->AddUInt(DW_FORM_data1, DW_OP_breg0 + Location.getRegister());
+    Block->AddUInt(DW_FORM_data1,
+                   DW_OP_breg0 + RI->getDwarfRegNum(Location.getRegister()));
     Block->AddUInt(DW_FORM_sdata, Location.getOffset());
   }
   Block->ComputeSize(*this);
@@ -1358,8 +1359,7 @@
           // Now normalize offset to the field.
           Offset -= FieldOffset;
           
-          // Maybe we need to work from the other.
-          const TargetData &TD = Asm->TM.getTargetData();
+          // Maybe we need to work from the other end.
           if (TD.isLittleEndian()) Offset = FieldSize - (Offset + Size);
           
           Member->AddUInt(DW_AT_byte_size, 0, FieldSize >> 3);
@@ -1515,8 +1515,11 @@
                                     
   DIE *SubprogramDie = new DIE(DW_TAG_subprogram);
   SubprogramDie->AddString     (DW_AT_name,      DW_FORM_string, Name);
-  SubprogramDie->AddDIEntry    (DW_AT_type,      DW_FORM_ref4,   Type);
-  SubprogramDie->AddUInt       (DW_AT_external,  DW_FORM_flag,   IsExternal);
+  if (Type) {
+    SubprogramDie->AddDIEntry    (DW_AT_type,      DW_FORM_ref4,   Type);
+  }
+  SubprogramDie->AddUInt       (DW_AT_external,    DW_FORM_flag,   IsExternal);
+  SubprogramDie->AddUInt       (DW_AT_prototyped,  DW_FORM_flag,   1);
   
   // Add source line info if available.
   AddSourceLine(SubprogramDie, UnitDesc, SPD->getLine());
@@ -1561,7 +1564,7 @@
   
   // Add variable address.
   MachineLocation Location;
-  Asm->TM.getRegisterInfo()->getLocation(*MF, DV->getFrameIndex(), Location);
+  RI->getLocation(*MF, DV->getFrameIndex(), Location);
   AddAddress(VariableDie, DW_AT_location, Location);
   
   return VariableDie;
@@ -1621,18 +1624,20 @@
   
   // Get the compile unit context.
   CompileUnitDesc *UnitDesc = static_cast<CompileUnitDesc *>(SPD->getContext());
-  CompileUnit *Unit = FindCompileUnit(UnitDesc);  
+  CompileUnit *Unit = FindCompileUnit(UnitDesc);
+  
+  // Generate the mangled name.
+  std::string MangledName = Asm->Mang->getValueName(MF->getFunction());
   
   // Get the subprogram die.
   DIE *SPDie = Unit->getDieMapSlotFor(SPD);
   assert(SPDie && "Missing subprogram descriptor");
   
   // Add the function bounds.
-  SPDie->AddLabel(DW_AT_low_pc, DW_FORM_addr,
-                  DWLabel("func_begin", SubprogramCount));
+  SPDie->AddObjectLabel(DW_AT_low_pc, DW_FORM_addr, MangledName);
   SPDie->AddLabel(DW_AT_high_pc, DW_FORM_addr,
                   DWLabel("func_end", SubprogramCount));
-  MachineLocation Location(Asm->TM.getRegisterInfo()->getFrameRegister(*MF));
+  MachineLocation Location(RI->getFrameRegister(*MF));
   AddAddress(SPDie, DW_AT_frame_base, Location);
                   
   ConstructScope(RootScope, SPDie, Unit);
@@ -1792,6 +1797,50 @@
   }
 }
 
+/// EmitFrameMoves - Emit frame instructions to describe the layout of the
+/// frame.
+void DwarfWriter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
+                                 std::vector<MachineMove *> &Moves) {
+  for (unsigned i = 0, N = Moves.size(); i < N; ++i) {
+    MachineMove *Move = Moves[i];
+    unsigned LabelID = Move->getLabelID();
+    const MachineLocation &Dst = Move->getDestination();
+    const MachineLocation &Src = Move->getSource();
+    
+    // Advance row if new location.
+    if (BaseLabel && LabelID && BaseLabelID != LabelID) {
+      EmitULEB128Bytes(DW_CFA_advance_loc4);
+      EOL("DW_CFA_advance_loc4");
+      EmitDifference("loc", LabelID, BaseLabel, BaseLabelID);
+      EOL("");
+      
+      BaseLabelID = LabelID;
+      BaseLabel = "loc";
+    }
+    
+    // If advancing cfa.
+    if (Dst.isRegister() && Dst.getRegister() == MachineLocation::VirtualFP) {
+      if (!Src.isRegister()) {
+        if (Src.getRegister() == MachineLocation::VirtualFP) {
+          EmitULEB128Bytes(DW_CFA_def_cfa_offset);
+          EOL("DW_CFA_def_cfa_offset");
+        } else {
+          EmitULEB128Bytes(DW_CFA_def_cfa);
+          EOL("DW_CFA_def_cfa");
+          
+          EmitULEB128Bytes(RI->getDwarfRegNum(Src.getRegister()));
+          EOL("Register");
+        }
+          
+        EmitULEB128Bytes(Src.getOffset() / RI->getStackDirection());
+        EOL("Offset");
+      } else {
+      }
+    } else {
+    }
+  }
+}
+
 /// EmitDebugInfo - Emit the debug info section.
 ///
 void DwarfWriter::EmitDebugInfo() const {
@@ -1999,10 +2048,10 @@
   O << "\n";
 }
   
-/// EmitDebugFrame - Emit visible names into a debug frame section.
+/// EmitInitialDebugFrame - Emit common frame info into a debug frame section.
 ///
-void DwarfWriter::EmitDebugFrame() {
-  // Start the dwarf pubnames section.
+void DwarfWriter::EmitInitialDebugFrame() {
+  // Start the dwarf frame section.
   Asm->SwitchSection(DwarfFrameSection, 0);
 
   EmitDifference("frame_common_end", 0,
@@ -2014,20 +2063,49 @@
   EmitInt8(DW_CIE_VERSION); EOL("CIE Version");
   EmitString("");  EOL("CIE Augmentation");
   EmitULEB128Bytes(1); EOL("CIE Code Alignment Factor");
-  // FIXME - needs to change based on stack direction.
-  EmitSLEB128Bytes(-sizeof(int32_t)); EOL("CIE Data Alignment Factor");
-  // FIXME - hard coded for PPC (LR).
-  EmitInt8(0x41); EOL("CIE RA Column Hardcoded (PPC LR)");
-  // FIXME - hard coded for PPC 0(SP).
-  EmitULEB128Bytes(DW_CFA_def_cfa); EOL("DW_CFA_def_cfa");
-  EmitULEB128Bytes(1); EOL("PPC Register SP");
-  EmitULEB128Bytes(0); EOL("PPC offset 0 as in 0(SP)");
+  EmitSLEB128Bytes(RI->getStackDirection()); EOL("CIE Data Alignment Factor");   
+  EmitInt8(RI->getDwarfRegNum(RI->getRARegister())); EOL("CIE RA Column");
+  
+  std::vector<MachineMove *> Moves;
+  RI->getInitialFrameState(Moves);
+  EmitFrameMoves(NULL, 0, Moves);
+  for (unsigned i = 0, N = Moves.size(); i < N; ++i) delete Moves[i];
+
   EmitAlign(2);
   EmitLabel("frame_common_end", 0);
   
   O << "\n";
 }
 
+/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
+/// section.
+void DwarfWriter::EmitFunctionDebugFrame() {
+  // Start the dwarf frame section.
+  Asm->SwitchSection(DwarfFrameSection, 0);
+  
+  EmitDifference("frame_end", SubprogramCount,
+                 "frame_begin", SubprogramCount);
+  EOL("Length of Frame Information Entry");
+  
+  EmitLabel("frame_begin", SubprogramCount);
+  
+  EmitReference("section_frame", 0); EOL("FDE CIE offset");
+
+  EmitReference("func_begin", SubprogramCount); EOL("FDE initial location");
+  EmitDifference("func_end", SubprogramCount,
+                 "func_begin", SubprogramCount);
+  EOL("FDE address range");
+  
+  std::vector<MachineMove *> &Moves = DebugInfo->getFrameMoves();
+  
+  EmitFrameMoves("func_begin", SubprogramCount, Moves);
+  
+  EmitAlign(2);
+  EmitLabel("frame_end", SubprogramCount);
+
+  O << "\n";
+}
+
 /// EmitDebugPubNames - Emit visible names into a debug pubnames section.
 ///
 void DwarfWriter::EmitDebugPubNames() {
@@ -2208,6 +2286,9 @@
   if (!didInitial) {
     EmitInitial();
   
+    // Emit common frame information.
+    EmitInitialDebugFrame();
+  
     // Create all the compile unit DIEs.
     ConstructCompileUnitDIEs();
     
@@ -2231,6 +2312,8 @@
 DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A)
 : O(OS)
 , Asm(A)
+, TD(Asm->TM.getTargetData())
+, RI(Asm->TM.getRegisterInfo())
 , M(NULL)
 , MF(NULL)
 , DebugInfo(NULL)
@@ -2267,6 +2350,12 @@
   }
 }
 
+/// SetDebugInfo - Set DebugInfo when it's known that pass manager has
+/// created it.  Set by the target AsmPrinter.
+void DwarfWriter::SetDebugInfo(MachineDebugInfo *DI) {
+  DebugInfo = DI;
+}
+
 /// BeginModule - Emit all Dwarf sections that should come prior to the content.
 ///
 void DwarfWriter::BeginModule(Module *M) {
@@ -2300,9 +2389,6 @@
   // Emit source line correspondence into a debug line section.
   EmitDebugLines();
   
-  // Emit info into a debug frame section.
-  EmitDebugFrame();
-  
   // Emit info into a debug pubnames section.
   EmitDebugPubNames();
   
@@ -2327,6 +2413,9 @@
 void DwarfWriter::BeginFunction(MachineFunction *MF) {
   this->MF = MF;
   
+  // Begin accumulating function debug information.
+  DebugInfo->BeginFunction(MF);
+  
   if (!ShouldEmitDwarf()) return;
   EOL("Dwarf Begin Function");
   
@@ -2335,7 +2424,6 @@
   EmitLabel("func_begin", ++SubprogramCount);
 }
 
-
 /// EndFunction - Gather and emit post-function debug information.
 ///
 void DwarfWriter::EndFunction() {
@@ -2348,5 +2436,10 @@
   
   // Construct scopes for subprogram.
   ConstructRootScope(DebugInfo->getRootScope());
-  DebugInfo->ClearScopes();
+  
+  // Emit function frame information.
+  EmitFunctionDebugFrame();
+  
+  // Clear function debug information.
+  DebugInfo->EndFunction();
 }


Index: llvm/lib/CodeGen/MachineDebugInfo.cpp
diff -u llvm/lib/CodeGen/MachineDebugInfo.cpp:1.36 llvm/lib/CodeGen/MachineDebugInfo.cpp:1.37
--- llvm/lib/CodeGen/MachineDebugInfo.cpp:1.36	Mon Mar 27 19:30:18 2006
+++ llvm/lib/CodeGen/MachineDebugInfo.cpp	Fri Apr  7 11:34:45 2006
@@ -10,6 +10,7 @@
 #include "llvm/CodeGen/MachineDebugInfo.h"
 
 #include "llvm/Constants.h"
+#include "llvm/CodeGen/MachineLocation.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/GlobalVariable.h"
 #include "llvm/Intrinsics.h"
@@ -1424,9 +1425,8 @@
 , LabelID(0)
 , ScopeMap()
 , RootScope(NULL)
-{
-  
-}
+, FrameMoves()
+{}
 MachineDebugInfo::~MachineDebugInfo() {
 
 }
@@ -1443,6 +1443,27 @@
   return false;
 }
 
+/// BeginFunction - Begin gathering function debug information.
+///
+void MachineDebugInfo::BeginFunction(MachineFunction *MF) {
+  // Coming soon.
+}
+
+/// MachineDebugInfo::EndFunction - Discard function debug information.
+///
+void MachineDebugInfo::EndFunction() {
+  // Clean up scope information.
+  if (RootScope) {
+    delete RootScope;
+    ScopeMap.clear();
+    RootScope = NULL;
+  }
+  
+  // Clean up frame info.
+  for (unsigned i = 0, N = FrameMoves.size(); i < N; ++i) delete FrameMoves[i];
+  FrameMoves.clear();
+}
+
 /// getDescFor - Convert a Value to a debug information descriptor.
 ///
 // FIXME - use new Value type when available.
@@ -1565,14 +1586,4 @@
   return Slot;
 }
 
-/// ClearScopes - Delete the scope and variable info after a function is
-/// completed.
-void MachineDebugInfo::ClearScopes() {
-  if (RootScope) {
-    delete RootScope;
-    ScopeMap.clear();
-    RootScope = NULL;
-  }
-}
-
 


Index: llvm/lib/CodeGen/PrologEpilogInserter.cpp
diff -u llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.52 llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.53
--- llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.52	Mon Apr  3 16:39:57 2006
+++ llvm/lib/CodeGen/PrologEpilogInserter.cpp	Fri Apr  7 11:34:45 2006
@@ -36,6 +36,12 @@
     /// frame indexes with appropriate references.
     ///
     bool runOnMachineFunction(MachineFunction &Fn) {
+      // Get MachineDebugInfo so that we can track the construction of the
+      // frame.
+      if (MachineDebugInfo *DI = getAnalysisToUpdate<MachineDebugInfo>()) {
+        Fn.getFrameInfo()->setMachineDebugInfo(DI);
+      }
+      
       // Scan the function for modified caller saved registers and insert spill
       // code for any caller saved registers that are modified.  Also calculate
       // the MaxCallFrameSize and HasCalls variables for the function's frame






More information about the llvm-commits mailing list