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

Jim Laskey jlaskey at apple.com
Mon Oct 30 05:35:21 PST 2006



Changes in directory llvm/lib/CodeGen:

DwarfWriter.cpp updated: 1.85 -> 1.86
---
Log message:

Simplify DwarfWriter header.

---
Diffs of the changes:  (+508 -97)

 DwarfWriter.cpp |  605 +++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 508 insertions(+), 97 deletions(-)


Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.85 llvm/lib/CodeGen/DwarfWriter.cpp:1.86
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.85	Tue Oct 24 06:50:43 2006
+++ llvm/lib/CodeGen/DwarfWriter.cpp	Mon Oct 30 07:35:07 2006
@@ -14,6 +14,7 @@
 #include "llvm/CodeGen/DwarfWriter.h"
 
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/UniqueVector.h"
 #include "llvm/Module.h"
 #include "llvm/Type.h"
 #include "llvm/CodeGen/AsmPrinter.h"
@@ -22,6 +23,7 @@
 #include "llvm/CodeGen/MachineLocation.h"
 #include "llvm/Support/Dwarf.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/DataTypes.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/MRegisterInfo.h"
@@ -30,6 +32,7 @@
 #include "llvm/Target/TargetFrameInfo.h"
 
 #include <iostream>
+#include <string>
 
 using namespace llvm;
 using namespace llvm::dwarf;
@@ -39,6 +42,20 @@
                               cl::desc("Add comments to Dwarf directives."));
 
 namespace llvm {
+  
+//===----------------------------------------------------------------------===//
+// DWLabel - Labels are used to track locations in the assembler file.
+// Labels appear in the form <prefix>debug_<Tag><Number>, where the tag is a
+// category of label (Ex. location) and number is a value unique in that
+// category.
+class DWLabel {
+public:
+  const char *Tag;                    // Label category tag. Should always be
+                                      // a staticly declared C string.
+  unsigned    Number;                 // Unique number.
+
+  DWLabel(const char *T, unsigned N) : Tag(T), Number(N) {}
+};
 
 //===----------------------------------------------------------------------===//
 // Forward declarations.
@@ -176,7 +193,7 @@
   
   /// Emit - Print the abbreviation using the specified Dwarf writer.
   ///
-  void Emit(const DwarfWriter &DW) const; 
+  void Emit(const Dwarf &DW) const; 
       
 #ifndef NDEBUG
   void print(std::ostream &O);
@@ -209,11 +226,11 @@
   
   /// EmitValue - Emit value via the Dwarf writer.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const = 0;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const = 0;
   
   /// SizeOf - Return the size of a value in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const = 0;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const = 0;
 };
 
 //===----------------------------------------------------------------------===//
@@ -236,11 +253,11 @@
 
   /// EmitValue - Emit integer of appropriate size.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
   
   /// SizeOf - Determine size of integer value in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
 };
 
 //===----------------------------------------------------------------------===//
@@ -257,11 +274,11 @@
   
   /// EmitValue - Emit string value.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
   
   /// SizeOf - Determine size of string value in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
 };
 
 //===----------------------------------------------------------------------===//
@@ -278,11 +295,11 @@
   
   /// EmitValue - Emit label value.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
   
   /// SizeOf - Determine size of label value in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
 };
 
 
@@ -300,11 +317,11 @@
   
   /// EmitValue - Emit label value.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
   
   /// SizeOf - Determine size of label value in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
 };
 
 //===----------------------------------------------------------------------===//
@@ -323,11 +340,11 @@
   
   /// EmitValue - Emit delta value.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
   
   /// SizeOf - Determine size of delta value in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
 };
 
 //===----------------------------------------------------------------------===//
@@ -344,11 +361,11 @@
   
   /// EmitValue - Emit debug information entry offset.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
   
   /// SizeOf - Determine size of debug information entry in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
 };
 
 //===----------------------------------------------------------------------===//
@@ -373,7 +390,7 @@
   
   /// ComputeSize - calculate the size of the block.
   ///
-  unsigned ComputeSize(DwarfWriter &DW);
+  unsigned ComputeSize(Dwarf &DW);
   
   /// BestForm - Choose the best form for data.
   ///
@@ -381,11 +398,11 @@
 
   /// EmitValue - Emit block data.
   ///
-  virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const;
+  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
   
   /// SizeOf - Determine size of block data in bytes.
   ///
-  virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
 
   /// AddUInt - Add an unsigned integer value.
   ///
@@ -488,12 +505,364 @@
   /// Complete - Indicate that all attributes have been added and
   /// ready to get an abbreviation ID.
   ///
-  void Complete(DwarfWriter &DW);
+  void Complete(Dwarf &DW);
   
   /// AddChild - Add a child to the DIE.
   void AddChild(DIE *Child);
 };
 
+//===----------------------------------------------------------------------===//
+// Dwarf - Emits Dwarf debug and exception handling directives.
+//
+class Dwarf {
+
+private:
+
+  //===--------------------------------------------------------------------===//
+  // Core attributes used by the Dwarf  writer.
+  //
+  
+  //
+  /// O - Stream to .s file.
+  ///
+  std::ostream &O;
+
+  /// Asm - Target of Dwarf emission.
+  ///
+  AsmPrinter *Asm;
+  
+  /// TAI - Target Asm Printer.
+  const TargetAsmInfo *TAI;
+  
+  /// TD - Target data.
+  const TargetData *TD;
+  
+  /// RI - Register Information.
+  const MRegisterInfo *RI;
+  
+  /// M - Current module.
+  ///
+  Module *M;
+  
+  /// MF - Current machine function.
+  ///
+  MachineFunction *MF;
+  
+  /// DebugInfo - Collected debug information.
+  ///
+  MachineDebugInfo *DebugInfo;
+  
+  /// didInitial - Flag to indicate if initial emission has been done.
+  ///
+  bool didInitial;
+  
+  /// shouldEmit - Flag to indicate if debug information should be emitted.
+  ///
+  bool shouldEmit;
+  
+  /// SubprogramCount - The running count of functions being compiled.
+  ///
+  unsigned SubprogramCount;
+  
+  //===--------------------------------------------------------------------===//
+  // Attributes used to construct specific Dwarf sections.
+  //
+  
+  /// CompileUnits - All the compile units involved in this build.  The index
+  /// of each entry in this vector corresponds to the sources in DebugInfo.
+  std::vector<CompileUnit *> CompileUnits;
+
+  /// Abbreviations - A UniqueVector of TAG structure abbreviations.
+  ///
+  UniqueVector<DIEAbbrev> Abbreviations;
+  
+  /// StringPool - A UniqueVector of strings used by indirect references.
+  /// UnitMap - Map debug information descriptor to compile unit.
+   ///
+  UniqueVector<std::string> StringPool;
+
+  /// UnitMap - Map debug information descriptor to compile unit.
+  ///
+  std::map<DebugInfoDesc *, CompileUnit *> DescToUnitMap;
+  
+  /// DescToDieMap - Tracks the mapping of top level debug informaton
+  /// descriptors to debug information entries.
+  std::map<DebugInfoDesc *, DIE *> DescToDieMap;
+  
+  /// SectionMap - Provides a unique id per text section.
+  ///
+  UniqueVector<std::string> SectionMap;
+  
+  /// SectionSourceLines - Tracks line numbers per text section.
+  ///
+  std::vector<std::vector<SourceLineInfo> > SectionSourceLines;
+
+
+public:
+
+  //===--------------------------------------------------------------------===//
+  // Emission and print routines
+  //
+
+  /// PrintHex - Print a value as a hexidecimal value.
+  ///
+  void PrintHex(int Value) const;
+
+  /// EOL - Print a newline character to asm stream.  If a comment is present
+  /// then it will be printed first.  Comments should not contain '\n'.
+  void EOL(const std::string &Comment) const;
+  
+  /// EmitAlign - Print a align directive.
+  ///
+  void EmitAlign(unsigned Alignment) const;
+                                        
+  /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
+  /// unsigned leb128 value.
+  void EmitULEB128Bytes(unsigned Value) const;
+  
+  /// EmitSLEB128Bytes - print an assembler byte data directive to compose a
+  /// signed leb128 value.
+  void EmitSLEB128Bytes(int Value) const;
+  
+  /// PrintULEB128 - Print a series of hexidecimal values (separated by
+  /// commas) representing an unsigned leb128 value.
+  void PrintULEB128(unsigned Value) const;
+
+  /// SizeULEB128 - Compute the number of bytes required for an unsigned
+  /// leb128 value.
+  static unsigned SizeULEB128(unsigned Value);
+  
+  /// PrintSLEB128 - Print a series of hexidecimal values (separated by
+  /// commas) representing a signed leb128 value.
+  void PrintSLEB128(int Value) const;
+  
+  /// SizeSLEB128 - Compute the number of bytes required for a signed leb128
+  /// value.
+  static unsigned SizeSLEB128(int Value);
+  
+  /// EmitInt8 - Emit a byte directive and value.
+  ///
+  void EmitInt8(int Value) const;
+
+  /// EmitInt16 - Emit a short directive and value.
+  ///
+  void EmitInt16(int Value) const;
+
+  /// EmitInt32 - Emit a long directive and value.
+  ///
+  void EmitInt32(int Value) const;
+  
+  /// EmitInt64 - Emit a long long directive and value.
+  ///
+  void EmitInt64(uint64_t Value) const;
+  
+  /// EmitString - Emit a string with quotes and a null terminator.
+  /// Special characters are emitted properly. 
+  /// \literal (Eg. '\t') \endliteral
+  void EmitString(const std::string &String) const;
+
+  /// PrintLabelName - Print label name in form used by Dwarf writer.
+  ///
+  void PrintLabelName(DWLabel Label) const {
+    PrintLabelName(Label.Tag, Label.Number);
+  }
+  void PrintLabelName(const char *Tag, unsigned Number) const;
+  
+  /// EmitLabel - Emit location label for internal use by Dwarf.
+  ///
+  void EmitLabel(DWLabel Label) const {
+    EmitLabel(Label.Tag, Label.Number);
+  }
+  void EmitLabel(const char *Tag, unsigned Number) const;
+  
+  /// EmitReference - Emit a reference to a label.
+  ///
+  void EmitReference(DWLabel Label) const {
+    EmitReference(Label.Tag, Label.Number);
+  }
+  void EmitReference(const char *Tag, unsigned Number) const;
+  void EmitReference(const std::string &Name) const;
+
+  /// EmitDifference - Emit the difference between two labels.  Some
+  /// assemblers do not behave with absolute expressions with data directives,
+  /// so there is an option (needsSet) to use an intermediary set expression.
+  void EmitDifference(DWLabel LabelHi, DWLabel LabelLo) const {
+    EmitDifference(LabelHi.Tag, LabelHi.Number, LabelLo.Tag, LabelLo.Number);
+  }
+  void EmitDifference(const char *TagHi, unsigned NumberHi,
+                      const char *TagLo, unsigned NumberLo) const;
+                      
+  /// NewAbbreviation - Add the abbreviation to the Abbreviation vector.
+  ///  
+  unsigned NewAbbreviation(DIEAbbrev *Abbrev);
+  
+  /// NewString - Add a string to the constant pool and returns a label.
+  ///
+  DWLabel NewString(const std::string &String);
+  
+  /// getDieMapSlotFor - Returns the debug information entry map slot for the
+  /// specified debug descriptor.
+  DIE *&getDieMapSlotFor(DebugInfoDesc *DD);
+                                 
+private:
+
+  /// AddSourceLine - Add location information to specified debug information
+  /// entry. 
+  void AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line);
+
+  /// AddAddress - Add an address attribute to a die based on the location
+  /// provided.
+  void AddAddress(DIE *Die, unsigned Attribute,
+                  const MachineLocation &Location);
+
+  /// NewType - Create a new type DIE.
+  ///
+  DIE *NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit);
+  
+  /// NewCompileUnit - Create new compile unit and it's die.
+  ///
+  CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID);
+  
+  /// FindCompileUnit - Get the compile unit for the given descriptor.
+  ///
+  CompileUnit *FindCompileUnit(CompileUnitDesc *UnitDesc);
+  
+  /// NewGlobalVariable - Make a new global variable DIE.
+  ///
+  DIE *NewGlobalVariable(GlobalVariableDesc *GVD);
+
+  /// NewSubprogram - Add a new subprogram DIE.
+  ///
+  DIE *NewSubprogram(SubprogramDesc *SPD);
+
+  /// NewScopeVariable - Create a new scope variable.
+  ///
+  DIE *NewScopeVariable(DebugVariable *DV, CompileUnit *Unit);
+
+  /// ConstructScope - Construct the components of a scope.
+  ///
+  void ConstructScope(DebugScope *ParentScope, DIE *ParentDie,
+                      CompileUnit *Unit);
+
+  /// ConstructRootScope - Construct the scope for the subprogram.
+  ///
+  void ConstructRootScope(DebugScope *RootScope);
+
+  /// EmitInitial - Emit initial Dwarf declarations.
+  ///
+  void EmitInitial();
+  
+  /// EmitDIE - Recusively Emits a debug information entry.
+  ///
+  void EmitDIE(DIE *Die) const;
+  
+  /// SizeAndOffsetDie - Compute the size and offset of a DIE.
+  ///
+  unsigned SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last);
+
+  /// SizeAndOffsets - Compute the size and offset of all the DIEs.
+  ///
+  void SizeAndOffsets();
+  
+  /// EmitFrameMoves - Emit frame instructions to describe the layout of the
+  /// frame.
+  void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
+                      std::vector<MachineMove *> &Moves);
+
+  /// EmitDebugInfo - Emit the debug info section.
+  ///
+  void EmitDebugInfo() const;
+  
+  /// EmitAbbreviations - Emit the abbreviation section.
+  ///
+  void EmitAbbreviations() const;
+  
+  /// EmitDebugLines - Emit source line information.
+  ///
+  void EmitDebugLines() const;
+
+  /// EmitInitialDebugFrame - Emit common frame info into a debug frame section.
+  ///
+  void EmitInitialDebugFrame();
+    
+  /// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
+  /// section.
+  void EmitFunctionDebugFrame();
+
+  /// EmitDebugPubNames - Emit info into a debug pubnames section.
+  ///
+  void EmitDebugPubNames();
+  
+  /// EmitDebugStr - Emit info into a debug str section.
+  ///
+  void EmitDebugStr();
+  
+  /// EmitDebugLoc - Emit info into a debug loc section.
+  ///
+  void EmitDebugLoc();
+  
+  /// EmitDebugARanges - Emit info into a debug aranges section.
+  ///
+  void EmitDebugARanges();
+  
+  /// EmitDebugRanges - Emit info into a debug ranges section.
+  ///
+  void EmitDebugRanges();
+  
+  /// EmitDebugMacInfo - Emit info into a debug macinfo section.
+  ///
+  void EmitDebugMacInfo();
+  
+  /// ConstructCompileUnitDIEs - Create a compile unit DIE for each source and
+  /// header file.
+  void ConstructCompileUnitDIEs();
+  
+  /// ConstructGlobalDIEs - Create DIEs for each of the externally visible
+  /// global variables.
+  void ConstructGlobalDIEs();
+
+  /// ConstructSubprogramDIEs - Create DIEs for each of the externally visible
+  /// subprograms.
+  void ConstructSubprogramDIEs();
+
+  /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made.
+  ///
+  bool ShouldEmitDwarf() const { return shouldEmit; }
+
+public:
+  
+  Dwarf(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T);
+  virtual ~Dwarf();
+  
+  // Accessors.
+  //
+  const TargetAsmInfo *getTargetAsmInfo() const { return TAI; }
+  
+  /// SetDebugInfo - Set DebugInfo when it's known that pass manager has
+  /// created it.  Set by the target AsmPrinter.
+  void SetDebugInfo(MachineDebugInfo *DI);
+
+  //===--------------------------------------------------------------------===//
+  // Main entry points.
+  //
+  
+  /// BeginModule - Emit all Dwarf sections that should come prior to the
+  /// content.
+  void BeginModule(Module *M);
+  
+  /// EndModule - Emit all Dwarf sections that should come after the content.
+  ///
+  void EndModule();
+  
+  /// BeginFunction - Gather pre-function debug information.  Assumes being 
+  /// emitted immediately after the function entry point.
+  void BeginFunction(MachineFunction *MF);
+  
+  /// EndFunction - Gather and emit post-function debug information.
+  ///
+  void EndFunction();
+};
+
 } // End of namespace llvm
 
 //===----------------------------------------------------------------------===//
@@ -546,7 +915,7 @@
     
 /// Emit - Print the abbreviation using the specified Dwarf writer.
 ///
-void DIEAbbrev::Emit(const DwarfWriter &DW) const {
+void DIEAbbrev::Emit(const Dwarf &DW) const {
   // Emit its Dwarf tag type.
   DW.EmitULEB128Bytes(Tag);
   DW.EOL(TagString(Tag));
@@ -613,7 +982,7 @@
     
 /// EmitValue - Emit integer of appropriate size.
 ///
-void DIEInteger::EmitValue(const DwarfWriter &DW, unsigned Form) const {
+void DIEInteger::EmitValue(const Dwarf &DW, unsigned Form) const {
   switch (Form) {
   case DW_FORM_flag:  // Fall thru
   case DW_FORM_ref1:  // Fall thru
@@ -632,7 +1001,7 @@
 
 /// SizeOf - Determine size of integer value in bytes.
 ///
-unsigned DIEInteger::SizeOf(const DwarfWriter &DW, unsigned Form) const {
+unsigned DIEInteger::SizeOf(const Dwarf &DW, unsigned Form) const {
   switch (Form) {
   case DW_FORM_flag:  // Fall thru
   case DW_FORM_ref1:  // Fall thru
@@ -654,13 +1023,13 @@
 
 /// EmitValue - Emit string value.
 ///
-void DIEString::EmitValue(const DwarfWriter &DW, unsigned Form) const {
+void DIEString::EmitValue(const Dwarf &DW, unsigned Form) const {
   DW.EmitString(String);
 }
 
 /// SizeOf - Determine size of string value in bytes.
 ///
-unsigned DIEString::SizeOf(const DwarfWriter &DW, unsigned Form) const {
+unsigned DIEString::SizeOf(const Dwarf &DW, unsigned Form) const {
   return String.size() + sizeof(char); // sizeof('\0');
 }
 
@@ -668,13 +1037,13 @@
 
 /// EmitValue - Emit label value.
 ///
-void DIEDwarfLabel::EmitValue(const DwarfWriter &DW, unsigned Form) const {
+void DIEDwarfLabel::EmitValue(const Dwarf &DW, unsigned Form) const {
   DW.EmitReference(Label);
 }
 
 /// SizeOf - Determine size of label value in bytes.
 ///
-unsigned DIEDwarfLabel::SizeOf(const DwarfWriter &DW, unsigned Form) const {
+unsigned DIEDwarfLabel::SizeOf(const Dwarf &DW, unsigned Form) const {
   return DW.getTargetAsmInfo()->getAddressSize();
 }
     
@@ -682,13 +1051,13 @@
 
 /// EmitValue - Emit label value.
 ///
-void DIEObjectLabel::EmitValue(const DwarfWriter &DW, unsigned Form) const {
+void DIEObjectLabel::EmitValue(const Dwarf &DW, unsigned Form) const {
   DW.EmitReference(Label);
 }
 
 /// SizeOf - Determine size of label value in bytes.
 ///
-unsigned DIEObjectLabel::SizeOf(const DwarfWriter &DW, unsigned Form) const {
+unsigned DIEObjectLabel::SizeOf(const Dwarf &DW, unsigned Form) const {
   return DW.getTargetAsmInfo()->getAddressSize();
 }
     
@@ -696,26 +1065,26 @@
 
 /// EmitValue - Emit delta value.
 ///
-void DIEDelta::EmitValue(const DwarfWriter &DW, unsigned Form) const {
+void DIEDelta::EmitValue(const Dwarf &DW, unsigned Form) const {
   DW.EmitDifference(LabelHi, LabelLo);
 }
 
 /// SizeOf - Determine size of delta value in bytes.
 ///
-unsigned DIEDelta::SizeOf(const DwarfWriter &DW, unsigned Form) const {
+unsigned DIEDelta::SizeOf(const Dwarf &DW, unsigned Form) const {
   return DW.getTargetAsmInfo()->getAddressSize();
 }
 
 //===----------------------------------------------------------------------===//
 /// EmitValue - Emit debug information entry offset.
 ///
-void DIEntry::EmitValue(const DwarfWriter &DW, unsigned Form) const {
+void DIEntry::EmitValue(const Dwarf &DW, unsigned Form) const {
   DW.EmitInt32(Entry->getOffset());
 }
 
 /// SizeOf - Determine size of debug information entry value in bytes.
 ///
-unsigned DIEntry::SizeOf(const DwarfWriter &DW, unsigned Form) const {
+unsigned DIEntry::SizeOf(const Dwarf &DW, unsigned Form) const {
   return sizeof(int32_t);
 }
     
@@ -729,7 +1098,7 @@
 
 /// ComputeSize - calculate the size of the block.
 ///
-unsigned DIEBlock::ComputeSize(DwarfWriter &DW) {
+unsigned DIEBlock::ComputeSize(Dwarf &DW) {
   Size = 0;
   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
     Size += Values[i]->SizeOf(DW, Forms[i]);
@@ -748,7 +1117,7 @@
 
 /// EmitValue - Emit block data.
 ///
-void DIEBlock::EmitValue(const DwarfWriter &DW, unsigned Form) const {
+void DIEBlock::EmitValue(const Dwarf &DW, unsigned Form) const {
   switch (Form) {
   case DW_FORM_block1: DW.EmitInt8(Size);         break;
   case DW_FORM_block2: DW.EmitInt16(Size);        break;
@@ -764,7 +1133,7 @@
 
 /// SizeOf - Determine size of block data in bytes.
 ///
-unsigned DIEBlock::SizeOf(const DwarfWriter &DW, unsigned Form) const {
+unsigned DIEBlock::SizeOf(const Dwarf &DW, unsigned Form) const {
   switch (Form) {
   case DW_FORM_block1: return Size + sizeof(int8_t);
   case DW_FORM_block2: return Size + sizeof(int16_t);
@@ -927,7 +1296,7 @@
 
 /// Complete - Indicate that all attributes have been added and ready to get an
 /// abbreviation ID.
-void DIE::Complete(DwarfWriter &DW) {
+void DIE::Complete(Dwarf &DW) {
   AbbrevID = DW.NewAbbreviation(Abbrev);
   delete Abbrev;
   Abbrev = NULL;
@@ -943,19 +1312,19 @@
 
 //===----------------------------------------------------------------------===//
 
-/// DwarfWriter
+/// Dwarf
 
 //===----------------------------------------------------------------------===//
 
 /// PrintHex - Print a value as a hexidecimal value.
 ///
-void DwarfWriter::PrintHex(int Value) const { 
+void Dwarf::PrintHex(int Value) const { 
   O << "0x" << std::hex << Value << std::dec;
 }
 
 /// EOL - Print a newline character to asm stream.  If a comment is present
 /// then it will be printed first.  Comments should not contain '\n'.
-void DwarfWriter::EOL(const std::string &Comment) const {
+void Dwarf::EOL(const std::string &Comment) const {
   if (DwarfVerbose && !Comment.empty()) {
     O << "\t"
       << TAI->getCommentString()
@@ -967,13 +1336,13 @@
 
 /// EmitAlign - Print a align directive.
 ///
-void DwarfWriter::EmitAlign(unsigned Alignment) const {
+void Dwarf::EmitAlign(unsigned Alignment) const {
   O << TAI->getAlignDirective() << Alignment << "\n";
 }
 
 /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
 /// unsigned leb128 value.
-void DwarfWriter::EmitULEB128Bytes(unsigned Value) const {
+void Dwarf::EmitULEB128Bytes(unsigned Value) const {
   if (TAI->hasLEB128()) {
     O << "\t.uleb128\t"
       << Value;
@@ -985,7 +1354,7 @@
 
 /// EmitSLEB128Bytes - Emit an assembler byte data directive to compose a
 /// signed leb128 value.
-void DwarfWriter::EmitSLEB128Bytes(int Value) const {
+void Dwarf::EmitSLEB128Bytes(int Value) const {
   if (TAI->hasLEB128()) {
     O << "\t.sleb128\t"
       << Value;
@@ -997,7 +1366,7 @@
 
 /// PrintULEB128 - Print a series of hexidecimal values (separated by commas)
 /// representing an unsigned leb128 value.
-void DwarfWriter::PrintULEB128(unsigned Value) const {
+void Dwarf::PrintULEB128(unsigned Value) const {
   do {
     unsigned Byte = Value & 0x7f;
     Value >>= 7;
@@ -1009,7 +1378,7 @@
 
 /// SizeULEB128 - Compute the number of bytes required for an unsigned leb128
 /// value.
-unsigned DwarfWriter::SizeULEB128(unsigned Value) {
+unsigned Dwarf::SizeULEB128(unsigned Value) {
   unsigned Size = 0;
   do {
     Value >>= 7;
@@ -1020,7 +1389,7 @@
 
 /// PrintSLEB128 - Print a series of hexidecimal values (separated by commas)
 /// representing a signed leb128 value.
-void DwarfWriter::PrintSLEB128(int Value) const {
+void Dwarf::PrintSLEB128(int Value) const {
   int Sign = Value >> (8 * sizeof(Value) - 1);
   bool IsMore;
   
@@ -1036,7 +1405,7 @@
 
 /// SizeSLEB128 - Compute the number of bytes required for a signed leb128
 /// value.
-unsigned DwarfWriter::SizeSLEB128(int Value) {
+unsigned Dwarf::SizeSLEB128(int Value) {
   unsigned Size = 0;
   int Sign = Value >> (8 * sizeof(Value) - 1);
   bool IsMore;
@@ -1052,28 +1421,28 @@
 
 /// EmitInt8 - Emit a byte directive and value.
 ///
-void DwarfWriter::EmitInt8(int Value) const {
+void Dwarf::EmitInt8(int Value) const {
   O << TAI->getData8bitsDirective();
   PrintHex(Value & 0xFF);
 }
 
 /// EmitInt16 - Emit a short directive and value.
 ///
-void DwarfWriter::EmitInt16(int Value) const {
+void Dwarf::EmitInt16(int Value) const {
   O << TAI->getData16bitsDirective();
   PrintHex(Value & 0xFFFF);
 }
 
 /// EmitInt32 - Emit a long directive and value.
 ///
-void DwarfWriter::EmitInt32(int Value) const {
+void Dwarf::EmitInt32(int Value) const {
   O << TAI->getData32bitsDirective();
   PrintHex(Value);
 }
 
 /// EmitInt64 - Emit a long long directive and value.
 ///
-void DwarfWriter::EmitInt64(uint64_t Value) const {
+void Dwarf::EmitInt64(uint64_t Value) const {
   if (TAI->getData64bitsDirective()) {
     O << TAI->getData64bitsDirective() << "0x" << std::hex << Value << std::dec;
   } else {
@@ -1089,7 +1458,7 @@
 
 /// EmitString - Emit a string with quotes and a null terminator.
 /// Special characters are emitted properly. (Eg. '\t')
-void DwarfWriter::EmitString(const std::string &String) const {
+void Dwarf::EmitString(const std::string &String) const {
   O << TAI->getAsciiDirective()
     << "\"";
   for (unsigned i = 0, N = String.size(); i < N; ++i) {
@@ -1122,7 +1491,7 @@
 
 /// PrintLabelName - Print label name in form used by Dwarf writer.
 ///
-void DwarfWriter::PrintLabelName(const char *Tag, unsigned Number) const {
+void Dwarf::PrintLabelName(const char *Tag, unsigned Number) const {
   O << TAI->getPrivateGlobalPrefix()
     << "debug_"
     << Tag;
@@ -1131,14 +1500,14 @@
 
 /// EmitLabel - Emit location label for internal use by Dwarf.
 ///
-void DwarfWriter::EmitLabel(const char *Tag, unsigned Number) const {
+void Dwarf::EmitLabel(const char *Tag, unsigned Number) const {
   PrintLabelName(Tag, Number);
   O << ":\n";
 }
 
 /// EmitReference - Emit a reference to a label.
 ///
-void DwarfWriter::EmitReference(const char *Tag, unsigned Number) const {
+void Dwarf::EmitReference(const char *Tag, unsigned Number) const {
   if (TAI->getAddressSize() == 4)
     O << TAI->getData32bitsDirective();
   else
@@ -1146,7 +1515,7 @@
     
   PrintLabelName(Tag, Number);
 }
-void DwarfWriter::EmitReference(const std::string &Name) const {
+void Dwarf::EmitReference(const std::string &Name) const {
   if (TAI->getAddressSize() == 4)
     O << TAI->getData32bitsDirective();
   else
@@ -1158,7 +1527,7 @@
 /// EmitDifference - Emit an label difference as sizeof(pointer) value.  Some
 /// assemblers do not accept absolute expressions with data directives, so there 
 /// is an option (needsSet) to use an intermediary 'set' expression.
-void DwarfWriter::EmitDifference(const char *TagHi, unsigned NumberHi,
+void Dwarf::EmitDifference(const char *TagHi, unsigned NumberHi,
                                  const char *TagLo, unsigned NumberLo) const {
   if (TAI->needsSet()) {
     static unsigned SetCounter = 0;
@@ -1193,20 +1562,20 @@
 
 /// NewAbbreviation - Add the abbreviation to the Abbreviation vector.
 ///  
-unsigned DwarfWriter::NewAbbreviation(DIEAbbrev *Abbrev) {
+unsigned Dwarf::NewAbbreviation(DIEAbbrev *Abbrev) {
   return Abbreviations.insert(*Abbrev);
 }
 
 /// NewString - Add a string to the constant pool and returns a label.
 ///
-DWLabel DwarfWriter::NewString(const std::string &String) {
+DWLabel Dwarf::NewString(const std::string &String) {
   unsigned StringID = StringPool.insert(String);
   return DWLabel("string", StringID);
 }
 
 /// AddSourceLine - Add location information to specified debug information
 /// entry.
-void DwarfWriter::AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line){
+void Dwarf::AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line){
   if (File && Line) {
     CompileUnit *FileUnit = FindCompileUnit(File);
     unsigned FileID = FileUnit->getID();
@@ -1217,7 +1586,7 @@
 
 /// AddAddress - Add an address attribute to a die based on the location
 /// provided.
-void DwarfWriter::AddAddress(DIE *Die, unsigned Attribute,
+void Dwarf::AddAddress(DIE *Die, unsigned Attribute,
                              const MachineLocation &Location) {
   DIEBlock *Block = new DIEBlock();
   unsigned Reg = RI->getDwarfRegNum(Location.getRegister());
@@ -1244,13 +1613,13 @@
 
 /// getDieMapSlotFor - Returns the debug information entry map slot for the
 /// specified debug descriptor.
-DIE *&DwarfWriter::getDieMapSlotFor(DebugInfoDesc *DD) {
+DIE *&Dwarf::getDieMapSlotFor(DebugInfoDesc *DD) {
   return DescToDieMap[DD];
 }
 
 /// NewType - Create a new type DIE.
 ///
-DIE *DwarfWriter::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
+DIE *Dwarf::NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit) {
   if (!TyDesc) {
     // FIXME - Hack for missing types
     DIE *Die = new DIE(DW_TAG_base_type);
@@ -1565,7 +1934,7 @@
 
 /// NewCompileUnit - Create new compile unit and it's debug information entry.
 ///
-CompileUnit *DwarfWriter::NewCompileUnit(CompileUnitDesc *UnitDesc,
+CompileUnit *Dwarf::NewCompileUnit(CompileUnitDesc *UnitDesc,
                                          unsigned ID) {
   // Construct debug information entry.
   DIE *Die = new DIE(DW_TAG_compile_unit);
@@ -1593,7 +1962,7 @@
 
 /// FindCompileUnit - Get the compile unit for the given descriptor.
 ///
-CompileUnit *DwarfWriter::FindCompileUnit(CompileUnitDesc *UnitDesc) {
+CompileUnit *Dwarf::FindCompileUnit(CompileUnitDesc *UnitDesc) {
   CompileUnit *Unit = DescToUnitMap[UnitDesc];
   assert(Unit && "Missing compile unit.");
   return Unit;
@@ -1601,7 +1970,7 @@
 
 /// NewGlobalVariable - Add a new global variable DIE.
 ///
-DIE *DwarfWriter::NewGlobalVariable(GlobalVariableDesc *GVD) {
+DIE *Dwarf::NewGlobalVariable(GlobalVariableDesc *GVD) {
   // Get the compile unit context.
   CompileUnitDesc *UnitDesc = static_cast<CompileUnitDesc *>(GVD->getContext());
   CompileUnit *Unit = FindCompileUnit(UnitDesc);
@@ -1658,7 +2027,7 @@
 
 /// NewSubprogram - Add a new subprogram DIE.
 ///
-DIE *DwarfWriter::NewSubprogram(SubprogramDesc *SPD) {
+DIE *Dwarf::NewSubprogram(SubprogramDesc *SPD) {
   // Get the compile unit context.
   CompileUnitDesc *UnitDesc = static_cast<CompileUnitDesc *>(SPD->getContext());
   CompileUnit *Unit = FindCompileUnit(UnitDesc);
@@ -1704,7 +2073,7 @@
 
 /// NewScopeVariable - Create a new scope variable.
 ///
-DIE *DwarfWriter::NewScopeVariable(DebugVariable *DV, CompileUnit *Unit) {
+DIE *Dwarf::NewScopeVariable(DebugVariable *DV, CompileUnit *Unit) {
   // Get the descriptor.
   VariableDesc *VD = DV->getDesc();
 
@@ -1738,7 +2107,7 @@
 
 /// ConstructScope - Construct the components of a scope.
 ///
-void DwarfWriter::ConstructScope(DebugScope *ParentScope,
+void Dwarf::ConstructScope(DebugScope *ParentScope,
                                  DIE *ParentDie, CompileUnit *Unit) {
   // Add variables to scope.
   std::vector<DebugVariable *> &Variables = ParentScope->getVariables();
@@ -1788,7 +2157,7 @@
 
 /// ConstructRootScope - Construct the scope for the subprogram.
 ///
-void DwarfWriter::ConstructRootScope(DebugScope *RootScope) {
+void Dwarf::ConstructRootScope(DebugScope *RootScope) {
   // Exit if there is no root scope.
   if (!RootScope) return;
   
@@ -1817,7 +2186,7 @@
 /// EmitInitial - Emit initial Dwarf declarations.  This is necessary for cc
 /// tools to recognize the object file contains Dwarf information.
 ///
-void DwarfWriter::EmitInitial() {
+void Dwarf::EmitInitial() {
   // Check to see if we already emitted intial headers.
   if (didInitial) return;
   didInitial = true;
@@ -1858,7 +2227,7 @@
 
 /// EmitDIE - Recusively Emits a debug information entry.
 ///
-void DwarfWriter::EmitDIE(DIE *Die) const {
+void Dwarf::EmitDIE(DIE *Die) const {
   // Get the abbreviation for this DIE.
   unsigned AbbrevID = Die->getAbbrevID();
   const DIEAbbrev &Abbrev = Abbreviations[AbbrevID];
@@ -1911,7 +2280,7 @@
 
 /// SizeAndOffsetDie - Compute the size and offset of a DIE.
 ///
-unsigned DwarfWriter::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
+unsigned Dwarf::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
   // Get the children.
   const std::vector<DIE *> &Children = Die->getChildren();
   
@@ -1959,7 +2328,7 @@
 
 /// SizeAndOffsets - Compute the size and offset of all the DIEs.
 ///
-void DwarfWriter::SizeAndOffsets() {
+void Dwarf::SizeAndOffsets() {
   
   // Process each compile unit.
   for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -1977,7 +2346,7 @@
 
 /// EmitFrameMoves - Emit frame instructions to describe the layout of the
 /// frame.
-void DwarfWriter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
+void Dwarf::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
                                  std::vector<MachineMove *> &Moves) {
   for (unsigned i = 0, N = Moves.size(); i < N; ++i) {
     MachineMove *Move = Moves[i];
@@ -2056,7 +2425,7 @@
 
 /// EmitDebugInfo - Emit the debug info section.
 ///
-void DwarfWriter::EmitDebugInfo() const {
+void Dwarf::EmitDebugInfo() const {
   // Start debug info section.
   Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0);
   
@@ -2090,7 +2459,7 @@
 
 /// EmitAbbreviations - Emit the abbreviation section.
 ///
-void DwarfWriter::EmitAbbreviations() const {
+void Dwarf::EmitAbbreviations() const {
   // Check to see if it is worth the effort.
   if (!Abbreviations.empty()) {
     // Start the debug abbrev section.
@@ -2121,7 +2490,7 @@
 
 /// EmitDebugLines - Emit source line information.
 ///
-void DwarfWriter::EmitDebugLines() const {
+void Dwarf::EmitDebugLines() const {
   // Minimum line delta, thus ranging from -10..(255-10).
   const int MinLineDelta = -(DW_LNS_fixed_advance_pc + 1);
   // Maximum line delta, thus ranging from -10..(255-10).
@@ -2277,7 +2646,7 @@
   
 /// EmitInitialDebugFrame - Emit common frame info into a debug frame section.
 ///
-void DwarfWriter::EmitInitialDebugFrame() {
+void Dwarf::EmitInitialDebugFrame() {
   int stackGrowth =
       Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
         TargetFrameInfo::StackGrowsUp ?
@@ -2312,7 +2681,7 @@
 
 /// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
 /// section.
-void DwarfWriter::EmitFunctionDebugFrame() {
+void Dwarf::EmitFunctionDebugFrame() {
   // Start the dwarf frame section.
   Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
   
@@ -2342,7 +2711,7 @@
 
 /// EmitDebugPubNames - Emit visible names into a debug pubnames section.
 ///
-void DwarfWriter::EmitDebugPubNames() {
+void Dwarf::EmitDebugPubNames() {
   // Start the dwarf pubnames section.
   Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0);
     
@@ -2387,7 +2756,7 @@
 
 /// EmitDebugStr - Emit visible names into a debug str section.
 ///
-void DwarfWriter::EmitDebugStr() {
+void Dwarf::EmitDebugStr() {
   // Check to see if it is worth the effort.
   if (!StringPool.empty()) {
     // Start the dwarf str section.
@@ -2409,7 +2778,7 @@
 
 /// EmitDebugLoc - Emit visible names into a debug loc section.
 ///
-void DwarfWriter::EmitDebugLoc() {
+void Dwarf::EmitDebugLoc() {
   // Start the dwarf loc section.
   Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0);
   
@@ -2418,7 +2787,7 @@
 
 /// EmitDebugARanges - Emit visible names into a debug aranges section.
 ///
-void DwarfWriter::EmitDebugARanges() {
+void Dwarf::EmitDebugARanges() {
   // Start the dwarf aranges section.
   Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0);
   
@@ -2459,7 +2828,7 @@
 
 /// EmitDebugRanges - Emit visible names into a debug ranges section.
 ///
-void DwarfWriter::EmitDebugRanges() {
+void Dwarf::EmitDebugRanges() {
   // Start the dwarf ranges section.
   Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0);
   
@@ -2468,7 +2837,7 @@
 
 /// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
 ///
-void DwarfWriter::EmitDebugMacInfo() {
+void Dwarf::EmitDebugMacInfo() {
   // Start the dwarf macinfo section.
   Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0);
   
@@ -2477,7 +2846,7 @@
 
 /// ConstructCompileUnitDIEs - Create a compile unit DIE for each source and
 /// header file.
-void DwarfWriter::ConstructCompileUnitDIEs() {
+void Dwarf::ConstructCompileUnitDIEs() {
   const UniqueVector<CompileUnitDesc *> CUW = DebugInfo->getCompileUnits();
   
   for (unsigned i = 1, N = CUW.size(); i <= N; ++i) {
@@ -2488,7 +2857,7 @@
 
 /// ConstructGlobalDIEs - Create DIEs for each of the externally visible global
 /// variables.
-void DwarfWriter::ConstructGlobalDIEs() {
+void Dwarf::ConstructGlobalDIEs() {
   std::vector<GlobalVariableDesc *> GlobalVariables =
       DebugInfo->getAnchoredDescriptors<GlobalVariableDesc>(*M);
   
@@ -2500,7 +2869,7 @@
 
 /// ConstructSubprogramDIEs - Create DIEs for each of the externally visible
 /// subprograms.
-void DwarfWriter::ConstructSubprogramDIEs() {
+void Dwarf::ConstructSubprogramDIEs() {
   std::vector<SubprogramDesc *> Subprograms =
       DebugInfo->getAnchoredDescriptors<SubprogramDesc>(*M);
   
@@ -2511,10 +2880,10 @@
 }
 
 //===----------------------------------------------------------------------===//
-// Main entry points.
+// Dwarf implemenation.
 //
   
-DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A,
+Dwarf::Dwarf(std::ostream &OS, AsmPrinter *A,
   const TargetAsmInfo *T)
 : O(OS)
 , Asm(A)
@@ -2535,7 +2904,7 @@
 , SectionMap()
 , SectionSourceLines()
 {}
-DwarfWriter::~DwarfWriter() {
+Dwarf::~Dwarf() {
   for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
     delete CompileUnits[i];
   }
@@ -2543,7 +2912,7 @@
 
 /// SetDebugInfo - Set DebugInfo when it's known that pass manager has
 /// created it.  Set by the target AsmPrinter.
-void DwarfWriter::SetDebugInfo(MachineDebugInfo *DI) {
+void Dwarf::SetDebugInfo(MachineDebugInfo *DI) {
   // Make sure initial declarations are made.
   if (!DebugInfo && DI->hasInfo()) {
     DebugInfo = DI;
@@ -2568,7 +2937,7 @@
 
 /// BeginModule - Emit all Dwarf sections that should come prior to the content.
 ///
-void DwarfWriter::BeginModule(Module *M) {
+void Dwarf::BeginModule(Module *M) {
   this->M = M;
   
   if (!ShouldEmitDwarf()) return;
@@ -2577,7 +2946,7 @@
 
 /// EndModule - Emit all Dwarf sections that should come after the content.
 ///
-void DwarfWriter::EndModule() {
+void Dwarf::EndModule() {
   if (!ShouldEmitDwarf()) return;
   EOL("Dwarf End Module");
   
@@ -2626,7 +2995,7 @@
 
 /// BeginFunction - Gather pre-function debug information.  Assumes being 
 /// emitted immediately after the function entry point.
-void DwarfWriter::BeginFunction(MachineFunction *MF) {
+void Dwarf::BeginFunction(MachineFunction *MF) {
   this->MF = MF;
   
   if (!ShouldEmitDwarf()) return;
@@ -2641,7 +3010,7 @@
 
 /// EndFunction - Gather and emit post-function debug information.
 ///
-void DwarfWriter::EndFunction() {
+void Dwarf::EndFunction() {
   if (!ShouldEmitDwarf()) return;
   EOL("Dwarf End Function");
   
@@ -2668,9 +3037,51 @@
   EmitFunctionDebugFrame();
   
   // Reset the line numbers for the next function.
-  // FIXME: move this to release memory of the debuginfo object.
   DebugInfo->ClearLineInfo();
 
   // Clear function debug information.
   DebugInfo->EndFunction();
 }
+
+
+//===----------------------------------------------------------------------===//
+/// DwarfWriter Implementation
+
+DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A,
+                         const TargetAsmInfo *T) {
+  DW = new Dwarf(OS, A, T);
+}
+
+DwarfWriter::~DwarfWriter() {
+  delete DW;
+}
+
+/// SetDebugInfo - Set DebugInfo when it's known that pass manager has
+/// created it.  Set by the target AsmPrinter.
+void DwarfWriter::SetDebugInfo(MachineDebugInfo *DI) {
+  DW->SetDebugInfo(DI);
+}
+
+/// BeginModule - Emit all Dwarf sections that should come prior to the
+/// content.
+void DwarfWriter::BeginModule(Module *M) {
+  DW->BeginModule(M);
+}
+
+/// EndModule - Emit all Dwarf sections that should come after the content.
+///
+void DwarfWriter::EndModule() {
+  DW->EndModule();
+}
+
+/// BeginFunction - Gather pre-function debug information.  Assumes being 
+/// emitted immediately after the function entry point.
+void DwarfWriter::BeginFunction(MachineFunction *MF) {
+  DW->BeginFunction(MF);
+}
+
+/// EndFunction - Gather and emit post-function debug information.
+///
+void DwarfWriter::EndFunction() {
+  DW->EndFunction();
+}






More information about the llvm-commits mailing list