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

Jim Laskey jlaskey at apple.com
Mon Jan 29 10:51:41 PST 2007



Changes in directory llvm/lib/CodeGen:

DwarfWriter.cpp updated: 1.117 -> 1.118
---
Log message:

Landing pad-less eh for PPC.

---
Diffs of the changes:  (+198 -114)

 DwarfWriter.cpp |  312 +++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 198 insertions(+), 114 deletions(-)


Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.117 llvm/lib/CodeGen/DwarfWriter.cpp:1.118
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.117	Fri Jan 26 15:22:28 2007
+++ llvm/lib/CodeGen/DwarfWriter.cpp	Mon Jan 29 12:51:14 2007
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file contains support for writing dwarf debug info into asm files.
+// This file contains support for writing dwarf info into asm files.
 //
 //===----------------------------------------------------------------------===//
 
@@ -180,7 +180,7 @@
   
   /// Emit - Print the abbreviation using the specified Dwarf writer.
   ///
-  void Emit(const Dwarf &DW) const; 
+  void Emit(const DwarfDebug &DD) const; 
       
 #ifndef NDEBUG
   void print(std::ostream *O) {
@@ -313,11 +313,11 @@
   
   /// EmitValue - Emit value via the Dwarf writer.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const = 0;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const = 0;
   
   /// SizeOf - Return the size of a value in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const = 0;
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const = 0;
   
   /// Profile - Used to gather unique data for the value folding set.
   ///
@@ -363,11 +363,11 @@
     
   /// EmitValue - Emit integer of appropriate size.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const;
   
   /// SizeOf - Determine size of integer value in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
   
   /// Profile - Used to gather unique data for the value folding set.
   ///
@@ -400,11 +400,11 @@
   
   /// EmitValue - Emit string value.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const;
   
   /// SizeOf - Determine size of string value in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const {
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const {
     return String.size() + sizeof(char); // sizeof('\0');
   }
   
@@ -439,11 +439,11 @@
   
   /// EmitValue - Emit label value.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const;
   
   /// SizeOf - Determine size of label value in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
   
   /// Profile - Used to gather unique data for the value folding set.
   ///
@@ -477,11 +477,11 @@
   
   /// EmitValue - Emit label value.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const;
   
   /// SizeOf - Determine size of label value in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
   
   /// Profile - Used to gather unique data for the value folding set.
   ///
@@ -515,11 +515,11 @@
   
   /// EmitValue - Emit delta value.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const;
   
   /// SizeOf - Determine size of delta value in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
   
   /// Profile - Used to gather unique data for the value folding set.
   ///
@@ -557,11 +557,11 @@
   
   /// EmitValue - Emit debug information entry offset.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const;
   
   /// SizeOf - Determine size of debug information entry in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const {
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const {
     return sizeof(int32_t);
   }
   
@@ -609,7 +609,7 @@
   
   /// ComputeSize - calculate the size of the block.
   ///
-  unsigned ComputeSize(Dwarf &DW);
+  unsigned ComputeSize(DwarfDebug &DD);
   
   /// BestForm - Choose the best form for data.
   ///
@@ -622,11 +622,11 @@
 
   /// EmitValue - Emit block data.
   ///
-  virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
+  virtual void EmitValue(const DwarfDebug &DD, unsigned Form) const;
   
   /// SizeOf - Determine size of block data in bytes.
   ///
-  virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
+  virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
   
 
   /// Profile - Used to gather unique data for the value folding set.
@@ -720,14 +720,14 @@
   
   /// getDieMapSlotFor - Returns the debug information entry map slot for the
   /// specified debug descriptor.
-  DIE *&getDieMapSlotFor(DebugInfoDesc *DD) {
-    return DescToDieMap[DD];
+  DIE *&getDieMapSlotFor(DebugInfoDesc *DID) {
+    return DescToDieMap[DID];
   }
   
   /// getDIEntrySlotFor - Returns the debug information entry proxy slot for the
   /// specified debug descriptor.
-  DIEntry *&getDIEntrySlotFor(DebugInfoDesc *DD) {
-    return DescToDIEntryMap[DD];
+  DIEntry *&getDIEntrySlotFor(DebugInfoDesc *DID) {
+    return DescToDIEntryMap[DID];
   }
   
   /// AddDie - Adds or interns the DIE to the compile unit.
@@ -750,14 +750,14 @@
 };
 
 //===----------------------------------------------------------------------===//
-/// Dwarf - Emits Dwarf debug and exception handling directives. 
+/// Dwarf - Emits general Dwarf directives. 
 ///
 class Dwarf {
 
-private:
+protected:
 
   //===--------------------------------------------------------------------===//
-  // Core attributes used by the Dwarf  writer.
+  // Core attributes used by the Dwarf writer.
   //
   
   //
@@ -802,6 +802,41 @@
   ///
   unsigned SubprogramCount;
   
+  Dwarf(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
+  : O(OS)
+  , Asm(A)
+  , TAI(T)
+  , TD(Asm->TM.getTargetData())
+  , RI(Asm->TM.getRegisterInfo())
+  , M(NULL)
+  , MF(NULL)
+  , MMI(NULL)
+  , didInitial(false)
+  , shouldEmit(false)
+  , SubprogramCount(0)
+  {
+  }
+
+public:
+
+  //===--------------------------------------------------------------------===//
+  // Accessors.
+  //
+  AsmPrinter *getAsm() const { return Asm; }
+  const TargetAsmInfo *getTargetAsmInfo() const { return TAI; }
+
+  /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made.
+  ///
+  bool ShouldEmitDwarf() const { return shouldEmit; }
+
+};
+
+//===----------------------------------------------------------------------===//
+/// DwarfDebug - Emits Dwarf debug directives. 
+///
+class DwarfDebug : public Dwarf {
+
+private:
   //===--------------------------------------------------------------------===//
   // Attributes used to construct specific Dwarf sections.
   //
@@ -845,11 +880,6 @@
 
 public:
 
-  //===--------------------------------------------------------------------===//
-  // Accessors.
-  //
-  AsmPrinter *getAsm() const { return Asm; }
-
   /// PrintLabelName - Print label name in form used by Dwarf writer.
   ///
   void PrintLabelName(DWLabel Label) const {
@@ -2466,26 +2496,12 @@
     }
   }
 
-  /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made.
-  ///
-  bool ShouldEmitDwarf() const { return shouldEmit; }
-
 public:
   //===--------------------------------------------------------------------===//
   // Main entry points.
   //
-  Dwarf(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
-  : O(OS)
-  , Asm(A)
-  , TAI(T)
-  , TD(Asm->TM.getTargetData())
-  , RI(Asm->TM.getRegisterInfo())
-  , M(NULL)
-  , MF(NULL)
-  , MMI(NULL)
-  , didInitial(false)
-  , shouldEmit(false)
-  , SubprogramCount(0)
+  DwarfDebug(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
+  : Dwarf(OS, A, T)
   , CompileUnits()
   , AbbreviationsSet(InitAbbreviationsSetSize)
   , Abbreviations()
@@ -2497,17 +2513,13 @@
   , SectionSourceLines()
   {
   }
-  virtual ~Dwarf() {
+  virtual ~DwarfDebug() {
     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i)
       delete CompileUnits[i];
     for (unsigned j = 0, M = Values.size(); j < M; ++j)
       delete Values[j];
   }
 
-  // Accessors.
-  //
-  const TargetAsmInfo *getTargetAsmInfo() const { return TAI; }
-  
   /// SetModuleInfo - Set machine module information when it's known that pass
   /// manager has created it.  Set by the target AsmPrinter.
   void SetModuleInfo(MachineModuleInfo *mmi) {
@@ -2539,14 +2551,12 @@
     this->M = M;
     
     if (!ShouldEmitDwarf()) return;
-    Asm->EOL("Dwarf Begin Module");
   }
 
   /// EndModule - Emit all Dwarf sections that should come after the content.
   ///
   void EndModule() {
     if (!ShouldEmitDwarf()) return;
-    Asm->EOL("Dwarf End Module");
     
     // Standard sections final addresses.
     Asm->SwitchToTextSection(TAI->getTextSection());
@@ -2597,7 +2607,6 @@
     this->MF = MF;
     
     if (!ShouldEmitDwarf()) return;
-    Asm->EOL("Dwarf Begin Function");
 
     // Begin accumulating function debug information.
     MMI->BeginFunction(MF);
@@ -2605,15 +2614,20 @@
     // Assumes in correct section after the entry point.
     EmitLabel("func_begin", ++SubprogramCount);
   }
+  
+  /// PreExceptionEndFunction - Close off function before exception handling
+  /// tables.
+  void PreExceptionEndFunction() {
+    if (!ShouldEmitDwarf()) return;
+    
+    // Define end label for subprogram.
+    EmitLabel("func_end", SubprogramCount);
+  }
 
   /// EndFunction - Gather and emit post-function debug information.
   ///
   void EndFunction() {
     if (!ShouldEmitDwarf()) return;
-    Asm->EOL("Dwarf End Function");
-    
-    // Define end label for subprogram.
-    EmitLabel("func_end", SubprogramCount);
       
     // Get function line info.
     const std::vector<SourceLineInfo> &LineInfos = MMI->getSourceLines();
@@ -2642,37 +2656,99 @@
   }
 };
 
+//===----------------------------------------------------------------------===//
+/// DwarfException - Emits Dwarf exception handling directives. 
+///
+class DwarfException : public Dwarf  {
+
+public:
+  //===--------------------------------------------------------------------===//
+  // Main entry points.
+  //
+  DwarfException(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
+  : Dwarf(OS, A, T)
+  {}
+  
+  virtual ~DwarfException() {}
+
+  /// SetModuleInfo - Set machine module information when it's known that pass
+  /// manager has created it.  Set by the target AsmPrinter.
+  void SetModuleInfo(MachineModuleInfo *mmi) {
+    // Make sure initial declarations are made.
+    if (!MMI && TAI->getSupportsExceptionHandling()) {
+      MMI = mmi;
+      shouldEmit = true;
+    }
+  }
+
+  /// BeginModule - Emit all exception information that should come prior to the
+  /// content.
+  void BeginModule(Module *M) {
+    this->M = M;
+    
+    if (!ShouldEmitDwarf()) return;
+  }
+
+  /// EndModule - Emit all exception information that should come after the
+  /// content.
+  void EndModule() {
+    if (!ShouldEmitDwarf()) return;
+  }
+
+  /// BeginFunction - Gather pre-function exception information.  Assumes being 
+  /// emitted immediately after the function entry point.
+  void BeginFunction(MachineFunction *MF) {
+    this->MF = MF;
+    
+    if (!ShouldEmitDwarf()) return;
+  }
+
+  /// EndFunction - Gather and emit post-function exception information.
+  ///
+  void EndFunction() {
+    if (!ShouldEmitDwarf()) return;
+
+    if (const char *GlobalDirective = TAI->getGlobalDirective())
+      O << GlobalDirective << getAsm()->CurrentFnName << ".eh\n";
+      
+    O << getAsm()->CurrentFnName << ".eh = 0\n";
+    
+    if (const char *UsedDirective = TAI->getUsedDirective())
+      O << UsedDirective << getAsm()->CurrentFnName << ".eh\n";
+  }
+};
+
 } // End of namespace llvm
 
 //===----------------------------------------------------------------------===//
 
 /// Emit - Print the abbreviation using the specified Dwarf writer.
 ///
-void DIEAbbrev::Emit(const Dwarf &DW) const {
+void DIEAbbrev::Emit(const DwarfDebug &DD) const {
   // Emit its Dwarf tag type.
-  DW.getAsm()->EmitULEB128Bytes(Tag);
-  DW.getAsm()->EOL(TagString(Tag));
+  DD.getAsm()->EmitULEB128Bytes(Tag);
+  DD.getAsm()->EOL(TagString(Tag));
   
   // Emit whether it has children DIEs.
-  DW.getAsm()->EmitULEB128Bytes(ChildrenFlag);
-  DW.getAsm()->EOL(ChildrenString(ChildrenFlag));
+  DD.getAsm()->EmitULEB128Bytes(ChildrenFlag);
+  DD.getAsm()->EOL(ChildrenString(ChildrenFlag));
   
   // For each attribute description.
   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
     const DIEAbbrevData &AttrData = Data[i];
     
     // Emit attribute type.
-    DW.getAsm()->EmitULEB128Bytes(AttrData.getAttribute());
-    DW.getAsm()->EOL(AttributeString(AttrData.getAttribute()));
+    DD.getAsm()->EmitULEB128Bytes(AttrData.getAttribute());
+    DD.getAsm()->EOL(AttributeString(AttrData.getAttribute()));
     
     // Emit form type.
-    DW.getAsm()->EmitULEB128Bytes(AttrData.getForm());
-    DW.getAsm()->EOL(FormEncodingString(AttrData.getForm()));
+    DD.getAsm()->EmitULEB128Bytes(AttrData.getForm());
+    DD.getAsm()->EOL(FormEncodingString(AttrData.getForm()));
   }
 
   // Mark end of abbreviation.
-  DW.getAsm()->EmitULEB128Bytes(0); DW.getAsm()->EOL("EOM(1)");
-  DW.getAsm()->EmitULEB128Bytes(0); DW.getAsm()->EOL("EOM(2)");
+  DD.getAsm()->EmitULEB128Bytes(0); DD.getAsm()->EOL("EOM(1)");
+  DD.getAsm()->EmitULEB128Bytes(0); DD.getAsm()->EOL("EOM(2)");
 }
 
 #ifndef NDEBUG
@@ -2708,26 +2784,26 @@
 
 /// EmitValue - Emit integer of appropriate size.
 ///
-void DIEInteger::EmitValue(const Dwarf &DW, unsigned Form) const {
+void DIEInteger::EmitValue(const DwarfDebug &DD, unsigned Form) const {
   switch (Form) {
   case DW_FORM_flag:  // Fall thru
   case DW_FORM_ref1:  // Fall thru
-  case DW_FORM_data1: DW.getAsm()->EmitInt8(Integer);         break;
+  case DW_FORM_data1: DD.getAsm()->EmitInt8(Integer);         break;
   case DW_FORM_ref2:  // Fall thru
-  case DW_FORM_data2: DW.getAsm()->EmitInt16(Integer);        break;
+  case DW_FORM_data2: DD.getAsm()->EmitInt16(Integer);        break;
   case DW_FORM_ref4:  // Fall thru
-  case DW_FORM_data4: DW.getAsm()->EmitInt32(Integer);        break;
+  case DW_FORM_data4: DD.getAsm()->EmitInt32(Integer);        break;
   case DW_FORM_ref8:  // Fall thru
-  case DW_FORM_data8: DW.getAsm()->EmitInt64(Integer);        break;
-  case DW_FORM_udata: DW.getAsm()->EmitULEB128Bytes(Integer); break;
-  case DW_FORM_sdata: DW.getAsm()->EmitSLEB128Bytes(Integer); break;
+  case DW_FORM_data8: DD.getAsm()->EmitInt64(Integer);        break;
+  case DW_FORM_udata: DD.getAsm()->EmitULEB128Bytes(Integer); break;
+  case DW_FORM_sdata: DD.getAsm()->EmitSLEB128Bytes(Integer); break;
   default: assert(0 && "DIE Value form not supported yet");   break;
   }
 }
 
 /// SizeOf - Determine size of integer value in bytes.
 ///
-unsigned DIEInteger::SizeOf(const Dwarf &DW, unsigned Form) const {
+unsigned DIEInteger::SizeOf(const DwarfDebug &DD, unsigned Form) const {
   switch (Form) {
   case DW_FORM_flag:  // Fall thru
   case DW_FORM_ref1:  // Fall thru
@@ -2738,8 +2814,8 @@
   case DW_FORM_data4: return sizeof(int32_t);
   case DW_FORM_ref8:  // Fall thru
   case DW_FORM_data8: return sizeof(int64_t);
-  case DW_FORM_udata: return DW.getAsm()->SizeULEB128(Integer);
-  case DW_FORM_sdata: return DW.getAsm()->SizeSLEB128(Integer);
+  case DW_FORM_udata: return DD.getAsm()->SizeULEB128(Integer);
+  case DW_FORM_sdata: return DD.getAsm()->SizeSLEB128(Integer);
   default: assert(0 && "DIE Value form not supported yet"); break;
   }
   return 0;
@@ -2749,72 +2825,72 @@
 
 /// EmitValue - Emit string value.
 ///
-void DIEString::EmitValue(const Dwarf &DW, unsigned Form) const {
-  DW.getAsm()->EmitString(String);
+void DIEString::EmitValue(const DwarfDebug &DD, unsigned Form) const {
+  DD.getAsm()->EmitString(String);
 }
 
 //===----------------------------------------------------------------------===//
 
 /// EmitValue - Emit label value.
 ///
-void DIEDwarfLabel::EmitValue(const Dwarf &DW, unsigned Form) const {
-  DW.EmitReference(Label);
+void DIEDwarfLabel::EmitValue(const DwarfDebug &DD, unsigned Form) const {
+  DD.EmitReference(Label);
 }
 
 /// SizeOf - Determine size of label value in bytes.
 ///
-unsigned DIEDwarfLabel::SizeOf(const Dwarf &DW, unsigned Form) const {
-  return DW.getTargetAsmInfo()->getAddressSize();
+unsigned DIEDwarfLabel::SizeOf(const DwarfDebug &DD, unsigned Form) const {
+  return DD.getTargetAsmInfo()->getAddressSize();
 }
 
 //===----------------------------------------------------------------------===//
 
 /// EmitValue - Emit label value.
 ///
-void DIEObjectLabel::EmitValue(const Dwarf &DW, unsigned Form) const {
-  DW.EmitReference(Label);
+void DIEObjectLabel::EmitValue(const DwarfDebug &DD, unsigned Form) const {
+  DD.EmitReference(Label);
 }
 
 /// SizeOf - Determine size of label value in bytes.
 ///
-unsigned DIEObjectLabel::SizeOf(const Dwarf &DW, unsigned Form) const {
-  return DW.getTargetAsmInfo()->getAddressSize();
+unsigned DIEObjectLabel::SizeOf(const DwarfDebug &DD, unsigned Form) const {
+  return DD.getTargetAsmInfo()->getAddressSize();
 }
     
 //===----------------------------------------------------------------------===//
 
 /// EmitValue - Emit delta value.
 ///
-void DIEDelta::EmitValue(const Dwarf &DW, unsigned Form) const {
+void DIEDelta::EmitValue(const DwarfDebug &DD, unsigned Form) const {
   bool IsSmall = Form == DW_FORM_data4;
-  DW.EmitDifference(LabelHi, LabelLo, IsSmall);
+  DD.EmitDifference(LabelHi, LabelLo, IsSmall);
 }
 
 /// SizeOf - Determine size of delta value in bytes.
 ///
-unsigned DIEDelta::SizeOf(const Dwarf &DW, unsigned Form) const {
+unsigned DIEDelta::SizeOf(const DwarfDebug &DD, unsigned Form) const {
   if (Form == DW_FORM_data4) return 4;
-  return DW.getTargetAsmInfo()->getAddressSize();
+  return DD.getTargetAsmInfo()->getAddressSize();
 }
 
 //===----------------------------------------------------------------------===//
 
 /// EmitValue - Emit debug information entry offset.
 ///
-void DIEntry::EmitValue(const Dwarf &DW, unsigned Form) const {
-  DW.getAsm()->EmitInt32(Entry->getOffset());
+void DIEntry::EmitValue(const DwarfDebug &DD, unsigned Form) const {
+  DD.getAsm()->EmitInt32(Entry->getOffset());
 }
     
 //===----------------------------------------------------------------------===//
 
 /// ComputeSize - calculate the size of the block.
 ///
-unsigned DIEBlock::ComputeSize(Dwarf &DW) {
+unsigned DIEBlock::ComputeSize(DwarfDebug &DD) {
   if (!Size) {
     const std::vector<DIEAbbrevData> &AbbrevData = Abbrev.getData();
     
     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
-      Size += Values[i]->SizeOf(DW, AbbrevData[i].getForm());
+      Size += Values[i]->SizeOf(DD, AbbrevData[i].getForm());
     }
   }
   return Size;
@@ -2822,31 +2898,31 @@
 
 /// EmitValue - Emit block data.
 ///
-void DIEBlock::EmitValue(const Dwarf &DW, unsigned Form) const {
+void DIEBlock::EmitValue(const DwarfDebug &DD, unsigned Form) const {
   switch (Form) {
-  case DW_FORM_block1: DW.getAsm()->EmitInt8(Size);         break;
-  case DW_FORM_block2: DW.getAsm()->EmitInt16(Size);        break;
-  case DW_FORM_block4: DW.getAsm()->EmitInt32(Size);        break;
-  case DW_FORM_block:  DW.getAsm()->EmitULEB128Bytes(Size); break;
+  case DW_FORM_block1: DD.getAsm()->EmitInt8(Size);         break;
+  case DW_FORM_block2: DD.getAsm()->EmitInt16(Size);        break;
+  case DW_FORM_block4: DD.getAsm()->EmitInt32(Size);        break;
+  case DW_FORM_block:  DD.getAsm()->EmitULEB128Bytes(Size); break;
   default: assert(0 && "Improper form for block");          break;
   }
   
   const std::vector<DIEAbbrevData> &AbbrevData = Abbrev.getData();
 
   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
-    DW.getAsm()->EOL("");
-    Values[i]->EmitValue(DW, AbbrevData[i].getForm());
+    DD.getAsm()->EOL("");
+    Values[i]->EmitValue(DD, AbbrevData[i].getForm());
   }
 }
 
 /// SizeOf - Determine size of block data in bytes.
 ///
-unsigned DIEBlock::SizeOf(const Dwarf &DW, unsigned Form) const {
+unsigned DIEBlock::SizeOf(const DwarfDebug &DD, unsigned Form) const {
   switch (Form) {
   case DW_FORM_block1: return Size + sizeof(int8_t);
   case DW_FORM_block2: return Size + sizeof(int16_t);
   case DW_FORM_block4: return Size + sizeof(int32_t);
-  case DW_FORM_block: return Size + DW.getAsm()->SizeULEB128(Size);
+  case DW_FORM_block: return Size + DD.getAsm()->SizeULEB128(Size);
   default: assert(0 && "Improper form for block"); break;
   }
   return 0;
@@ -2941,39 +3017,47 @@
 
 DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A,
                          const TargetAsmInfo *T) {
-  DW = new Dwarf(OS, A, T);
+  DE = new DwarfException(OS, A, T);
+  DD = new DwarfDebug(OS, A, T);
 }
 
 DwarfWriter::~DwarfWriter() {
-  delete DW;
+  delete DE;
+  delete DD;
 }
 
 /// SetModuleInfo - Set machine module info when it's known that pass manager
 /// has created it.  Set by the target AsmPrinter.
 void DwarfWriter::SetModuleInfo(MachineModuleInfo *MMI) {
-  DW->SetModuleInfo(MMI);
+  DE->SetModuleInfo(MMI);
+  DD->SetModuleInfo(MMI);
 }
 
 /// BeginModule - Emit all Dwarf sections that should come prior to the
 /// content.
 void DwarfWriter::BeginModule(Module *M) {
-  DW->BeginModule(M);
+  DE->BeginModule(M);
+  DD->BeginModule(M);
 }
 
 /// EndModule - Emit all Dwarf sections that should come after the content.
 ///
 void DwarfWriter::EndModule() {
-  DW->EndModule();
+  DE->EndModule();
+  DD->EndModule();
 }
 
 /// BeginFunction - Gather pre-function debug information.  Assumes being 
 /// emitted immediately after the function entry point.
 void DwarfWriter::BeginFunction(MachineFunction *MF) {
-  DW->BeginFunction(MF);
+  DE->BeginFunction(MF);
+  DD->BeginFunction(MF);
 }
 
 /// EndFunction - Gather and emit post-function debug information.
 ///
 void DwarfWriter::EndFunction() {
-  DW->EndFunction();
+  DD->PreExceptionEndFunction();
+  DE->EndFunction();
+  DD->EndFunction();
 }






More information about the llvm-commits mailing list