From ba466e6909e7d05a12c400f08f902d9ea08eec6c Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Sun, 31 Aug 2014 05:32:06 +0000 Subject: [PATCH] Refactor constructImportedEntityDIE(DwarfUnit, DIImportedEntity) to return a DIE rather than inserting it into a specified context. First of many steps to improve lexical scope construction (to omit trivial lexical scopes - those without any direct variables). To that end it's easier not to create imported entities directly into the lexical scope node, but to build them, then add them if necessary. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216838 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 22 +++++++++++++--------- lib/CodeGen/AsmPrinter/DwarfDebug.h | 5 +++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 860c7ca9245..1eb8af938a3 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -688,22 +688,23 @@ void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU, DIImportedEntity Module(N); assert(Module.Verify()); if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext())) - constructImportedEntityDIE(TheCU, Module, *D); + D->addChild(constructImportedEntityDIE(TheCU, Module)); } void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU, const MDNode *N, DIE &Context) { DIImportedEntity Module(N); assert(Module.Verify()); - return constructImportedEntityDIE(TheCU, Module, Context); + Context.addChild(constructImportedEntityDIE(TheCU, Module)); } -void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU, - const DIImportedEntity &Module, - DIE &Context) { +std::unique_ptr +DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU, + const DIImportedEntity &Module) { assert(Module.Verify() && "Use one of the MDNode * overloads to handle invalid metadata"); - DIE &IMDie = TheCU.createAndAddDIE(Module.getTag(), Context, Module); + std::unique_ptr IMDie = make_unique((dwarf::Tag)Module.getTag()); + TheCU.insertDIE(Module, IMDie.get()); DIE *EntityDie; DIDescriptor Entity = resolve(Module.getEntity()); if (Entity.isNameSpace()) @@ -714,13 +715,16 @@ void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU, EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity)); else EntityDie = TheCU.getDIE(Entity); - TheCU.addSourceLine(IMDie, Module.getLineNumber(), + assert(EntityDie); + TheCU.addSourceLine(*IMDie, Module.getLineNumber(), Module.getContext().getFilename(), Module.getContext().getDirectory()); - TheCU.addDIEEntry(IMDie, dwarf::DW_AT_import, *EntityDie); + TheCU.addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie); StringRef Name = Module.getName(); if (!Name.empty()) - TheCU.addString(IMDie, dwarf::DW_AT_name, Name); + TheCU.addString(*IMDie, dwarf::DW_AT_name, Name); + + return IMDie; } // Emit all Dwarf sections that should come prior to the content. Create diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 3528b2b8e33..bfc288dda2b 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -515,8 +515,9 @@ class DwarfDebug : public AsmPrinterHandler { DIE &Context); /// \brief Construct import_module DIE. - void constructImportedEntityDIE(DwarfCompileUnit &TheCU, - const DIImportedEntity &Module, DIE &Context); + std::unique_ptr + constructImportedEntityDIE(DwarfCompileUnit &TheCU, + const DIImportedEntity &Module); /// \brief Register a source line with debug info. Returns the unique /// label that was emitted and which provides correspondence to the -- 2.34.1