Index: lib/CodeGen/AsmPrinter/DwarfCompileUnit.h =================================================================== --- lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.h @@ -39,6 +39,9 @@ /// The start of the unit within its section. MCSymbol *LabelBegin; + // ImportedEntities - A list of imported entities. Does not own. + SmallVector ImportedEntities; + /// GlobalNames - A map of globally visible named entities for this unit. StringMap GlobalNames; @@ -98,6 +101,10 @@ unsigned getOrCreateSourceID(StringRef FileName, StringRef DirName) override; + void addImportedEntity(const DIImportedEntity* IE) { + ImportedEntities.push_back(IE); + } + /// addRange - Add an address range to the list of ranges for this unit. void addRange(RangeSpan Range); Index: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -341,10 +341,23 @@ // Skip imported directives in gmlt-like data. if (!includeMinimalInlineScopes()) { + SmallVector Entities; // There is no need to emit empty lexical block DIE. - for (const auto &E : DD->findImportedEntitiesForScope(DS)) + for (const auto &E : DD->findImportedEntitiesForScope(DS)) { Children.push_back( constructImportedEntityDIE(cast(E.second))); + Entities.push_back(cast(E.second)); + } + + uint i = 0; + for (const auto *IE : ImportedEntities) { + if (IE->getScope() == DS) { + assert(i < Entities.size()); + assert(Entities[i] == IE); + i++; + } + } + assert(i == Entities.size()); } // If there are only other scopes as children, put them directly in the Index: lib/CodeGen/AsmPrinter/DwarfDebug.h =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.h +++ lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -627,7 +627,7 @@ const MachineFunction *getCurrentFunction() const { return CurFn; } iterator_range - findImportedEntitiesForScope(const MDNode *Scope) const { + findImportedEntitiesForScope(const MDNode *Scope) { return make_range(std::equal_range( ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(), std::pair(Scope, nullptr), Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -488,13 +488,16 @@ for (MDNode *N : CU_Nodes->operands()) { auto *CUNode = cast(N); DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode); - for (auto *IE : CUNode->getImportedEntities()) + for (auto *IE : CUNode->getImportedEntities()) { ScopesWithImportedEntities.push_back(std::make_pair(IE->getScope(), IE)); + CU.addImportedEntity(IE); + } // Stable sort to preserve the order of appearance of imported entities. // This is to avoid out-of-order processing of interdependent declarations // within the same scope, e.g. { namespace A = base; namespace B = A; } std::stable_sort(ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(), less_first()); + for (auto *GV : CUNode->getGlobalVariables()) CU.getOrCreateGlobalVariableDIE(GV); for (auto *SP : CUNode->getSubprograms())