From 56ce2f5ab83a2975970eeadfc1b61f96b4c50c22 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Wed, 19 Mar 2014 00:11:28 +0000 Subject: [PATCH] DebugInfo: Use the comp_dir of the referencing type units when building debug_line.dwo This isn't a complete fix - it falls back to non-comp_dir when multiple compile units are in play. Adding a map of comp_dir to table is part of the more general solution, but I gave up (in the short term) when I realized I'd also have to calculate the size of each type unit so as to produce correct DW_AT_stmt_list attributes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204202 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCDwarf.h | 3 +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 27 ++++++++++++++++----------- lib/CodeGen/AsmPrinter/DwarfDebug.h | 15 +++++++++++---- test/DebugInfo/X86/generate-odr-hash.ll | 1 + 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index 508c8305bc0..731ffb14fb3 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -195,6 +195,9 @@ struct MCDwarfLineTableHeader { class MCDwarfDwoLineTable { MCDwarfLineTableHeader Header; public: + void setCompilationDir(StringRef CompilationDir) { + Header.CompilationDir = CompilationDir; + } unsigned getFile(StringRef Directory, StringRef FileName) { return Header.getFile(Directory, FileName); } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 5fb603c143b..6925cb6bdde 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -680,8 +680,7 @@ void DwarfDebug::addGnuPubAttributes(DwarfUnit *U, DIE *D) const { // Create new DwarfCompileUnit for the given metadata node with tag // DW_TAG_compile_unit. -DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit, - bool Singular) { +DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { StringRef FN = DIUnit.getFilename(); CompilationDir = DIUnit.getDirectory(); @@ -689,7 +688,7 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit, DwarfCompileUnit *NewCU = new DwarfCompileUnit( InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder); InfoHolder.addUnit(NewCU); - if (!Asm->OutStreamer.hasRawTextSupport() || Singular) + if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU) Asm->OutStreamer.getContext().setMCLineTableCompilationDir( NewCU->getUniqueID(), CompilationDir); @@ -822,13 +821,11 @@ void DwarfDebug::beginModule() { // Emit initial sections so we can reference labels later. emitSectionLabels(); - auto Operands = CU_Nodes->operands(); + SingleCU = CU_Nodes->getNumOperands() == 1; - bool SingleCU = std::next(Operands.begin()) == Operands.end(); - - for (MDNode *N : Operands) { + for (MDNode *N : CU_Nodes->operands()) { DICompileUnit CUNode(N); - DwarfCompileUnit *CU = constructDwarfCompileUnit(CUNode, SingleCU); + DwarfCompileUnit *CU = constructDwarfCompileUnit(CUNode); DIArray ImportedEntities = CUNode.getImportedEntities(); for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) ScopesWithImportedEntities.push_back(std::make_pair( @@ -2712,6 +2709,14 @@ void DwarfDebug::emitDebugStrDWO() { OffSec, StrSym); } +MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) { + if (!useSplitDwarf()) + return nullptr; + if (SingleCU) + SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory()); + return &SplitTypeUnitFileTable; +} + void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier, DIE *RefDie, DICompositeType CTy) { @@ -2728,9 +2733,9 @@ void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU, } DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit); - DwarfTypeUnit *NewTU = new DwarfTypeUnit( - InfoHolder.getUnits().size(), UnitDie, CU, Asm, this, &InfoHolder, - useSplitDwarf() ? &SplitTypeUnitFileTable : nullptr); + DwarfTypeUnit *NewTU = + new DwarfTypeUnit(InfoHolder.getUnits().size(), UnitDie, CU, Asm, this, + &InfoHolder, getDwoLineTable(CU)); TU = NewTU; InfoHolder.addUnit(NewTU); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index e3ec8c7fcc1..73150442c67 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -467,10 +467,18 @@ class DwarfDebug : public AsmPrinterHandler { // Holder for the skeleton information. DwarfFile SkeletonHolder; - // Store file names for type units under fission in a line table header that - // will be emitted into debug_line.dwo. + /// Store file names for type units under fission in a line table header that + /// will be emitted into debug_line.dwo. + // FIXME: replace this with a map from comp_dir to table so that we can emit + // multiple tables during LTO each of which uses directory 0, referencing the + // comp_dir of all the type units that use it. MCDwarfDwoLineTable SplitTypeUnitFileTable; + // True iff there are multiple CUs in this module. + bool SingleCU; + + MCDwarfDwoLineTable *getDwoLineTable(const DwarfCompileUnit &); + void addScopeVariable(LexicalScope *LS, DbgVariable *Var); const SmallVectorImpl &getUnits() { @@ -618,8 +626,7 @@ class DwarfDebug : public AsmPrinterHandler { /// \brief Create new DwarfCompileUnit for the given metadata node with tag /// DW_TAG_compile_unit. - DwarfCompileUnit *constructDwarfCompileUnit(DICompileUnit DIUnit, - bool Singular); + DwarfCompileUnit *constructDwarfCompileUnit(DICompileUnit DIUnit); /// \brief Construct subprogram DIE. void constructSubprogramDIE(DwarfCompileUnit *TheCU, const MDNode *N); diff --git a/test/DebugInfo/X86/generate-odr-hash.ll b/test/DebugInfo/X86/generate-odr-hash.ll index 977016315c5..add1e74fde8 100644 --- a/test/DebugInfo/X86/generate-odr-hash.ll +++ b/test/DebugInfo/X86/generate-odr-hash.ll @@ -143,6 +143,7 @@ ; FISSION: Line table prologue ; FISSION: opcode_base: 1 ; FISSION-NOT: standard_opcode_lengths +; FISSION-NOT: include_directories ; FISSION-NOT: file_names[ ; FISSION: file_names{{.*}} bar.h ; FISSION: file_names{{.*}} bar.cpp -- 2.11.0