From 3fb39c79ed7f9f50e3d853ac64c7bb982fcd9d68 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Wed, 18 Apr 2018 12:11:59 +0000 Subject: [PATCH] [CodeGen/Dwarf] Make debug_names compatible with split-dwarf Summary: Previously we crashed for the combination of the two features because we tried to reference the dwo CU from the main object file. The fix consists of two items: - reference the skeleton CU from the name index (the consumer is expected to use the skeleton CU to find the real data). - use the main object file string pool for the strings in the index Reviewers: JDevlieghere, aprantl, dblaikie Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D45566 llvm-svn: 330249 --- llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp | 4 +++- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 16 ++++++++++------ llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 4 ++++ .../test/DebugInfo/Generic/debug-names-one-cu.ll | 4 ++++ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index 1107e020696c..a1ae137d2668 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -416,7 +416,9 @@ void Dwarf5AccelTableEmitter::emitCUList() const { for (const auto &CU : enumerate(CompUnits)) { assert(CU.index() == CU.value()->getUniqueID()); Asm->OutStreamer->AddComment("Compilation unit " + Twine(CU.index())); - Asm->emitDwarfSymbolReference(CU.value()->getLabelBegin()); + const DwarfCompileUnit *MainCU = + DD.useSplitDwarf() ? CU.value()->getSkeleton() : CU.value().get(); + Asm->emitDwarfSymbolReference(MainCU->getLabelBegin()); } } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 177a094b68b9..a8e36ec66e5b 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2267,6 +2267,13 @@ void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU, CU.addDIETypeSignature(RefDie, Signature); } +void DwarfDebug::addAccelDebugName(StringRef Name, const DIE &Die) { + assert(getAccelTableKind() == AccelTableKind::Dwarf); + + DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; + AccelDebugNames.addName(Holder.getStringPool().getEntry(*Asm, Name), Die); +} + // Accelerator table mutators - add each name along with its companion // DIE to the proper table while ensuring that the name that we're going // to reference is in the string table. We do this since the names we @@ -2277,8 +2284,7 @@ void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) { AccelNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); break; case AccelTableKind::Dwarf: - AccelDebugNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), - Die); + addAccelDebugName(Name, Die); break; case AccelTableKind::None: return; @@ -2300,8 +2306,7 @@ void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) { &Die); break; case AccelTableKind::Dwarf: - AccelDebugNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), - Die); + addAccelDebugName(Name, Die); break; case AccelTableKind::None: return; @@ -2316,8 +2321,7 @@ void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) { AccelTypes.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die); break; case AccelTableKind::Dwarf: - AccelDebugNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), - Die); + addAccelDebugName(Name, Die); break; case AccelTableKind::None: return; diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index bd248fd1951e..f01d68028eb4 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -339,6 +339,10 @@ class DwarfDebug : public DebugHandlerBase { /// Construct a DIE for this abstract scope. void constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU, LexicalScope *Scope); + /// Helper function to add a name to the .debug_names table, using the + /// appropriate string pool. + void addAccelDebugName(StringRef Name, const DIE &Die); + void finishVariableDefinitions(); void finishSubprogramDefinitions(); diff --git a/llvm/test/DebugInfo/Generic/debug-names-one-cu.ll b/llvm/test/DebugInfo/Generic/debug-names-one-cu.ll index 69ea641024c0..d9b9c8f29453 100644 --- a/llvm/test/DebugInfo/Generic/debug-names-one-cu.ll +++ b/llvm/test/DebugInfo/Generic/debug-names-one-cu.ll @@ -3,6 +3,10 @@ ; RUN: llvm-dwarfdump -debug-names %t | FileCheck %s ; RUN: llvm-dwarfdump -debug-names -verify %t | FileCheck --check-prefix=VERIFY %s +; Now try the same with split dwarf. +; RUN: %llc_dwarf -split-dwarf-file=foo.dwo -accel-tables=Dwarf -filetype=obj -o %t < %s +; RUN: llvm-dwarfdump -debug-names %t | FileCheck %s + ; Check the header ; CHECK: CU count: 1 ; CHECK: Local TU count: 0