[llvm] [LLVM][DWARF] Add support for .debug_names with split dwarf (PR #73872)

via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 29 16:02:16 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-debuginfo

Author: Alexander Yermolovich (ayermolo)

<details>
<summary>Changes</summary>

Enables Type Units with DWARF5 accelerator tables for split dwarf. It is still
under discussion what is the best way to implement support for de-duplication in
DWP. This will be in follow up PR.


---
Full diff: https://github.com/llvm/llvm-project/pull/73872.diff


4 Files Affected:

- (modified) llvm/include/llvm/CodeGen/AccelTable.h (+6-4) 
- (modified) llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp (+28-10) 
- (modified) llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (+9-8) 
- (modified) llvm/test/DebugInfo/X86/debug-names-types.ll (+94-6) 


``````````diff
diff --git a/llvm/include/llvm/CodeGen/AccelTable.h b/llvm/include/llvm/CodeGen/AccelTable.h
index 6a69a01a8c786c4..0f35fd3514fae74 100644
--- a/llvm/include/llvm/CodeGen/AccelTable.h
+++ b/llvm/include/llvm/CodeGen/AccelTable.h
@@ -297,15 +297,15 @@ class DWARF5AccelTableData : public AccelTableData {
 };
 
 struct TypeUnitMetaInfo {
-  // Symbol for start of the TU section.
-  MCSymbol *Label;
+  // Symbol for start of the TU section or signature if this is SplitDwarf.
+  std::variant<MCSymbol *, uint64_t> LabelOrSignature;
   // Unique ID of Type Unit.
   unsigned UniqueID;
 };
 using TUVectorTy = SmallVector<TypeUnitMetaInfo, 1>;
 class DWARF5AccelTable : public AccelTable<DWARF5AccelTableData> {
   // Symbols to start of all the TU sections that were generated.
-  TUVectorTy TUSymbols;
+  TUVectorTy TUSymbolsOrHashes;
 
 public:
   struct UnitIndexAndEncoding {
@@ -313,9 +313,11 @@ class DWARF5AccelTable : public AccelTable<DWARF5AccelTableData> {
     DWARF5AccelTableData::AttributeEncoding Endoding;
   };
   /// Returns type units that were constructed.
-  const TUVectorTy &getTypeUnitsSymbols() { return TUSymbols; }
+  const TUVectorTy &getTypeUnitsSymbols() { return TUSymbolsOrHashes; }
   /// Add a type unit start symbol.
   void addTypeUnitSymbol(DwarfTypeUnit &U);
+  /// Add a type unit Signature.
+  void addTypeUnitSignature(DwarfTypeUnit &U);
   /// Convert DIE entries to explicit offset.
   /// Needs to be called after DIE offsets are computed.
   void convertDieToOffset() {
diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp
index 60c54687c96662d..d6f487c18b0301e 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp
@@ -201,9 +201,11 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
     char AugmentationString[8] = {'L', 'L', 'V', 'M', '0', '7', '0', '0'};
 
     Header(uint32_t CompUnitCount, uint32_t LocalTypeUnitCount,
-           uint32_t BucketCount, uint32_t NameCount)
+           uint32_t ForeignTypeUnitCount, uint32_t BucketCount,
+           uint32_t NameCount)
         : CompUnitCount(CompUnitCount), LocalTypeUnitCount(LocalTypeUnitCount),
-          BucketCount(BucketCount), NameCount(NameCount) {}
+          ForeignTypeUnitCount(ForeignTypeUnitCount), BucketCount(BucketCount),
+          NameCount(NameCount) {}
 
     void emit(Dwarf5AccelTableWriter &Ctx);
   };
@@ -220,6 +222,8 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
   MCSymbol *AbbrevStart = Asm->createTempSymbol("names_abbrev_start");
   MCSymbol *AbbrevEnd = Asm->createTempSymbol("names_abbrev_end");
   MCSymbol *EntryPool = Asm->createTempSymbol("names_entries");
+  // Indicates if this module is built with Split Dwarf enabled.
+  bool IsSplitDwarf = false;
 
   void populateAbbrevsMap();
 
@@ -238,7 +242,8 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
       ArrayRef<std::variant<MCSymbol *, uint64_t>> TypeUnits,
       llvm::function_ref<
           std::optional<DWARF5AccelTable::UnitIndexAndEncoding>(const DataT &)>
-          getIndexForEntry);
+          getIndexForEntry,
+      bool IsSplitDwarf);
 
   void emit();
 };
@@ -450,6 +455,8 @@ void Dwarf5AccelTableWriter<DataT>::emitTUList() const {
     Asm->OutStreamer->AddComment("Type unit " + Twine(TU.index()));
     if (std::holds_alternative<MCSymbol *>(TU.value()))
       Asm->emitDwarfSymbolReference(std::get<MCSymbol *>(TU.value()));
+    else if (IsSplitDwarf)
+      Asm->emitInt64(std::get<uint64_t>(TU.value()));
     else
       Asm->emitDwarfLengthOrOffset(std::get<uint64_t>(TU.value()));
   }
@@ -551,12 +558,15 @@ Dwarf5AccelTableWriter<DataT>::Dwarf5AccelTableWriter(
     ArrayRef<std::variant<MCSymbol *, uint64_t>> TypeUnits,
     llvm::function_ref<
         std::optional<DWARF5AccelTable::UnitIndexAndEncoding>(const DataT &)>
-        getIndexForEntry)
+        getIndexForEntry,
+    bool IsSplitDwarf)
     : AccelTableWriter(Asm, Contents, false),
-      Header(CompUnits.size(), TypeUnits.size(), Contents.getBucketCount(),
+      Header(CompUnits.size(), IsSplitDwarf ? 0 : TypeUnits.size(),
+             IsSplitDwarf ? TypeUnits.size() : 0, Contents.getBucketCount(),
              Contents.getUniqueNameCount()),
       CompUnits(CompUnits), TypeUnits(TypeUnits),
-      getIndexForEntry(std::move(getIndexForEntry)) {
+      getIndexForEntry(std::move(getIndexForEntry)),
+      IsSplitDwarf(IsSplitDwarf) {
   populateAbbrevsMap();
 }
 
@@ -608,7 +618,10 @@ void llvm::emitDWARF5AccelTable(
 
   for (const auto &TU : TUSymbols) {
     TUIndex[TU.UniqueID] = TUCount++;
-    TypeUnits.push_back(TU.Label);
+    if (DD.useSplitDwarf())
+      TypeUnits.push_back(std::get<uint64_t>(TU.LabelOrSignature));
+    else
+      TypeUnits.push_back(std::get<MCSymbol *>(TU.LabelOrSignature));
   }
 
   if (CompUnits.empty())
@@ -633,12 +646,17 @@ void llvm::emitDWARF5AccelTable(
           return {{CUIndex[Entry.getUnitID()],
                    {dwarf::DW_IDX_compile_unit, CUIndexForm}}};
         return std::nullopt;
-      })
+      },
+      DD.useSplitDwarf())
       .emit();
 }
 
 void DWARF5AccelTable::addTypeUnitSymbol(DwarfTypeUnit &U) {
-  TUSymbols.push_back({U.getLabelBegin(), U.getUniqueID()});
+  TUSymbolsOrHashes.push_back({U.getLabelBegin(), U.getUniqueID()});
+}
+
+void DWARF5AccelTable::addTypeUnitSignature(DwarfTypeUnit &U) {
+  TUSymbolsOrHashes.push_back({U.getTypeSignature(), U.getUniqueID()});
 }
 
 void llvm::emitDWARF5AccelTable(
@@ -650,7 +668,7 @@ void llvm::emitDWARF5AccelTable(
   std::vector<std::variant<MCSymbol *, uint64_t>> TypeUnits;
   Contents.finalize(Asm, "names");
   Dwarf5AccelTableWriter<DWARF5AccelTableData>(Asm, Contents, CUs, TypeUnits,
-                                               getIndexForEntry)
+                                               getIndexForEntry, false)
       .emit();
 }
 
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index f311931a41aa5df..ab29020bf1d7bb0 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -305,7 +305,6 @@ void Loc::MMI::addFrameIndexExpr(const DIExpression *Expr, int FI) {
 
 static AccelTableKind computeAccelTableKind(unsigned DwarfVersion,
                                             bool GenerateTypeUnits,
-                                            bool HasSplitDwarf,
                                             DebuggerKind Tuning,
                                             const Triple &TT) {
   // Honor an explicit request.
@@ -314,8 +313,7 @@ static AccelTableKind computeAccelTableKind(unsigned DwarfVersion,
 
   // Generating DWARF5 acceleration table.
   // Currently Split dwarf and non ELF format is not supported.
-  if (GenerateTypeUnits &&
-      (DwarfVersion < 5 || HasSplitDwarf || !TT.isOSBinFormatELF()))
+  if (GenerateTypeUnits && (DwarfVersion < 5 || !TT.isOSBinFormatELF()))
     return AccelTableKind::None;
 
   // Accelerator tables get emitted if targetting DWARF v5 or LLDB.  DWARF v5
@@ -403,9 +401,8 @@ DwarfDebug::DwarfDebug(AsmPrinter *A)
                        A->TM.getTargetTriple().isOSBinFormatWasm()) &&
                       GenerateDwarfTypeUnits;
 
-  TheAccelTableKind =
-      computeAccelTableKind(DwarfVersion, GenerateTypeUnits, HasSplitDwarf,
-                            DebuggerTuning, A->TM.getTargetTriple());
+  TheAccelTableKind = computeAccelTableKind(
+      DwarfVersion, GenerateTypeUnits, DebuggerTuning, A->TM.getTargetTriple());
 
   // Work around a GDB bug. GDB doesn't support the standard opcode;
   // SCE doesn't support GNU's; LLDB prefers the standard opcode, which
@@ -3532,8 +3529,12 @@ void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
       InfoHolder.computeSizeAndOffsetsForUnit(TU.first.get());
       InfoHolder.emitUnit(TU.first.get(), useSplitDwarf());
       if (getDwarfVersion() >= 5 &&
-          getAccelTableKind() == AccelTableKind::Dwarf)
-        AccelDebugNames.addTypeUnitSymbol(*TU.first);
+          getAccelTableKind() == AccelTableKind::Dwarf) {
+        if (useSplitDwarf())
+          AccelDebugNames.addTypeUnitSignature(*TU.first);
+        else
+          AccelDebugNames.addTypeUnitSymbol(*TU.first);
+      }
     }
     AccelTypeUnitsDebugNames.convertDieToOffset();
     AccelDebugNames.addTypeEntries(AccelTypeUnitsDebugNames);
diff --git a/llvm/test/DebugInfo/X86/debug-names-types.ll b/llvm/test/DebugInfo/X86/debug-names-types.ll
index fc23e604b386365..d32691305d1c101 100644
--- a/llvm/test/DebugInfo/X86/debug-names-types.ll
+++ b/llvm/test/DebugInfo/X86/debug-names-types.ll
@@ -1,15 +1,10 @@
 ; UNSUPPORTED: system-windows
-; This checks that .debug_names can be generated with monolithic -fdebug-type-sections, and does not generate when split-dwarf is enabled.
+; This checks that .debug_names can be generated with monolithic, and split-dwarf, when -fdebug-type-sections is enabled.
 ; Generated with: clang++ main.cpp   -g2 -gdwarf-5 -gpubnames -fdebug-types-section
 
 ; RUN: llc -mtriple=x86_64 -generate-type-units -dwarf-version=5 -filetype=obj %s -o %t
 ; RUN: llvm-dwarfdump -debug-info -debug-names %t | FileCheck %s
 
-; RUN: llc -mtriple=x86_64 -generate-type-units -dwarf-version=5 -filetype=obj -split-dwarf-file=%t.mainTypes.dwo --split-dwarf-output=%t.mainTypes.dwo %s -o %t
-; RUN: llvm-readelf --sections %t | FileCheck %s --check-prefixes=CHECK-SPLIT
-
-; CHECK-SPLIT-NOT: .debug_names
-
 ; CHECK:     .debug_info contents:
 ; CHECK:      DW_TAG_type_unit
 ; CHECK-NEXT:   DW_AT_language  (DW_LANG_C_plus_plus_14)
@@ -117,6 +112,99 @@
 ; CHECK-NEXT:   ]
 ; CHECK-NEXT: }
 
+; RUN: llc -mtriple=x86_64 -generate-type-units -dwarf-version=5 -filetype=obj -split-dwarf-file=%t.mainTypes.dwo --split-dwarf-output=%t.mainTypes.dwo %s -o %t
+; RUN: llvm-dwarfdump -debug-names %t | FileCheck %s --check-prefixes=CHECK-SPLIT
+
+; CHECK-SPLIT:          .debug_names contents
+; CHECK-SPLIT:          Foreign TU count: 1
+; CHECK-SPLIT-NEXT:     Bucket count: 4
+; CHECK-SPLIT-NEXT:     Name count: 4
+; CHECK-SPLIT-NEXT:     Abbreviations table size: 0x28
+; CHECK-SPLIT-NEXT:     Augmentation: 'LLVM0700'
+; CHECK-SPLIT-NEXT:   }
+; CHECK-SPLIT-NEXT:   Compilation Unit offsets [
+; CHECK-SPLIT-NEXT:     CU[0]: 0x00000000
+; CHECK-SPLIT-NEXT:   ]
+; CHECK-SPLIT-NEXT:   Foreign Type Unit signatures [
+; CHECK-SPLIT-NEXT:     ForeignTU[0]: 0x675d23e4f33235f2
+; CHECK-SPLIT-NEXT:   ]
+; CHECK-SPLIT-NEXT:   Abbreviations [
+; CHECK-SPLIT-NEXT:     Abbreviation [[ABBREV:0x[0-9a-f]*]] {
+; CHECK-SPLIT-NEXT:       Tag: DW_TAG_structure_type
+; CHECK-SPLIT-NEXT:       DW_IDX_die_offset: DW_FORM_ref4
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:     Abbreviation [[ABBREV1:0x[0-9a-f]*]] {
+; CHECK-SPLIT-NEXT:       Tag: DW_TAG_structure_type
+; CHECK-SPLIT-NEXT:       DW_IDX_type_unit: DW_FORM_data1
+; CHECK-SPLIT-NEXT:       DW_IDX_die_offset: DW_FORM_ref4
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:     Abbreviation [[ABBREV2:0x[0-9a-f]*]] {
+; CHECK-SPLIT-NEXT:       Tag: DW_TAG_base_type
+; CHECK-SPLIT-NEXT:       DW_IDX_die_offset: DW_FORM_ref4
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:     Abbreviation [[ABBREV3:0x[0-9a-f]*]] {
+; CHECK-SPLIT-NEXT:       Tag: DW_TAG_subprogram
+; CHECK-SPLIT-NEXT:       DW_IDX_die_offset: DW_FORM_ref4
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:     Abbreviation [[ABBREV4:0x[0-9a-f]*]] {
+; CHECK-SPLIT-NEXT:       Tag: DW_TAG_base_type
+; CHECK-SPLIT-NEXT:       DW_IDX_type_unit: DW_FORM_data1
+; CHECK-SPLIT-NEXT:       DW_IDX_die_offset: DW_FORM_ref4
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:   ]
+; CHECK-SPLIT-NEXT:   Bucket 0 [
+; CHECK-SPLIT-NEXT:     Name 1 {
+; CHECK-SPLIT-NEXT:       Hash: 0xB888030
+; CHECK-SPLIT-NEXT:       String: {{.+}} "int"
+; CHECK-SPLIT-NEXT:       Entry @ {{.+}} {
+; CHECK-SPLIT-NEXT:         Abbrev: [[ABBREV2]]
+; CHECK-SPLIT-NEXT:         Tag: DW_TAG_base_type
+; CHECK-SPLIT-NEXT:         DW_IDX_die_offset: 0x00000035
+; CHECK-SPLIT-NEXT:       }
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:   ]
+; CHECK-SPLIT-NEXT:   Bucket 1 [
+; CHECK-SPLIT-NEXT:     Name 2 {
+; CHECK-SPLIT-NEXT:       Hash: 0xB887389
+; CHECK-SPLIT-NEXT:       String: {{.+}} "Foo"
+; CHECK-SPLIT-NEXT:       Entry @ {{.+}} {
+; CHECK-SPLIT-NEXT:         Abbrev: [[ABBREV1]]
+; CHECK-SPLIT-NEXT:         Tag: DW_TAG_structure_type
+; CHECK-SPLIT-NEXT:         DW_IDX_type_unit: 0x00
+; CHECK-SPLIT-NEXT:         DW_IDX_die_offset: 0x0000001f
+; CHECK-SPLIT-NEXT:       }
+; CHECK-SPLIT-NEXT:       Entry @ 0xae {
+; CHECK-SPLIT-NEXT:         Abbrev: [[ABBREV]]
+; CHECK-SPLIT-NEXT:         Tag: DW_TAG_structure_type
+; CHECK-SPLIT-NEXT:         DW_IDX_die_offset: 0x00000039
+; CHECK-SPLIT-NEXT:       }
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:   ]
+; CHECK-SPLIT-NEXT:   Bucket 2 [
+; CHECK-SPLIT-NEXT:     Name 3 {
+; CHECK-SPLIT-NEXT:       Hash: 0x7C9A7F6A
+; CHECK-SPLIT-NEXT:       String: {{.+}} "main"
+; CHECK-SPLIT-NEXT:       Entry @ {{.+}} {
+; CHECK-SPLIT-NEXT:         Abbrev: [[ABBREV3]]
+; CHECK-SPLIT-NEXT:         Tag: DW_TAG_subprogram
+; CHECK-SPLIT-NEXT:         DW_IDX_die_offset: 0x0000001a
+; CHECK-SPLIT-NEXT:       }
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:   ]
+; CHECK-SPLIT-NEXT:   Bucket 3 [
+; CHECK-SPLIT-NEXT:     Name 4 {
+; CHECK-SPLIT-NEXT:       Hash: 0x7C952063
+; CHECK-SPLIT-NEXT:       String: {{.+}} "char"
+; CHECK-SPLIT-NEXT:       Entry @ {{.+}} {
+; CHECK-SPLIT-NEXT:         Abbrev: [[ABBREV4]]
+; CHECK-SPLIT-NEXT:         Tag: DW_TAG_base_type
+; CHECK-SPLIT-NEXT:         DW_IDX_type_unit: 0x00
+; CHECK-SPLIT-NEXT:         DW_IDX_die_offset: 0x00000034
+; CHECK-SPLIT-NEXT:       }
+; CHECK-SPLIT-NEXT:     }
+; CHECK-SPLIT-NEXT:   ]
+; CHECK-SPLIT-NEXT: }
+
 
 ; ModuleID = 'main.cpp'
 source_filename = "main.cpp"

``````````

</details>


https://github.com/llvm/llvm-project/pull/73872


More information about the llvm-commits mailing list