Add DebugInfo based APIs to record source line info.
authorDevang Patel <dpatel@apple.com>
Thu, 8 Jan 2009 17:19:22 +0000 (17:19 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 8 Jan 2009 17:19:22 +0000 (17:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61928 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DwarfWriter.cpp

index c1360a94328589004fb9932749a89999b2525b87..16d1531a47f89d3d573f92872e566415d0f9f940 100644 (file)
@@ -1165,6 +1165,26 @@ public:
 
 };
 
+//===----------------------------------------------------------------------===//
+/// SourceLineInfo - This class is used to record source line correspondence.
+///
+class SrcLineInfo {
+  unsigned Line;                        // Source line number.
+  unsigned Column;                      // Source column.
+  unsigned SourceID;                    // Source ID number.
+  unsigned LabelID;                     // Label in code ID number.
+public:
+  SrcLineInfo(unsigned L, unsigned C, unsigned S, unsigned I)
+  : Line(L), Column(C), SourceID(S), LabelID(I) {}
+  
+  // Accessors
+  unsigned getLine()     const { return Line; }
+  unsigned getColumn()   const { return Column; }
+  unsigned getSourceID() const { return SourceID; }
+  unsigned getLabelID()  const { return LabelID; }
+};
+
+
 //===----------------------------------------------------------------------===//
 /// SrcFileInfo - This class is used to track source information.
 ///
@@ -1259,7 +1279,7 @@ private:
   /// CompileUnits - All the compile units involved in this build.  The index
   /// of each entry in this vector corresponds to the sources in MMI.
   std::vector<CompileUnit *> CompileUnits;
-  DenseMap<GlobalVariable *, CompileUnit *> DW_CUs;
+  DenseMap<Value *, CompileUnit *> DW_CUs;
 
   /// AbbreviationsSet - Used to uniquely define abbreviations.
   ///
@@ -1277,6 +1297,9 @@ private:
   // SourceFiles - Uniquing vector for source files.                                      
   UniqueVector<SrcFileInfo> SrcFiles;
 
+  // Lines - List of of source line correspondence.
+  std::vector<SrcLineInfo> Lines;
+
   FoldingSet<DIEValue> ValuesSet;
 
   /// Values - A list of all the unique values in use.
@@ -2539,6 +2562,23 @@ private:
     return VariableDie;
   }
 
+  unsigned RecordSourceLine(Value *V, unsigned Line, unsigned Col) {
+    CompileUnit *Unit = DW_CUs[V];
+    assert (Unit && "Unable to find CompileUnit");
+    unsigned ID = NextLabelID();
+    Lines.push_back(SrcLineInfo(Line, Col, Unit->getID(), ID));
+    return ID;
+  }
+  
+  unsigned getRecordSourceLineCount() {
+    return Lines.size();
+  }
+                            
+  unsigned RecordSource(const std::string &Directory,
+                        const std::string &File) {
+    unsigned DID = Directories.insert(Directory);
+    return SrcFiles.insert(SrcFileInfo(DID,File));
+  }
 
   /// RecordRegionStart - Indicate the start of a region.
   ///
@@ -3447,9 +3487,8 @@ private:
     for (std::vector<GlobalVariable *>::iterator RI = Result.begin(),
            RE = Result.end(); RI != RE; ++RI) {
       DICompileUnit *DIUnit = new DICompileUnit(*RI);
-      unsigned DID = Directories.insert(DIUnit->getDirectory());
-      unsigned ID = SrcFiles.insert(SrcFileInfo(DID,
-                                                DIUnit->getFilename()));
+      unsigned ID = RecordSource(DIUnit->getDirectory(),
+                                 DIUnit->getFilename());
 
       DIE *Die = new DIE(DW_TAG_compile_unit);
       AddSectionOffset(Die, DW_AT_stmt_list, DW_FORM_data4,