[llvm] [LLVM[NFC] Refactor to allow debug_names entries to conatain DIE offset (PR #69399)

Alexander Yermolovich via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 19 17:59:18 PDT 2023


https://github.com/ayermolo updated https://github.com/llvm/llvm-project/pull/69399

>From 103d7fdb21717d9bcd590a034d447138bef0fe33 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Tue, 17 Oct 2023 16:40:59 -0700
Subject: [PATCH 1/2] [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 d521b31e3d16ab4..d4bfd7d821c4952 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<const DIE *>(&OffsetVal))
+      return (*TDie)->getOffset();
+    return std::get<uint64_t>(OffsetVal);
+  }
+  unsigned getDieTag() const { return Tag; }
+  unsigned getUnitID() const { return UnitID; }
+  void normalizeDIEToOffset() { OffsetVal = getDieOffset(); }
 
 protected:
-  const DIE &Die;
+  std::variant<const DIE *, uint64_t> 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 88d5487427774c1..d30ca1ea7d1dc01 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<uint32_t> 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 <typename DataT>
 void Dwarf5AccelTableWriter<DataT>::Header::emit(Dwarf5AccelTableWriter &Ctx) {
   assert(CompUnitCount > 0 && "Index must have at least one CU.");
@@ -387,6 +398,16 @@ void Dwarf5AccelTableWriter<DataT>::Header::emit(Dwarf5AccelTableWriter &Ctx) {
   Asm->OutStreamer->emitBytes({AugmentationString, AugmentationStringSize});
 }
 
+template <typename DataT>
+void Dwarf5AccelTableWriter<DataT>::normalizeOffsets() {
+  for (auto &Bucket : Contents.getBuckets()) {
+    for (auto *Hash : Bucket) {
+      for (auto *Value : Hash->Values) {
+        static_cast<DataT *>(Value)->normalizeDIEToOffset();
+      }
+    }
+  }
+}
 template <typename DataT>
 DenseSet<uint32_t> Dwarf5AccelTableWriter<DataT>::getUniqueTags() const {
   DenseSet<uint32_t> UniqueTags;
@@ -516,6 +537,7 @@ Dwarf5AccelTableWriter<DataT>::Dwarf5AccelTableWriter(
       Header(CompUnits.size(), Contents.getBucketCount(),
              Contents.getUniqueNameCount()),
       CompUnits(CompUnits), getCUIndexForEntry(std::move(getCUIndexForEntry)) {
+  normalizeOffsets();
   DenseSet<uint32_t> UniqueTags = getUniqueTags();
   SmallVector<AttributeEncoding, 2> UniformAttributes = getUniformAttributes();
 
@@ -575,8 +597,7 @@ void llvm::emitDWARF5AccelTable(
   Dwarf5AccelTableWriter<DWARF5AccelTableData>(
       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 ee2ab71ad28e47f..80af8a8d79e2ac3 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 <ayermolo at meta.com>
Date: Thu, 19 Oct 2023 17:58:08 -0700
Subject: [PATCH 2/2] 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 d4bfd7d821c4952..d5563cb437571c2 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<const DIE *>(&OffsetVal))
-      return (*TDie)->getOffset();
+    assert(std::holds_alternative<uint64_t>(OffsetVal) &&
+           "Accessing DIE Offset before normalizing.");
     return std::get<uint64_t>(OffsetVal);
   }
   unsigned getDieTag() const { return Tag; }
   unsigned getUnitID() const { return UnitID; }
-  void normalizeDIEToOffset() { OffsetVal = getDieOffset(); }
+  void normalizeDIEToOffset() {
+    assert(std::holds_alternative<const DIE *>(OffsetVal) &&
+           "Accessing offset after normalizing.");
+    OffsetVal = std::get<const DIE *>(OffsetVal)->getOffset();
+  }
 
 protected:
   std::variant<const DIE *, uint64_t> OffsetVal;
diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp
index d30ca1ea7d1dc01..3360ea09042b925 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<uint32_t> getUniqueTags() const;
 
   // Right now, we emit uniform attributes for all tags.
@@ -398,16 +394,6 @@ void Dwarf5AccelTableWriter<DataT>::Header::emit(Dwarf5AccelTableWriter &Ctx) {
   Asm->OutStreamer->emitBytes({AugmentationString, AugmentationStringSize});
 }
 
-template <typename DataT>
-void Dwarf5AccelTableWriter<DataT>::normalizeOffsets() {
-  for (auto &Bucket : Contents.getBuckets()) {
-    for (auto *Hash : Bucket) {
-      for (auto *Value : Hash->Values) {
-        static_cast<DataT *>(Value)->normalizeDIEToOffset();
-      }
-    }
-  }
-}
 template <typename DataT>
 DenseSet<uint32_t> Dwarf5AccelTableWriter<DataT>::getUniqueTags() const {
   DenseSet<uint32_t> UniqueTags;
@@ -537,7 +523,6 @@ Dwarf5AccelTableWriter<DataT>::Dwarf5AccelTableWriter(
       Header(CompUnits.size(), Contents.getBucketCount(),
              Contents.getUniqueNameCount()),
       CompUnits(CompUnits), getCUIndexForEntry(std::move(getCUIndexForEntry)) {
-  normalizeOffsets();
   DenseSet<uint32_t> UniqueTags = getUniqueTags();
   SmallVector<AttributeEncoding, 2> UniformAttributes = getUniformAttributes();
 
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 80af8a8d79e2ac3..277428a2cdc8eea 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<DWARF5AccelTableData *>(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 75649a747602ef5..695bbdafc17fcf1 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();



More information about the llvm-commits mailing list