From 03073f747e1832801a0435e5d707a924932b93a9 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 6 Dec 2013 22:14:48 +0000 Subject: [PATCH] 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. llvm-svn: 196615 --- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 45 +++++++++++++++------- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 4 +- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 2 +- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h | 24 ++++++++++++ 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index f7723007e17e..d92258ce1d88 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -818,6 +818,15 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICompileUnit DIUnit) { 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::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, const MCSection *USection, 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 GnuStyle) { 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 GnuStyle) { 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::constructSkeletonCU(const CompileUnit *CU) { Asm->GetTempSymbol("gnu_ranges", NewCU->getUniqueID()), DwarfDebugRangeSectionSym); + NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoSection(), + DwarfInfoSectionSym); SkeletonHolder.addUnit(NewCU); return NewCU; @@ -3010,7 +3020,7 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) { // 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_t Language, DIE *RefDie, // 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. diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 567301dab647..30235661de13 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -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 *); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 8760335bcff9..40b7476f4bd2 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -41,7 +41,7 @@ static cl::opt GenerateTypeUnits("generate-type-units", cl::Hidden, 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); } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h index ed44a10cf3b1..852b4c3cc5a9 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -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;