From 103d7fdb21717d9bcd590a034d447138bef0fe33 Mon Sep 17 00:00:00 2001 From: Alexander Yermolovich Date: Tue, 17 Oct 2023 16:40:59 -0700 Subject: [PATCH 1/4] [LLVM[NFC] Refactor to allow debug_names entries to conatain DIE offset This is pre-cursor patch to enabling type units with DWARF5 acceleration tables. With this change it allows for entries to contain offsets directly, this way type units do not need to be preserved until .debug_names is written out. --- llvm/include/llvm/CodeGen/AccelTable.h | 21 ++++++++++++------ llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp | 25 ++++++++++++++++++++-- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 6 ++++-- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/llvm/include/llvm/CodeGen/AccelTable.h b/llvm/include/llvm/CodeGen/AccelTable.h index d521b31e3d16a..d4bfd7d821c49 100644 --- a/llvm/include/llvm/CodeGen/AccelTable.h +++ b/llvm/include/llvm/CodeGen/AccelTable.h @@ -252,20 +252,27 @@ class DWARF5AccelTableData : public AccelTableData { public: static uint32_t hash(StringRef Name) { return caseFoldingDjbHash(Name); } - DWARF5AccelTableData(const DIE &Die) : Die(Die) {} + DWARF5AccelTableData(const DIE &Die, const DwarfCompileUnit &CU); #ifndef NDEBUG void print(raw_ostream &OS) const override; #endif - const DIE &getDie() const { return Die; } - uint64_t getDieOffset() const { return Die.getOffset(); } - unsigned getDieTag() const { return Die.getTag(); } + uint64_t getDieOffset() const { + if (const DIE *const *TDie = std::get_if(&OffsetVal)) + return (*TDie)->getOffset(); + return std::get(OffsetVal); + } + unsigned getDieTag() const { return Tag; } + unsigned getUnitID() const { return UnitID; } + void normalizeDIEToOffset() { OffsetVal = getDieOffset(); } protected: - const DIE &Die; + std::variant OffsetVal; + dwarf::Tag Tag; + unsigned UnitID; - uint64_t order() const override { return Die.getOffset(); } + uint64_t order() const override { return getDieOffset(); } }; class DWARF5AccelTableStaticData : public AccelTableData { @@ -283,6 +290,8 @@ class DWARF5AccelTableStaticData : public AccelTableData { uint64_t getDieOffset() const { return DieOffset; } unsigned getDieTag() const { return DieTag; } unsigned getCUIndex() const { return CUIndex; } + void normalizeDIEToOffset() { /* Not needed since DIE is not used. */ + } protected: uint64_t DieOffset; diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index 88d5487427774..d30ca1ea7d1dc 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -219,6 +219,10 @@ class Dwarf5AccelTableWriter : public AccelTableWriter { MCSymbol *AbbrevEnd = Asm->createTempSymbol("names_abbrev_end"); MCSymbol *EntryPool = Asm->createTempSymbol("names_entries"); + /// Iterates over all the entries and if it contains a DIE replaces it with an + /// offset. + void normalizeOffsets(); + DenseSet getUniqueTags() const; // Right now, we emit uniform attributes for all tags. @@ -357,6 +361,13 @@ void AppleAccelTableWriter::emit() const { emitData(); } +DWARF5AccelTableData::DWARF5AccelTableData(const DIE &Die, + const DwarfCompileUnit &CU) + : OffsetVal(&Die) { + Tag = Die.getTag(); + UnitID = CU.getUniqueID(); +} + template void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) { assert(CompUnitCount > 0 && "Index must have at least one CU."); @@ -387,6 +398,16 @@ void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) { Asm->OutStreamer->emitBytes({AugmentationString, AugmentationStringSize}); } +template +void Dwarf5AccelTableWriter::normalizeOffsets() { + for (auto &Bucket : Contents.getBuckets()) { + for (auto *Hash : Bucket) { + for (auto *Value : Hash->Values) { + static_cast(Value)->normalizeDIEToOffset(); + } + } + } +} template DenseSet Dwarf5AccelTableWriter::getUniqueTags() const { DenseSet UniqueTags; @@ -516,6 +537,7 @@ Dwarf5AccelTableWriter::Dwarf5AccelTableWriter( Header(CompUnits.size(), Contents.getBucketCount(), Contents.getUniqueNameCount()), CompUnits(CompUnits), getCUIndexForEntry(std::move(getCUIndexForEntry)) { + normalizeOffsets(); DenseSet UniqueTags = getUniqueTags(); SmallVector UniformAttributes = getUniformAttributes(); @@ -575,8 +597,7 @@ void llvm::emitDWARF5AccelTable( Dwarf5AccelTableWriter( Asm, Contents, CompUnits, [&](const DWARF5AccelTableData &Entry) { - const DIE *CUDie = Entry.getDie().getUnitDie(); - return CUIndex[DD.lookupCU(CUDie)->getUniqueID()]; + return CUIndex[Entry.getUnitID()]; }) .emit(); } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index ee2ab71ad28e4..80af8a8d79e2a 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -3547,9 +3547,11 @@ void DwarfDebug::addAccelNameImpl(const DICompileUnit &CU, case AccelTableKind::Apple: AppleAccel.addName(Ref, Die); break; - case AccelTableKind::Dwarf: - AccelDebugNames.addName(Ref, Die); + case AccelTableKind::Dwarf: { + DwarfCompileUnit *CU = lookupCU(Die.getUnitDie()); + AccelDebugNames.addName(Ref, Die, *CU); break; + } case AccelTableKind::Default: llvm_unreachable("Default should have already been resolved."); case AccelTableKind::None: From 06ae74e7d76cb86ad8ba83e0fcce203754d4e3e0 Mon Sep 17 00:00:00 2001 From: Alexander Yermolovich Date: Thu, 19 Oct 2023 17:58:08 -0700 Subject: [PATCH 2/4] fixup! [LLVM[NFC] Refactor to allow debug_names entries to conatain DIE offset --- llvm/include/llvm/CodeGen/AccelTable.h | 11 ++++++++--- llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp | 15 --------------- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 12 ++++++++++++ llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 4 ++++ 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/llvm/include/llvm/CodeGen/AccelTable.h b/llvm/include/llvm/CodeGen/AccelTable.h index d4bfd7d821c49..d5563cb437571 100644 --- a/llvm/include/llvm/CodeGen/AccelTable.h +++ b/llvm/include/llvm/CodeGen/AccelTable.h @@ -176,6 +176,7 @@ class AccelTableBase { uint32_t getBucketCount() const { return BucketCount; } uint32_t getUniqueHashCount() const { return UniqueHashCount; } uint32_t getUniqueNameCount() const { return Entries.size(); } + StringEntries &getEntries() { return Entries; } #ifndef NDEBUG void print(raw_ostream &OS) const; @@ -259,13 +260,17 @@ class DWARF5AccelTableData : public AccelTableData { #endif uint64_t getDieOffset() const { - if (const DIE *const *TDie = std::get_if(&OffsetVal)) - return (*TDie)->getOffset(); + assert(std::holds_alternative(OffsetVal) && + "Accessing DIE Offset before normalizing."); return std::get(OffsetVal); } unsigned getDieTag() const { return Tag; } unsigned getUnitID() const { return UnitID; } - void normalizeDIEToOffset() { OffsetVal = getDieOffset(); } + void normalizeDIEToOffset() { + assert(std::holds_alternative(OffsetVal) && + "Accessing offset after normalizing."); + OffsetVal = std::get(OffsetVal)->getOffset(); + } protected: std::variant OffsetVal; diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index d30ca1ea7d1dc..3360ea09042b9 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -219,10 +219,6 @@ class Dwarf5AccelTableWriter : public AccelTableWriter { MCSymbol *AbbrevEnd = Asm->createTempSymbol("names_abbrev_end"); MCSymbol *EntryPool = Asm->createTempSymbol("names_entries"); - /// Iterates over all the entries and if it contains a DIE replaces it with an - /// offset. - void normalizeOffsets(); - DenseSet getUniqueTags() const; // Right now, we emit uniform attributes for all tags. @@ -398,16 +394,6 @@ void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) { Asm->OutStreamer->emitBytes({AugmentationString, AugmentationStringSize}); } -template -void Dwarf5AccelTableWriter::normalizeOffsets() { - for (auto &Bucket : Contents.getBuckets()) { - for (auto *Hash : Bucket) { - for (auto *Value : Hash->Values) { - static_cast(Value)->normalizeDIEToOffset(); - } - } - } -} template DenseSet Dwarf5AccelTableWriter::getUniqueTags() const { DenseSet UniqueTags; @@ -537,7 +523,6 @@ Dwarf5AccelTableWriter::Dwarf5AccelTableWriter( Header(CompUnits.size(), Contents.getBucketCount(), Contents.getUniqueNameCount()), CompUnits(CompUnits), getCUIndexForEntry(std::move(getCUIndexForEntry)) { - normalizeOffsets(); DenseSet UniqueTags = getUniqueTags(); SmallVector UniformAttributes = getUniformAttributes(); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 80af8a8d79e2a..277428a2cdc8e 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1246,6 +1246,14 @@ void DwarfDebug::finishSubprogramDefinitions() { } } +void DwarfDebug::finalizeAccelerationTables() { + for (auto &Entry : AccelDebugNames.getEntries()) { + for (AccelTableData *Value : Entry.second.Values) { + static_cast(Value)->normalizeDIEToOffset(); + } + } +} + void DwarfDebug::finalizeModuleInfo() { const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); @@ -1389,6 +1397,10 @@ void DwarfDebug::finalizeModuleInfo() { InfoHolder.computeSizeAndOffsets(); if (useSplitDwarf()) SkeletonHolder.computeSizeAndOffsets(); + + // Now that offsets are computed, can replace DIEs in debug_names Entry with + // an actual offset. + finalizeAccelerationTables(); } // Emit all Dwarf sections that should come after the content. diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 75649a747602e..695bbdafc17fc 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -542,6 +542,10 @@ class DwarfDebug : public DebugHandlerBase { void finishSubprogramDefinitions(); + /// Finalizes DWARF acceleration tables. + /// Currently it converts DIE entries to offsets in .debu_names entry. + void finalizeAccelerationTables(); + /// Finish off debug information after all functions have been /// processed. void finalizeModuleInfo(); From b3b4cb1833dba375ff1f5fb009b426d23a530836 Mon Sep 17 00:00:00 2001 From: Alexander Yermolovich Date: Fri, 20 Oct 2023 17:05:12 -0700 Subject: [PATCH 3/4] fixup! fixup! [LLVM[NFC] Refactor to allow debug_names entries to conatain DIE offset --- llvm/include/llvm/CodeGen/AccelTable.h | 39 +++++-------------- llvm/include/llvm/DWARFLinker/DWARFLinker.h | 5 +-- llvm/include/llvm/DWARFLinker/DWARFStreamer.h | 2 +- llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp | 19 ++++----- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 7 +++- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 6 +-- llvm/lib/DWARFLinker/DWARFStreamer.cpp | 12 +++--- .../DWARFLinkerParallel/DWARFEmitterImpl.cpp | 10 ++--- .../DWARFLinkerParallel/DWARFEmitterImpl.h | 2 +- .../DWARFLinkerParallel/DWARFLinkerImpl.cpp | 4 +- 10 files changed, 38 insertions(+), 68 deletions(-) diff --git a/llvm/include/llvm/CodeGen/AccelTable.h b/llvm/include/llvm/CodeGen/AccelTable.h index d5563cb437571..d7604100de47a 100644 --- a/llvm/include/llvm/CodeGen/AccelTable.h +++ b/llvm/include/llvm/CodeGen/AccelTable.h @@ -176,7 +176,6 @@ class AccelTableBase { uint32_t getBucketCount() const { return BucketCount; } uint32_t getUniqueHashCount() const { return UniqueHashCount; } uint32_t getUniqueNameCount() const { return Entries.size(); } - StringEntries &getEntries() { return Entries; } #ifndef NDEBUG void print(raw_ostream &OS) const; @@ -254,6 +253,8 @@ class DWARF5AccelTableData : public AccelTableData { static uint32_t hash(StringRef Name) { return caseFoldingDjbHash(Name); } DWARF5AccelTableData(const DIE &Die, const DwarfCompileUnit &CU); + DWARF5AccelTableData(uint64_t DieOffset, unsigned DieTag, unsigned CUIndex) + : OffsetVal(DieOffset), DieTag(DieTag), UnitID(CUIndex) {} #ifndef NDEBUG void print(raw_ostream &OS) const override; @@ -264,7 +265,7 @@ class DWARF5AccelTableData : public AccelTableData { "Accessing DIE Offset before normalizing."); return std::get(OffsetVal); } - unsigned getDieTag() const { return Tag; } + unsigned getDieTag() const { return DieTag; } unsigned getUnitID() const { return UnitID; } void normalizeDIEToOffset() { assert(std::holds_alternative(OffsetVal) && @@ -274,36 +275,15 @@ class DWARF5AccelTableData : public AccelTableData { protected: std::variant OffsetVal; - dwarf::Tag Tag; + unsigned DieTag; unsigned UnitID; uint64_t order() const override { return getDieOffset(); } }; -class DWARF5AccelTableStaticData : public AccelTableData { +class DWARF5AccelTable : public AccelTable { public: - static uint32_t hash(StringRef Name) { return caseFoldingDjbHash(Name); } - - DWARF5AccelTableStaticData(uint64_t DieOffset, unsigned DieTag, - unsigned CUIndex) - : DieOffset(DieOffset), DieTag(DieTag), CUIndex(CUIndex) {} - -#ifndef NDEBUG - void print(raw_ostream &OS) const override; -#endif - - uint64_t getDieOffset() const { return DieOffset; } - unsigned getDieTag() const { return DieTag; } - unsigned getCUIndex() const { return CUIndex; } - void normalizeDIEToOffset() { /* Not needed since DIE is not used. */ - } - -protected: - uint64_t DieOffset; - unsigned DieTag; - unsigned CUIndex; - - uint64_t order() const override { return DieOffset; } + StringEntries &getEntries() { return Entries; } }; void emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents, @@ -320,8 +300,7 @@ void emitAppleAccelTable(AsmPrinter *Asm, AccelTable &Contents, emitAppleAccelTableImpl(Asm, Contents, Prefix, SecBegin, DataT::Atoms); } -void emitDWARF5AccelTable(AsmPrinter *Asm, - AccelTable &Contents, +void emitDWARF5AccelTable(AsmPrinter *Asm, DWARF5AccelTable &Contents, const DwarfDebug &DD, ArrayRef> CUs); @@ -330,9 +309,9 @@ void emitDWARF5AccelTable(AsmPrinter *Asm, /// start of compilation unit, either offsets to the start of compilation /// unit themselves. void emitDWARF5AccelTable( - AsmPrinter *Asm, AccelTable &Contents, + AsmPrinter *Asm, DWARF5AccelTable &Contents, ArrayRef> CUs, - llvm::function_ref + llvm::function_ref getCUIndexForEntry); /// Accelerator table data implementation for simple Apple accelerator tables diff --git a/llvm/include/llvm/DWARFLinker/DWARFLinker.h b/llvm/include/llvm/DWARFLinker/DWARFLinker.h index e5797514165a2..6887e441ce8ff 100644 --- a/llvm/include/llvm/DWARFLinker/DWARFLinker.h +++ b/llvm/include/llvm/DWARFLinker/DWARFLinker.h @@ -119,8 +119,7 @@ class DwarfEmitter { virtual void emitLineStrings(const NonRelocatableStringpool &Pool) = 0; /// Emit DWARF debug names. - virtual void - emitDebugNames(AccelTable &Table) = 0; + virtual void emitDebugNames(DWARF5AccelTable &Table) = 0; /// Emit Apple namespaces accelerator table. virtual void @@ -880,7 +879,7 @@ class DWARFLinker { uint32_t LastCIEOffset = 0; /// Apple accelerator tables. - AccelTable DebugNames; + DWARF5AccelTable DebugNames; AccelTable AppleNames; AccelTable AppleNamespaces; AccelTable AppleObjc; diff --git a/llvm/include/llvm/DWARFLinker/DWARFStreamer.h b/llvm/include/llvm/DWARFLinker/DWARFStreamer.h index 63e4b28a8d2c9..18eb7277bfa2d 100644 --- a/llvm/include/llvm/DWARFLinker/DWARFStreamer.h +++ b/llvm/include/llvm/DWARFLinker/DWARFStreamer.h @@ -163,7 +163,7 @@ class DwarfStreamer : public DwarfEmitter { StringRef Bytes) override; /// Emit DWARF debug names. - void emitDebugNames(AccelTable &Table) override; + void emitDebugNames(DWARF5AccelTable &Table) override; /// Emit Apple namespaces accelerator table. void emitAppleNamespaces( diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index 3360ea09042b9..e041b2806aa79 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -360,7 +360,7 @@ void AppleAccelTableWriter::emit() const { DWARF5AccelTableData::DWARF5AccelTableData(const DIE &Die, const DwarfCompileUnit &CU) : OffsetVal(&Die) { - Tag = Die.getTag(); + DieTag = Die.getTag(); UnitID = CU.getUniqueID(); } @@ -552,8 +552,8 @@ void llvm::emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents, } void llvm::emitDWARF5AccelTable( - AsmPrinter *Asm, AccelTable &Contents, - const DwarfDebug &DD, ArrayRef> CUs) { + AsmPrinter *Asm, DWARF5AccelTable &Contents, const DwarfDebug &DD, + ArrayRef> CUs) { std::vector> CompUnits; SmallVector CUIndex(CUs.size()); int Count = 0; @@ -588,13 +588,13 @@ void llvm::emitDWARF5AccelTable( } void llvm::emitDWARF5AccelTable( - AsmPrinter *Asm, AccelTable &Contents, + AsmPrinter *Asm, DWARF5AccelTable &Contents, ArrayRef> CUs, - llvm::function_ref + llvm::function_ref getCUIndexForEntry) { Contents.finalize(Asm, "names"); - Dwarf5AccelTableWriter(Asm, Contents, CUs, - getCUIndexForEntry) + Dwarf5AccelTableWriter(Asm, Contents, CUs, + getCUIndexForEntry) .emit(); } @@ -693,11 +693,6 @@ void DWARF5AccelTableData::print(raw_ostream &OS) const { OS << " Tag: " << dwarf::TagString(getDieTag()) << "\n"; } -void DWARF5AccelTableStaticData::print(raw_ostream &OS) const { - OS << " Offset: " << getDieOffset() << "\n"; - OS << " Tag: " << dwarf::TagString(getDieTag()) << "\n"; -} - void AppleAccelTableOffsetData::print(raw_ostream &OS) const { OS << " Offset: " << Die.getOffset() << "\n"; } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 277428a2cdc8e..5eb3db0877502 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1246,7 +1246,10 @@ void DwarfDebug::finishSubprogramDefinitions() { } } -void DwarfDebug::finalizeAccelerationTables() { +/// Finalizes DWARF acceleration tables. +/// Currently it converts DIE entries to offsets in .debu_names entry. +static void +finalizeDWARF5AccelerationTables(DWARF5AccelTable &AccelDebugNames) { for (auto &Entry : AccelDebugNames.getEntries()) { for (AccelTableData *Value : Entry.second.Values) { static_cast(Value)->normalizeDIEToOffset(); @@ -1400,7 +1403,7 @@ void DwarfDebug::finalizeModuleInfo() { // Now that offsets are computed, can replace DIEs in debug_names Entry with // an actual offset. - finalizeAccelerationTables(); + finalizeDWARF5AccelerationTables(AccelDebugNames); } // Emit all Dwarf sections that should come after the content. diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 695bbdafc17fc..b41d2be5eb9b8 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -496,7 +496,7 @@ class DwarfDebug : public DebugHandlerBase { AddressPool AddrPool; /// Accelerator tables. - AccelTable AccelDebugNames; + DWARF5AccelTable AccelDebugNames; AccelTable AccelNames; AccelTable AccelObjC; AccelTable AccelNamespace; @@ -542,10 +542,6 @@ class DwarfDebug : public DebugHandlerBase { void finishSubprogramDefinitions(); - /// Finalizes DWARF acceleration tables. - /// Currently it converts DIE entries to offsets in .debu_names entry. - void finalizeAccelerationTables(); - /// Finish off debug information after all functions have been /// processed. void finalizeModuleInfo(); diff --git a/llvm/lib/DWARFLinker/DWARFStreamer.cpp b/llvm/lib/DWARFLinker/DWARFStreamer.cpp index ff719d0a59baf..2c6aba7225adc 100644 --- a/llvm/lib/DWARFLinker/DWARFStreamer.cpp +++ b/llvm/lib/DWARFLinker/DWARFStreamer.cpp @@ -291,8 +291,7 @@ void DwarfStreamer::emitLineStrings(const NonRelocatableStringpool &Pool) { } } -void DwarfStreamer::emitDebugNames( - AccelTable &Table) { +void DwarfStreamer::emitDebugNames(DWARF5AccelTable &Table) { if (EmittedUnits.empty()) return; @@ -307,11 +306,10 @@ void DwarfStreamer::emitDebugNames( } Asm->OutStreamer->switchSection(MOFI->getDwarfDebugNamesSection()); - emitDWARF5AccelTable( - Asm.get(), Table, CompUnits, - [&UniqueIdToCuMap](const DWARF5AccelTableStaticData &Entry) { - return UniqueIdToCuMap[Entry.getCUIndex()]; - }); + emitDWARF5AccelTable(Asm.get(), Table, CompUnits, + [&UniqueIdToCuMap](const DWARF5AccelTableData &Entry) { + return UniqueIdToCuMap[Entry.getUnitID()]; + }); } void DwarfStreamer::emitAppleNamespaces( diff --git a/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.cpp b/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.cpp index 7885e3013a51d..88038824c9dcb 100644 --- a/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.cpp +++ b/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.cpp @@ -223,16 +223,16 @@ void DwarfEmitterImpl::emitDIE(DIE &Die) { DebugInfoSectionSize += Die.getSize(); } -void DwarfEmitterImpl::emitDebugNames( - AccelTable &Table, - DebugNamesUnitsOffsets &CUOffsets, CompUnitIDToIdx &CUidToIdx) { +void DwarfEmitterImpl::emitDebugNames(DWARF5AccelTable &Table, + DebugNamesUnitsOffsets &CUOffsets, + CompUnitIDToIdx &CUidToIdx) { if (CUOffsets.empty()) return; Asm->OutStreamer->switchSection(MOFI->getDwarfDebugNamesSection()); emitDWARF5AccelTable(Asm.get(), Table, CUOffsets, - [&CUidToIdx](const DWARF5AccelTableStaticData &Entry) { - return CUidToIdx[Entry.getCUIndex()]; + [&CUidToIdx](const DWARF5AccelTableData &Entry) { + return CUidToIdx[Entry.getUnitID()]; }); } diff --git a/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.h b/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.h index d5c847908ba53..1849442678d32 100644 --- a/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.h +++ b/llvm/lib/DWARFLinkerParallel/DWARFEmitterImpl.h @@ -87,7 +87,7 @@ class DwarfEmitterImpl : public ExtraDwarfEmitter { uint64_t getDebugInfoSectionSize() const { return DebugInfoSectionSize; } /// Emits .debug_names section according to the specified \p Table. - void emitDebugNames(AccelTable &Table, + void emitDebugNames(DWARF5AccelTable &Table, DebugNamesUnitsOffsets &CUOffsets, CompUnitIDToIdx &UnitIDToIdxMap); diff --git a/llvm/lib/DWARFLinkerParallel/DWARFLinkerImpl.cpp b/llvm/lib/DWARFLinkerParallel/DWARFLinkerImpl.cpp index 78f553a125445..a755d540aef99 100644 --- a/llvm/lib/DWARFLinkerParallel/DWARFLinkerImpl.cpp +++ b/llvm/lib/DWARFLinkerParallel/DWARFLinkerImpl.cpp @@ -1129,7 +1129,7 @@ void DWARFLinkerImpl::emitAppleAcceleratorSections(const Triple &TargetTriple) { } void DWARFLinkerImpl::emitDWARFv5DebugNamesSection(const Triple &TargetTriple) { - std::unique_ptr> DebugNames; + std::unique_ptr DebugNames; DebugNamesUnitsOffsets CompUnits; CompUnitIDToIdx CUidToIdx; @@ -1144,7 +1144,7 @@ void DWARFLinkerImpl::emitDWARFv5DebugNamesSection(const Triple &TargetTriple) { CU->AcceleratorRecords.forEach([&](const DwarfUnit::AccelInfo &Info) { if (DebugNames.get() == nullptr) - DebugNames = std::make_unique>(); + DebugNames = std::make_unique(); switch (Info.Type) { case DwarfUnit::AccelType::Name: From b1c90e8c5740c783cb8951d6884e9b70bcadc95a Mon Sep 17 00:00:00 2001 From: Alexander Yermolovich Date: Mon, 23 Oct 2023 16:42:12 -0700 Subject: [PATCH 4/4] fixup! fixup! fixup! [LLVM[NFC] Refactor to allow debug_names entries to conatain DIE offset --- llvm/include/llvm/CodeGen/AccelTable.h | 10 +++++++++- llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp | 5 +---- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 17 +++-------------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/llvm/include/llvm/CodeGen/AccelTable.h b/llvm/include/llvm/CodeGen/AccelTable.h index d7604100de47a..d4e21b2ac8e7e 100644 --- a/llvm/include/llvm/CodeGen/AccelTable.h +++ b/llvm/include/llvm/CodeGen/AccelTable.h @@ -283,7 +283,15 @@ class DWARF5AccelTableData : public AccelTableData { class DWARF5AccelTable : public AccelTable { public: - StringEntries &getEntries() { return Entries; } + /// Convert DIE entries to explicit offset. + /// Needs to be called after DIE offsets are computed. + void convertDieToOffset() { + for (auto &Entry : Entries) { + for (AccelTableData *Value : Entry.second.Values) { + static_cast(Value)->normalizeDIEToOffset(); + } + } + } }; void emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents, diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index e041b2806aa79..e393951744117 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -359,10 +359,7 @@ void AppleAccelTableWriter::emit() const { DWARF5AccelTableData::DWARF5AccelTableData(const DIE &Die, const DwarfCompileUnit &CU) - : OffsetVal(&Die) { - DieTag = Die.getTag(); - UnitID = CU.getUniqueID(); -} + : OffsetVal(&Die), DieTag(Die.getTag()), UnitID(CU.getUniqueID()) {} template void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) { diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 5eb3db0877502..f7ee0a145ddae 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1246,17 +1246,6 @@ void DwarfDebug::finishSubprogramDefinitions() { } } -/// Finalizes DWARF acceleration tables. -/// Currently it converts DIE entries to offsets in .debu_names entry. -static void -finalizeDWARF5AccelerationTables(DWARF5AccelTable &AccelDebugNames) { - for (auto &Entry : AccelDebugNames.getEntries()) { - for (AccelTableData *Value : Entry.second.Values) { - static_cast(Value)->normalizeDIEToOffset(); - } - } -} - void DwarfDebug::finalizeModuleInfo() { const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); @@ -1403,7 +1392,7 @@ void DwarfDebug::finalizeModuleInfo() { // Now that offsets are computed, can replace DIEs in debug_names Entry with // an actual offset. - finalizeDWARF5AccelerationTables(AccelDebugNames); + AccelDebugNames.convertDieToOffset(); } // Emit all Dwarf sections that should come after the content. @@ -3563,8 +3552,8 @@ void DwarfDebug::addAccelNameImpl(const DICompileUnit &CU, AppleAccel.addName(Ref, Die); break; case AccelTableKind::Dwarf: { - DwarfCompileUnit *CU = lookupCU(Die.getUnitDie()); - AccelDebugNames.addName(Ref, Die, *CU); + DwarfCompileUnit *DCU = CUMap.lookup(&CU); + AccelDebugNames.addName(Ref, Die, *DCU); break; } case AccelTableKind::Default: