Landing pad-less eh for PPC.
authorJim Laskey <jlaskey@mac.com>
Mon, 29 Jan 2007 18:51:14 +0000 (18:51 +0000)
committerJim Laskey <jlaskey@mac.com>
Mon, 29 Jan 2007 18:51:14 +0000 (18:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33622 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/DwarfWriter.h
include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/DwarfWriter.cpp
lib/Target/PowerPC/PPCRegisterInfo.cpp
lib/Target/PowerPC/PPCTargetAsmInfo.cpp
lib/Target/TargetAsmInfo.cpp
lib/Target/X86/X86RegisterInfo.cpp

index ae022be3e7d446d41a06befcaf154bbc2b7d5010..d5d6925278d682bebc47e53d7b464b71dec3b6a1 100644 (file)
@@ -7,11 +7,11 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file contains support for writing Dwarf debug info into asm files.  For
-// Details on the Dwarf 3 specfication see DWARF Debugging Information Format
-// V.3 reference manual http://dwarf.freestandards.org ,
+// This file contains support for writing Dwarf debug and exception info into
+// asm files.  For Details on the Dwarf 3 specfication see DWARF Debugging
+// Information Format V.3 reference manual http://dwarf.freestandards.org ,
 //
-// The role of the Dwarf Writer class is to extract debug information from the
+// The role of the Dwarf Writer class is to extract information from the
 // MachineModuleInfo object, organize it in Dwarf form and then emit it into asm
 // the current asm file using data and high level Dwarf directives.
 // 
@@ -25,7 +25,8 @@
 namespace llvm {
 
 class AsmPrinter;
-class Dwarf;
+class DwarfDebug;
+class DwarfException;
 class MachineModuleInfo;
 class MachineFunction;
 class Module;
@@ -37,9 +38,13 @@ class TargetAsmInfo;
 
 class DwarfWriter {
 private:
-  /// DM - Provides the DwarfWriter implementation.
+  /// DD - Provides the DwarfWriter debug implementation.
   ///
-  Dwarf *DW;
+  DwarfDebug *DD;
+
+  /// DE - Provides the DwarfWriter exception implementation.
+  ///
+  DwarfException *DE;
   
 public:
   
index f58eb70906d4f2f724f3c80ee1226f29feaafb7a..c22b9c455caaeb0e746f8864b8d14834cd454017 100644 (file)
@@ -202,6 +202,10 @@ namespace llvm {
     
     //===--- Global Variable Emission Directives --------------------------===//
     
+    /// GlobalDirective - This is the directive used to declare a global entity.
+    ///
+    const char *GlobalDirective;          // Defaults to NULL.
+    
     /// SetDirective - This is the name of a directive that can be used to tell
     /// the assembler to set the value of a variable to some expression.
     const char *SetDirective;             // Defaults to null.
@@ -250,6 +254,10 @@ namespace llvm {
     ///
     bool HasDotFile; // Defaults to false.
     
+    /// SupportsExceptionHandling - True if target supports exception handling.
+    ///
+    bool SupportsExceptionHandling; // Defaults to false.
+    
     /// RequiresFrameSection - true if the Dwarf2 output needs a frame section
     ///
     bool DwarfRequiresFrameSection; // Defaults to true.
@@ -440,6 +448,9 @@ namespace llvm {
     const char *getSixteenByteConstantSection() const {
       return SixteenByteConstantSection;
     }
+    const char *getGlobalDirective() const {
+      return GlobalDirective;
+    }
     const char *getSetDirective() const {
       return SetDirective;
     }
@@ -473,6 +484,9 @@ namespace llvm {
     bool hasDotFile() const {
       return HasDotFile;
     }
+    bool getSupportsExceptionHandling() const {
+      return SupportsExceptionHandling;
+    }
     bool getDwarfRequiresFrameSection() const {
       return DwarfRequiresFrameSection;
     }
index 45d65c781fcc8da0c63dcb5731c4b5598e66ab3d..c61c8395b77cfd41d7c0c43d7303b478bcd5cd0e 100644 (file)
@@ -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 @@ public:
   
   /// 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 @@ public:
   
   /// 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 @@ public:
     
   /// 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 @@ public:
   
   /// 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 @@ public:
   
   /// 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 @@ public:
   
   /// 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 @@ public:
   
   /// 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 @@ public:
   
   /// 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 @@ public:
   
   /// 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 @@ public:
 
   /// 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 @@ public:
   
   /// 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 @@ public:
 };
 
 //===----------------------------------------------------------------------===//
-/// 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 @@ private:
   ///
   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 @@ private:
 
 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 @@ private:
     }
   }
 
-  /// 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 @@ public:
   , 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 @@ public:
     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 @@ public:
     this->MF = MF;
     
     if (!ShouldEmitDwarf()) return;
-    Asm->EOL("Dwarf Begin Function");
 
     // Begin accumulating function debug information.
     MMI->BeginFunction(MF);
@@ -2605,15 +2614,20 @@ public:
     // 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 @@ public:
   }
 };
 
+//===----------------------------------------------------------------------===//
+/// 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 @@ void DIEValue::dump() {
 
 /// 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 @@ unsigned DIEInteger::SizeOf(const Dwarf &DW, unsigned Form) const {
   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 @@ unsigned DIEInteger::SizeOf(const Dwarf &DW, unsigned Form) const {
 
 /// 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 @@ unsigned DIEBlock::ComputeSize(Dwarf &DW) {
 
 /// 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 @@ void DIE::dump() {
 
 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();
 }
index 9228b3e68ecad399cce7b59ef689884d76030c8d..565cbce7f9b8ca32077e462772910a233fdedd36 100644 (file)
@@ -756,8 +756,7 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
   MachineFrameInfo *MFI = MF.getFrameInfo();
   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
   
-  // Prepare for debug frame info.
-  bool hasDebugInfo = MMI && MMI->hasDebugInfo();
+  // Prepare for frame info.
   unsigned FrameLabelId = 0;
   
   // Scan the prolog, looking for an UPDATE_VRSAVE instruction.  If we find it,
@@ -819,7 +818,7 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
   unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
   unsigned MaxAlign = MFI->getMaxAlignment();
 
-  if (hasDebugInfo) {
+  if (MMI) {
     // Mark effective beginning of when frame pointer becomes valid.
     FrameLabelId = MMI->NextLabelID();
     BuildMI(MBB, MBBI, TII.get(PPC::LABEL)).addImm(FrameLabelId);
@@ -870,7 +869,7 @@ void PPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
     }
   }
   
-  if (hasDebugInfo) {
+  if (MMI) {
     std::vector<MachineMove> &Moves = MMI->getFrameMoves();
     
     if (NegFrameSize) {
index b54c9e9eb657b3a7ae4f479aa1a04950b5af1731..0fc8481b742c0e60965411a29d21d5b69deca750 100644 (file)
@@ -51,12 +51,14 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
   PrivateGlobalPrefix = "L";
   ConstantPoolSection = "\t.const\t";
   JumpTableDataSection = ".const";
+  GlobalDirective = "\t.globl\t";
   CStringSection = "\t.cstring";
   StaticCtorsSection = ".mod_init_func";
   StaticDtorsSection = ".mod_term_func";
   UsedDirective = "\t.no_dead_strip\t";
   WeakRefDirective = "\t.weak_reference\t";
   HiddenDirective = "\t.private_extern\t";
+  SupportsExceptionHandling = true;
   
   // In non-PIC modes, emit a special label before jump tables so that the
   // linker can perform more accurate dead code stripping.
index 45ea0eed4d0265d7b83350ba4d05cbc34b23e406..7ac395002ed9916be3f7b8942525ce7bebceacb4 100644 (file)
@@ -59,6 +59,7 @@ TargetAsmInfo::TargetAsmInfo() :
   FourByteConstantSection(0),
   EightByteConstantSection(0),
   SixteenByteConstantSection(0),
+  GlobalDirective(0),
   SetDirective(0),
   LCOMMDirective(0),
   COMMDirective("\t.comm\t"),
@@ -70,6 +71,7 @@ TargetAsmInfo::TargetAsmInfo() :
   HasLEB128(false),
   HasDotLoc(false),
   HasDotFile(false),
+  SupportsExceptionHandling(false),
   DwarfRequiresFrameSection(true),
   DwarfAbbrevSection(".debug_abbrev"),
   DwarfInfoSection(".debug_info"),
index e6500bc2a6c6bb4d1917272b48af6da0d849e2b9..c49fffcb8635abd65783d767e06cae720c16a817 100644 (file)
@@ -997,8 +997,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
   MachineInstr *MI;
   MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
   
-  // Prepare for debug frame info.
-  bool hasDebugInfo = MMI && MMI->hasDebugInfo();
+  // Prepare for frame info.
   unsigned FrameLabelId = 0;
   
   // Get the number of bytes to allocate from the FrameInfo
@@ -1023,7 +1022,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
     }
   }
 
-  if (hasDebugInfo) {
+  if (MMI) {
     // Mark effective beginning of when frame pointer becomes valid.
     FrameLabelId = MMI->NextLabelID();
     BuildMI(MBB, MBBI, TII.get(X86::LABEL)).addImm(FrameLabelId);
@@ -1053,7 +1052,7 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
     MBB.insert(MBBI, MI);
   }
 
-  if (hasDebugInfo) {
+  if (MMI) {
     std::vector<MachineMove> &Moves = MMI->getFrameMoves();
     
     if (NumBytes) {