Fixed the comment. No functionality change.
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfWriter.cpp
index c27bdf1ac64b6087a96e7cc90b7fca6e349ba46b..4120d9f917105721e3490c31557a796218456ff1 100644 (file)
@@ -48,16 +48,11 @@ static RegisterPass<DwarfWriter>
 X("dwarfwriter", "DWARF Information Writer");
 char DwarfWriter::ID = 0;
 
-namespace {
-
-static TimerGroup *DwarfTimerGroup = 0;
-static TimerGroup *getDwarfTimerGroup() {
-  if (DwarfTimerGroup) return DwarfTimerGroup;
-  return DwarfTimerGroup = new TimerGroup("Dwarf Exception and Debugging");
+static TimerGroup &getDwarfTimerGroup() {
+  static TimerGroup DwarfTimerGroup("Dwarf Exception and Debugging");
+  return DwarfTimerGroup;
 }
 
-} // end anonymous namespace
-
 namespace llvm {
 
 //===----------------------------------------------------------------------===//
@@ -133,7 +128,6 @@ public:
 /// DIEAbbrevData - Dwarf abbreviation data, describes the one attribute of a
 /// Dwarf abbreviation.
 class DIEAbbrevData {
-private:
   /// Attribute - Dwarf attribute code.
   ///
   unsigned Attribute;
@@ -141,12 +135,8 @@ private:
   /// Form - Dwarf form code.
   ///
   unsigned Form;
-
 public:
-  DIEAbbrevData(unsigned A, unsigned F)
-  : Attribute(A)
-  , Form(F)
-  {}
+  DIEAbbrevData(unsigned A, unsigned F) : Attribute(A), Form(F) {}
 
   // Accessors.
   unsigned getAttribute() const { return Attribute; }
@@ -180,15 +170,9 @@ private:
   /// Data - Raw data bytes for abbreviation.
   ///
   SmallVector<DIEAbbrevData, 8> Data;
-
 public:
-
-  DIEAbbrev(unsigned T, unsigned C)
-  : Tag(T)
-  , ChildrenFlag(C)
-  , Data()
-  {}
-  ~DIEAbbrev() {}
+  DIEAbbrev(unsigned T, unsigned C) : Tag(T), ChildrenFlag(C), Data() {}
+  virtual ~DIEAbbrev() {}
 
   // Accessors.
   unsigned getTag()                           const { return Tag; }
@@ -262,12 +246,7 @@ protected:
 
 public:
   explicit DIE(unsigned Tag)
-  : Abbrev(Tag, DW_CHILDREN_no)
-  , Offset(0)
-  , Size(0)
-  , Children()
-  , Values()
-  {}
+    : Abbrev(Tag, DW_CHILDREN_no), Offset(0), Size(0), Children(), Values() {}
   virtual ~DIE();
 
   // Accessors.
@@ -345,9 +324,7 @@ public:
   ///
   unsigned Type;
 
-  explicit DIEValue(unsigned T)
-  : Type(T)
-  {}
+  explicit DIEValue(unsigned T) : Type(T) {}
   virtual ~DIEValue() {}
 
   // Accessors
@@ -434,10 +411,9 @@ public:
 /// DIEString - A string value DIE.
 ///
 class DIEString : public DIEValue {
+  const std::string Str;
 public:
-  const std::string String;
-
-  explicit DIEString(const std::string &S) : DIEValue(isString), String(S) {}
+  explicit DIEString(const std::string &S) : DIEValue(isString), Str(S) {}
 
   // Implement isa/cast/dyncast.
   static bool classof(const DIEString *) { return true; }
@@ -450,20 +426,20 @@ public:
   /// SizeOf - Determine size of string value in bytes.
   ///
   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const {
-    return String.size() + sizeof(char); // sizeof('\0');
+    return Str.size() + sizeof(char); // sizeof('\0');
   }
 
   /// Profile - Used to gather unique data for the value folding set.
   ///
-  static void Profile(FoldingSetNodeID &ID, const std::string &String) {
+  static void Profile(FoldingSetNodeID &ID, const std::string &Str) {
     ID.AddInteger(isString);
-    ID.AddString(String);
+    ID.AddString(Str);
   }
-  virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, String); }
+  virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, Str); }
 
 #ifndef NDEBUG
   virtual void print(std::ostream &O) {
-    O << "Str: \"" << String << "\"";
+    O << "Str: \"" << Str << "\"";
   }
 #endif
 };
@@ -472,10 +448,8 @@ public:
 /// DIEDwarfLabel - A Dwarf internal label expression DIE.
 //
 class DIEDwarfLabel : public DIEValue {
-public:
-
   const DWLabel Label;
-
+public:
   explicit DIEDwarfLabel(const DWLabel &L) : DIEValue(isLabel), Label(L) {}
 
   // Implement isa/cast/dyncast.
@@ -506,14 +480,12 @@ public:
 #endif
 };
 
-
 //===----------------------------------------------------------------------===//
 /// DIEObjectLabel - A label to an object in code or data.
 //
 class DIEObjectLabel : public DIEValue {
-public:
   const std::string Label;
-
+public:
   explicit DIEObjectLabel(const std::string &L)
   : DIEValue(isAsIsLabel), Label(L) {}
 
@@ -548,16 +520,15 @@ public:
 /// DIESectionOffset - A section offset DIE.
 //
 class DIESectionOffset : public DIEValue {
-public:
   const DWLabel Label;
   const DWLabel Section;
   bool IsEH : 1;
   bool UseSet : 1;
-
+public:
   DIESectionOffset(const DWLabel &Lab, const DWLabel &Sec,
                    bool isEH = false, bool useSet = true)
-  : DIEValue(isSectionOffset), Label(Lab), Section(Sec),
-                               IsEH(isEH), UseSet(useSet) {}
+    : DIEValue(isSectionOffset), Label(Lab), Section(Sec),
+      IsEH(isEH), UseSet(useSet) {}
 
   // Implement isa/cast/dyncast.
   static bool classof(const DIESectionOffset *)  { return true; }
@@ -598,12 +569,11 @@ public:
 /// DIEDelta - A simple label difference DIE.
 ///
 class DIEDelta : public DIEValue {
-public:
   const DWLabel LabelHi;
   const DWLabel LabelLo;
-
+public:
   DIEDelta(const DWLabel &Hi, const DWLabel &Lo)
-  : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {}
+    : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {}
 
   // Implement isa/cast/dyncast.
   static bool classof(const DIEDelta *)  { return true; }
@@ -642,11 +612,12 @@ public:
 /// class can also be used as a proxy for a debug information entry not yet
 /// defined (ie. types.)
 class DIEntry : public DIEValue {
-public:
   DIE *Entry;
-
+public:
   explicit DIEntry(DIE *E) : DIEValue(isEntry), Entry(E) {}
 
+  void setEntry(DIE *E) { Entry = E; }
+
   // Implement isa/cast/dyncast.
   static bool classof(const DIEntry *)   { return true; }
   static bool classof(const DIEValue *E) { return E->Type == isEntry; }
@@ -688,16 +659,11 @@ public:
 /// DIEBlock - A block of values.  Primarily used for location expressions.
 //
 class DIEBlock : public DIEValue, public DIE {
+  unsigned Size;                // Size in bytes excluding size header.
 public:
-  unsigned Size;                        // Size in bytes excluding size header.
-
   DIEBlock()
-  : DIEValue(isBlock)
-  , DIE(0)
-  , Size(0)
-  {}
-  ~DIEBlock()  {
-  }
+    : DIEValue(isBlock), DIE(0), Size(0) {}
+  virtual ~DIEBlock() {}
 
   // Implement isa/cast/dyncast.
   static bool classof(const DIEBlock *)  { return true; }
@@ -724,7 +690,6 @@ public:
   ///
   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
 
-
   /// Profile - Used to gather unique data for the value folding set.
   ///
   virtual void Profile(FoldingSetNodeID &ID) {
@@ -744,7 +709,6 @@ public:
 /// CompileUnit - This dwarf writer support class manages information associate
 /// with a source file.
 class CompileUnit {
-private:
   /// ID - File identifier for source.
   ///
   unsigned ID;
@@ -768,7 +732,6 @@ private:
   /// DiesSet - Used to uniquely define dies within the compile unit.
   ///
   FoldingSet<DIE> DiesSet;
-
 public:
   CompileUnit(unsigned I, DIE *D)
     : ID(I), Die(D), GVToDieMap(),
@@ -1302,13 +1265,37 @@ class DwarfDebug : public Dwarf {
 
   std::vector<FunctionDebugFrameInfo> DebugFrames;
 
-public:
-  /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should
-  /// be emitted.
-  ///
-  bool ShouldEmitDwarfDebug() const { return shouldEmit; }
-
 private:
+  /// getSourceDirectoryAndFileIds - Return the directory and file ids that
+  /// maps to the source id. Source id starts at 1.
+  std::pair<unsigned, unsigned>
+  getSourceDirectoryAndFileIds(unsigned SId) const {
+    return SourceIds[SId-1];
+  }
+
+  /// getNumSourceDirectories - Return the number of source directories in the
+  /// debug info.
+  unsigned getNumSourceDirectories() const {
+    return DirectoryNames.size();
+  }
+
+  /// getSourceDirectoryName - Return the name of the directory corresponding
+  /// to the id.
+  const std::string &getSourceDirectoryName(unsigned Id) const {
+    return DirectoryNames[Id - 1];
+  }
+
+  /// getSourceFileName - Return the name of the source file corresponding
+  /// to the id.
+  const std::string &getSourceFileName(unsigned Id) const {
+    return SourceFileNames[Id - 1];
+  }
+
+  /// getNumSourceIds - Return the number of unique source ids.
+  unsigned getNumSourceIds() const {
+    return SourceIds.size();
+  }
+
   /// AssignAbbrevNumber - Define a unique number for the abbreviation.
   ///
   void AssignAbbrevNumber(DIEAbbrev &Abbrev) {
@@ -1364,7 +1351,7 @@ private:
   /// SetDIEntry - Set a DIEntry once the debug information entry is defined.
   ///
   void SetDIEntry(DIEntry *Value, DIE *Entry) {
-    Value->Entry = Entry;
+    Value->setEntry(Entry);
     // Add to values set if not already there.  If it is, we merely have a
     // duplicate in the values list (no harm.)
     ValuesSet.GetOrInsertNode(Value);
@@ -2478,7 +2465,7 @@ private:
     // Emit files.
     for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
       // Remember source id starts at 1.
-      std::pair<unsigned, unsigned> Id = getSourceDirsectoryAndFileIds(SI);
+      std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
       Asm->EmitString(getSourceFileName(Id.second));
       Asm->EOL("Source");
       Asm->EmitULEB128Bytes(Id.first);
@@ -2520,7 +2507,7 @@ private:
           Asm->EOL();
         else {
           std::pair<unsigned, unsigned> SourceID =
-            getSourceDirsectoryAndFileIds(LineInfo.getSourceID());
+            getSourceDirectoryAndFileIds(LineInfo.getSourceID());
           O << '\t' << TAI->getCommentString() << ' '
             << getSourceDirectoryName(SourceID.first) << ' '
             << getSourceFileName(SourceID.second)
@@ -2792,10 +2779,48 @@ private:
     }
   }
 
+  /// GetOrCreateSourceID - Look up the source id with the given directory and
+  /// source file names. If none currently exists, create a new id and insert it
+  /// in the SourceIds map. This can update DirectoryNames and SourceFileNames maps
+  /// as well.
+  unsigned GetOrCreateSourceID(const std::string &DirName,
+                               const std::string &FileName) {
+    unsigned DId;
+    StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
+    if (DI != DirectoryIdMap.end()) {
+      DId = DI->getValue();
+    } else {
+      DId = DirectoryNames.size() + 1;
+      DirectoryIdMap[DirName] = DId;
+      DirectoryNames.push_back(DirName);
+    }
+  
+    unsigned FId;
+    StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
+    if (FI != SourceFileIdMap.end()) {
+      FId = FI->getValue();
+    } else {
+      FId = SourceFileNames.size() + 1;
+      SourceFileIdMap[FileName] = FId;
+      SourceFileNames.push_back(FileName);
+    }
+
+    DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
+      SourceIdMap.find(std::make_pair(DId, FId));
+    if (SI != SourceIdMap.end())
+      return SI->second;
+
+    unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
+    SourceIdMap[std::make_pair(DId, FId)] = SrcId;
+    SourceIds.push_back(std::make_pair(DId, FId));
+
+    return SrcId;
+  }
+
   void ConstructCompileUnit(GlobalVariable *GV) {
     DICompileUnit DIUnit(GV);
     std::string Dir, FN, Prod;
-    unsigned ID = getOrCreateSourceID(DIUnit.getDirectory(Dir),
+    unsigned ID = GetOrCreateSourceID(DIUnit.getDirectory(Dir),
                                       DIUnit.getFilename(FN));
 
     DIE *Die = new DIE(DW_TAG_compile_unit);
@@ -2964,7 +2989,7 @@ public:
       RootDbgScope(0), DebugTimer(0) {
     if (TimePassesIsEnabled)
       DebugTimer = new Timer("Dwarf Debug Writer",
-                             *getDwarfTimerGroup());
+                             getDwarfTimerGroup());
   }
   virtual ~DwarfDebug() {
     for (unsigned j = 0, M = Values.size(); j < M; ++j)
@@ -2973,6 +2998,10 @@ public:
     delete DebugTimer;
   }
 
+  /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should
+  /// be emitted.
+  bool ShouldEmitDwarfDebug() const { return shouldEmit; }
+
   /// SetDebugInfo - Create global DIEs and emit initial debug info sections.
   /// This is inovked by the target AsmPrinter.
   void SetDebugInfo(MachineModuleInfo *mmi) {
@@ -2984,7 +3013,7 @@ public:
       
     if (CompileUnits.empty()) {
       if (TimePassesIsEnabled)
-        DebugTimer->startTimer();
+        DebugTimer->stopTimer();
 
       return;
     }
@@ -2999,7 +3028,7 @@ public:
     // and any subprograms then there is not any debug info to emit.
     if (!globalDIEs && !subprogramDIEs) {
       if (TimePassesIsEnabled)
-        DebugTimer->startTimer();
+        DebugTimer->stopTimer();
 
       return;
     }
@@ -3016,7 +3045,7 @@ public:
     if (TAI->hasDotLocAndDotFile()) {
       for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
         // Remember source id starts at 1.
-        std::pair<unsigned, unsigned> Id = getSourceDirsectoryAndFileIds(i);
+        std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
         sys::Path FullPath(getSourceDirectoryName(Id.first));
         bool AppendOk =
           FullPath.appendComponent(getSourceFileName(Id.second));
@@ -3106,13 +3135,13 @@ public:
   /// BeginFunction - Gather pre-function debug information.  Assumes being
   /// emitted immediately after the function entry point.
   void BeginFunction(MachineFunction *MF) {
+    this->MF = MF;
+
     if (!ShouldEmitDwarfDebug()) return;
 
     if (TimePassesIsEnabled)
       DebugTimer->startTimer();
 
-    this->MF = MF;
-
     // Begin accumulating function debug information.
     MMI->BeginFunction(MF);
 
@@ -3266,89 +3295,23 @@ public:
     return ID;
   }
 
-  unsigned getRecordSourceLineCount() {
+  /// getRecordSourceLineCount - Return the number of source lines in the debug
+  /// info.
+  unsigned getRecordSourceLineCount() const {
     return Lines.size();
   }
                             
-  /// getNumSourceDirectories - Return the number of source directories in the
-  /// debug info.
-  unsigned getNumSourceDirectories() const {
-    return DirectoryNames.size();
-  }
-
-  /// getSourceDirectoryName - Return the name of the directory corresponding
-  /// to the id.
-  const std::string &getSourceDirectoryName(unsigned Id) const {
-    return DirectoryNames[Id - 1];
-  }
-
-  /// getNumSourceFiles - Return the number of source files in the debug info.
-  ///
-  unsigned getNumSourceFiles() const {
-    return SourceFileNames.size();
-  }
-
-  /// getSourceFileName - Return the name of the source file corresponding
-  /// to the id.
-  const std::string &getSourceFileName(unsigned Id) const {
-    return SourceFileNames[Id - 1];
-  }
-
-  /// getNumSourceIds - Return the number of unique source ids.
-  ///
-  unsigned getNumSourceIds() const {
-    return SourceIds.size();
-  }
-
-  /// getSourceDirsectoryAndFileIds - Return the directory and file ids that
-  /// maps to the source id. Source id starts at 1.
-  std::pair<unsigned, unsigned>
-  getSourceDirsectoryAndFileIds(unsigned SId) const {
-    return SourceIds[SId-1];
-  }
-
-  /// getOrCreateSourceID - Look up the source id with the given directory and
-  /// source file names. If none currently exists, create a new id and insert it
-  /// in the SourceIds map. This can update DirectoryNames and SourceFileNames maps
-  /// as well.
+  /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
+  /// timed. Look up the source id with the given directory and source file
+  /// names. If none currently exists, create a new id and insert it in the
+  /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
+  /// well.
   unsigned getOrCreateSourceID(const std::string &DirName,
                                const std::string &FileName) {
     if (TimePassesIsEnabled)
       DebugTimer->startTimer();
 
-    unsigned DId;
-    StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
-    if (DI != DirectoryIdMap.end()) {
-      DId = DI->getValue();
-    } else {
-      DId = DirectoryNames.size() + 1;
-      DirectoryIdMap[DirName] = DId;
-      DirectoryNames.push_back(DirName);
-    }
-  
-    unsigned FId;
-    StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
-    if (FI != SourceFileIdMap.end()) {
-      FId = FI->getValue();
-    } else {
-      FId = SourceFileNames.size() + 1;
-      SourceFileIdMap[FileName] = FId;
-      SourceFileNames.push_back(FileName);
-    }
-
-    DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
-      SourceIdMap.find(std::make_pair(DId, FId));
-
-    if (SI != SourceIdMap.end()) {
-      if (TimePassesIsEnabled)
-        DebugTimer->stopTimer();
-
-      return SI->second;
-    }
-
-    unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
-    SourceIdMap[std::make_pair(DId, FId)] = SrcId;
-    SourceIds.push_back(std::make_pair(DId, FId));
+    unsigned SrcId = GetOrCreateSourceID(DirName, FileName);
 
     if (TimePassesIsEnabled)
       DebugTimer->stopTimer();
@@ -3357,7 +3320,6 @@ public:
   }
 
   /// RecordRegionStart - Indicate the start of a region.
-  ///
   unsigned RecordRegionStart(GlobalVariable *V) {
     if (TimePassesIsEnabled)
       DebugTimer->startTimer();
@@ -3373,7 +3335,6 @@ public:
   }
 
   /// RecordRegionEnd - Indicate the end of a region.
-  ///
   unsigned RecordRegionEnd(GlobalVariable *V) {
     if (TimePassesIsEnabled)
       DebugTimer->startTimer();
@@ -3389,7 +3350,6 @@ public:
   }
 
   /// RecordVariable - Indicate the declaration of  a local variable.
-  ///
   void RecordVariable(GlobalVariable *GV, unsigned FrameIndex) {
     if (TimePassesIsEnabled)
       DebugTimer->startTimer();
@@ -4075,7 +4035,7 @@ public:
     ExceptionTimer(0) {
     if (TimePassesIsEnabled) 
       ExceptionTimer = new Timer("Dwarf Exception Writer",
-                                 *getDwarfTimerGroup());
+                                 getDwarfTimerGroup());
   }
 
   virtual ~DwarfException() {
@@ -4281,7 +4241,7 @@ unsigned DIEInteger::SizeOf(const DwarfDebug &DD, unsigned Form) const {
 /// EmitValue - Emit string value.
 ///
 void DIEString::EmitValue(DwarfDebug &DD, unsigned Form) {
-  DD.getAsm()->EmitString(String);
+  DD.getAsm()->EmitString(Str);
 }
 
 //===----------------------------------------------------------------------===//
@@ -4498,7 +4458,6 @@ DwarfWriter::DwarfWriter()
 DwarfWriter::~DwarfWriter() {
   delete DE;
   delete DD;
-  delete DwarfTimerGroup; DwarfTimerGroup = 0;
 }
 
 /// BeginModule - Emit all Dwarf sections that should come prior to the