[llvm] r196615 - DebugInfo: Include the section and start-of-section label in the unit

David Blaikie dblaikie at gmail.com
Fri Dec 6 14:14:49 PST 2013


Author: dblaikie
Date: Fri Dec  6 16:14:48 2013
New Revision: 196615

URL: http://llvm.org/viewvc/llvm-project?rev=196615&view=rev
Log:
DebugInfo: Include the section and start-of-section label in the unit

This is a precursor to moving type units into the correct (debug_types)
section with comdat groups and full type unit headers.

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=196615&r1=196614&r2=196615&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Fri Dec  6 16:14:48 2013
@@ -818,6 +818,15 @@ CompileUnit *DwarfDebug::constructCompil
   if (!FirstCU)
     FirstCU = NewCU;
 
+  NewCU->initSection(
+      useSplitDwarf() ? Asm->getObjFileLowering().getDwarfInfoDWOSection()
+                      : Asm->getObjFileLowering().getDwarfInfoSection(),
+      // FIXME: This is subtle (using the info section even when
+      // this CU is in the dwo section) and necessary for the
+      // current arange code - ideally it should iterate
+      // skeleton units, not full units, if it's going to reference skeletons
+      DwarfInfoSectionSym);
+
   CUMap.insert(std::make_pair(DIUnit, NewCU));
   CUDieMap.insert(std::make_pair(Die, NewCU));
   return NewCU;
@@ -2064,11 +2073,11 @@ void DwarfDebug::emitDIE(DIE *Die) {
         assert(CU && "CUDie should belong to a CU.");
         Addr += CU->getDebugInfoOffset();
         if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
-          Asm->EmitLabelPlusOffset(DwarfInfoSectionSym, Addr,
+          Asm->EmitLabelPlusOffset(CU->getSectionSym(), Addr,
                                    DIEEntry::getRefAddrSize(Asm));
         else
-          Asm->EmitLabelOffsetDifference(DwarfInfoSectionSym, Addr,
-                                         DwarfInfoSectionSym,
+          Asm->EmitLabelOffsetDifference(CU->getSectionSym(), Addr,
+                                         CU->getSectionSym(),
                                          DIEEntry::getRefAddrSize(Asm));
       } else {
         // Make sure Origin belong to the same CU.
@@ -2118,14 +2127,14 @@ void DwarfDebug::emitDIE(DIE *Die) {
 
 // Emit the various dwarf units to the unit section USection with
 // the abbreviations going into ASection.
-void DwarfFile::emitUnits(DwarfDebug *DD, const MCSection *USection,
-                           const MCSection *ASection,
-                           const MCSymbol *ASectionSym) {
-  Asm->OutStreamer.SwitchSection(USection);
+void DwarfFile::emitUnits(DwarfDebug *DD, const MCSection *ASection,
+                          const MCSymbol *ASectionSym) {
   for (SmallVectorImpl<Unit *>::iterator I = CUs.begin(), E = CUs.end(); I != E;
        ++I) {
     Unit *TheU = *I;
     DIE *Die = TheU->getUnitDie();
+    const MCSection *USection = TheU->getSection();
+    Asm->OutStreamer.SwitchSection(USection);
 
     // Emit the compile units header.
     Asm->OutStreamer.EmitLabel(
@@ -2147,8 +2156,7 @@ void DwarfFile::emitUnits(DwarfDebug *DD
 void DwarfDebug::emitDebugInfo() {
   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
 
-  Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
-                   Asm->getObjFileLowering().getDwarfAbbrevSection(),
+  Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfAbbrevSection(),
                    DwarfAbbrevSectionSym);
 }
 
@@ -2437,7 +2445,7 @@ void DwarfDebug::emitDebugPubNames(bool
 
     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
     Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
-                           DwarfInfoSectionSym);
+                           TheU->getSectionSym());
 
     Asm->OutStreamer.AddComment("Compilation Unit Length");
     Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
@@ -2506,7 +2514,7 @@ void DwarfDebug::emitDebugPubTypes(bool
     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
     Asm->EmitSectionOffset(
         Asm->GetTempSymbol(ISec->getLabelBeginName(), TheU->getUniqueID()),
-        DwarfInfoSectionSym);
+        TheU->getSectionSym());
 
     Asm->OutStreamer.AddComment("Compilation Unit Length");
     Asm->EmitLabelDifference(
@@ -2860,7 +2868,7 @@ void DwarfDebug::emitDebugARanges() {
     Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
     Asm->EmitSectionOffset(
         Asm->GetTempSymbol(ISec->getLabelBeginName(), CU->getUniqueID()),
-        DwarfInfoSectionSym);
+        CU->getSectionSym());
     Asm->OutStreamer.AddComment("Address Size (in bytes)");
     Asm->EmitInt8(PtrSize);
     Asm->OutStreamer.AddComment("Segment Size (in bytes)");
@@ -3001,6 +3009,8 @@ CompileUnit *DwarfDebug::constructSkelet
                     Asm->GetTempSymbol("gnu_ranges", NewCU->getUniqueID()),
                     DwarfDebugRangeSectionSym);
 
+  NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
+                     DwarfInfoSectionSym);
   SkeletonHolder.addUnit(NewCU);
 
   return NewCU;
@@ -3010,7 +3020,7 @@ CompileUnit *DwarfDebug::constructSkelet
 // compile units that would normally be in debug_info.
 void DwarfDebug::emitDebugInfoDWO() {
   assert(useSplitDwarf() && "No split dwarf debug info?");
-  InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
+  InfoHolder.emitUnits(this,
                        Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
                        DwarfAbbrevDWOSectionSym);
 }
@@ -3079,6 +3089,15 @@ void DwarfDebug::addTypeUnitType(uint16_
     // Remove the References vector and add the type hash.
     I->second.first = Signature;
     I->second.second = NULL;
+
+    NewTU->initSection(
+        useSplitDwarf() ? Asm->getObjFileLowering().getDwarfInfoDWOSection()
+                        : Asm->getObjFileLowering().getDwarfInfoSection(),
+        // FIXME: This is subtle (using the info section even when
+        // this CU is in the dwo section) and necessary for the
+        // current arange code - ideally it should iterate
+        // skeleton units, not full units, if it's going to reference skeletons
+        useSplitDwarf() ? NULL : DwarfInfoSectionSym);
   }
 
   // Populate all the signatures.

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=196615&r1=196614&r2=196615&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Fri Dec  6 16:14:48 2013
@@ -274,8 +274,8 @@ public:
 
   /// \brief Emit all of the units to the section listed with the given
   /// abbreviation section.
-  void emitUnits(DwarfDebug *DD, const MCSection *USection,
-                 const MCSection *ASection, const MCSymbol *ASectionSym);
+  void emitUnits(DwarfDebug *DD, const MCSection *ASection,
+                 const MCSymbol *ASectionSym);
 
   /// \brief Emit a set of abbreviations to the specific section.
   void emitAbbrevs(const MCSection *);

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=196615&r1=196614&r2=196615&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Fri Dec  6 16:14:48 2013
@@ -41,7 +41,7 @@ static cl::opt<bool> GenerateTypeUnits("
 Unit::Unit(unsigned UID, DIE *D, DICompileUnit Node, AsmPrinter *A,
            DwarfDebug *DW, DwarfFile *DWU)
     : UniqueID(UID), Node(Node), UnitDie(D), DebugInfoOffset(0), Asm(A), DD(DW),
-      DU(DWU), IndexTyDie(0) {
+      DU(DWU), IndexTyDie(0), Section(0) {
   DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
 }
 

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h?rev=196615&r1=196614&r2=196615&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Fri Dec  6 16:14:48 2013
@@ -127,12 +127,36 @@ protected:
   // DIEIntegerOne - A preallocated DIEValue because 1 is used frequently.
   DIEInteger *DIEIntegerOne;
 
+  /// The section this unit will be emitted in.
+  const MCSection *Section;
+
+  /// A label at the start of the non-dwo section related to this unit.
+  MCSymbol *SectionSym;
+
   Unit(unsigned UID, DIE *D, DICompileUnit CU, AsmPrinter *A, DwarfDebug *DW,
        DwarfFile *DWU);
 
 public:
   virtual ~Unit();
 
+  /// Pass in the SectionSym even though we could recreate it in every compile
+  /// unit (type units will have actually distinct symbols once they're in
+  /// comdat sections).
+  void initSection(const MCSection *Section, MCSymbol *SectionSym) {
+    assert(!this->Section);
+    this->Section = Section;
+    this->SectionSym = SectionSym;
+  }
+  const MCSection *getSection() const {
+    assert(Section);
+    return Section;
+  }
+
+  MCSymbol *getSectionSym() {
+    assert(Section);
+    return SectionSym;
+  }
+
   // Accessors.
   unsigned getUniqueID() const { return UniqueID; }
   virtual uint16_t getLanguage() const = 0;





More information about the llvm-commits mailing list