diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h index 870b53f6774a8..5388887df4ed4 100644 --- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h +++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h @@ -56,7 +56,7 @@ class LVSplitContext final { /// The logical reader owns of all the logical elements created during /// the debug information parsing. For its creation it uses a specific -/// bump allocator for each type of logical element. +/// bump allocator for each type of logical element. class LVReader { LVBinaryType BinaryType; @@ -122,7 +122,24 @@ class LVReader { #undef LV_OBJECT_ALLOCATOR + // Scopes with ranges for current compile unit. It is used to find a line + // giving its exact or closest address. To support comdat functions, all + // addresses for the same section are recorded in the same map. + using LVSectionRanges = std::map>; + LVSectionRanges SectionRanges; + protected: + // Current elements during the processing of a DIE/MDNode. + LVElement *CurrentElement = nullptr; + LVScope *CurrentScope = nullptr; + LVSymbol *CurrentSymbol = nullptr; + LVType *CurrentType = nullptr; + LVLine *CurrentLine = nullptr; + LVOffset CurrentOffset = 0; + + // Address ranges collected for current DIE/MDNode/AST Node. + std::vector CurrentRanges; + LVScopeRoot *Root = nullptr; std::string InputFilename; std::string FileFormatName; @@ -133,11 +150,18 @@ class LVReader { // Only for ELF format. The CodeView is handled in a different way. LVSectionIndex DotTextSectionIndex = UndefinedSectionIndex; + void addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope); + void addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope, + LVAddress LowerAddress, LVAddress UpperAddress); + LVRange *getSectionRanges(LVSectionIndex SectionIndex); + // Record Compilation Unit entry. void addCompileUnitOffset(LVOffset Offset, LVScopeCompileUnit *CompileUnit) { CompileUnits.emplace(Offset, CompileUnit); } + LVElement *createElement(dwarf::Tag Tag); + // Create the Scope Root. virtual Error createScopes() { Root = createScopeRoot(); diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h index 9cda64e33ddf7..1847fa8323480 100644 --- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h +++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h @@ -93,12 +93,6 @@ class LVBinaryReader : public LVReader { SectionAddresses.emplace(Section.getAddress(), Section); } - // Scopes with ranges for current compile unit. It is used to find a line - // giving its exact or closest address. To support comdat functions, all - // addresses for the same section are recorded in the same map. - using LVSectionRanges = std::map>; - LVSectionRanges SectionRanges; - // Image base and virtual address for Executable file. uint64_t ImageBaseAddress = 0; uint64_t VirtualAddress = 0; @@ -179,11 +173,6 @@ class LVBinaryReader : public LVReader { Expected> getSection(LVScope *Scope, LVAddress Address, LVSectionIndex SectionIndex); - void addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope); - void addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope, - LVAddress LowerAddress, LVAddress UpperAddress); - LVRange *getSectionRanges(LVSectionIndex SectionIndex); - void includeInlineeLines(LVSectionIndex SectionIndex, LVScope *Function); Error createInstructions(); diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h index aa47bd9cd2cdd..d64723ced2e75 100644 --- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h +++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h @@ -39,12 +39,6 @@ class LVDWARFReader final : public LVBinaryReader { LVAddress CUBaseAddress = 0; LVAddress CUHighAddress = 0; - // Current elements during the processing of a DIE. - LVElement *CurrentElement = nullptr; - LVScope *CurrentScope = nullptr; - LVSymbol *CurrentSymbol = nullptr; - LVType *CurrentType = nullptr; - LVOffset CurrentOffset = 0; LVOffset CurrentEndOffset = 0; // In DWARF v4, the files are 1-indexed. @@ -52,9 +46,6 @@ class LVDWARFReader final : public LVBinaryReader { // The DWARF reader expects the indexes as 1-indexed. bool IncrementFileIndex = false; - // Address ranges collected for current DIE. - std::vector CurrentRanges; - // Symbols with locations for current compile unit. LVSymbols SymbolsWithLocations; @@ -82,7 +73,6 @@ class LVDWARFReader final : public LVBinaryReader { void mapRangeAddress(const object::ObjectFile &Obj) override; - LVElement *createElement(dwarf::Tag Tag); void traverseDieAndChildren(DWARFDie &DIE, LVScope *Parent, DWARFDie &SkeletonDie); // Process the attributes for the given DIE. diff --git a/llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp b/llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp index 328ced9f4eb66..c1017d8a3c22f 100644 --- a/llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp +++ b/llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp @@ -194,6 +194,253 @@ StringRef LVReader::getFilename(LVObject *Object, size_t Index) const { return CompileUnit ? CompileUnit->getFilename(Index) : StringRef(); } +void LVReader::addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope) { + LVRange *ScopesWithRanges = getSectionRanges(SectionIndex); + ScopesWithRanges->addEntry(Scope); +} + +void LVReader::addSectionRange(LVSectionIndex SectionIndex, LVScope *Scope, + LVAddress LowerAddress, LVAddress UpperAddress) { + LVRange *ScopesWithRanges = getSectionRanges(SectionIndex); + ScopesWithRanges->addEntry(Scope, LowerAddress, UpperAddress); +} + +LVRange *LVReader::getSectionRanges(LVSectionIndex SectionIndex) { + // Check if we already have a mapping for this section index. + LVSectionRanges::iterator IterSection = SectionRanges.find(SectionIndex); + if (IterSection == SectionRanges.end()) + IterSection = + SectionRanges.emplace(SectionIndex, std::make_unique()).first; + LVRange *Range = IterSection->second.get(); + assert(Range && "Range is null."); + return Range; +} + +LVElement *LVReader::createElement(dwarf::Tag Tag) { + CurrentScope = nullptr; + CurrentSymbol = nullptr; + CurrentType = nullptr; + CurrentRanges.clear(); + + LLVM_DEBUG( + { dbgs() << "\n[createElement] " << dwarf::TagString(Tag) << "\n"; }); + + if (!options().getPrintSymbols()) { + switch (Tag) { + // As the command line options did not specify a request to print + // logical symbols (--print=symbols or --print=all or --print=elements), + // skip its creation. + case dwarf::DW_TAG_formal_parameter: + case dwarf::DW_TAG_unspecified_parameters: + case dwarf::DW_TAG_member: + case dwarf::DW_TAG_variable: + case dwarf::DW_TAG_inheritance: + case dwarf::DW_TAG_constant: + case dwarf::DW_TAG_call_site_parameter: + case dwarf::DW_TAG_GNU_call_site_parameter: + return nullptr; + default: + break; + } + } + + switch (Tag) { + // Types. + case dwarf::DW_TAG_base_type: + CurrentType = createType(); + CurrentType->setIsBase(); + if (options().getAttributeBase()) + CurrentType->setIncludeInPrint(); + return CurrentType; + case dwarf::DW_TAG_const_type: + CurrentType = createType(); + CurrentType->setIsConst(); + CurrentType->setName("const"); + return CurrentType; + case dwarf::DW_TAG_enumerator: + CurrentType = createTypeEnumerator(); + return CurrentType; + case dwarf::DW_TAG_imported_declaration: + CurrentType = createTypeImport(); + CurrentType->setIsImportDeclaration(); + return CurrentType; + case dwarf::DW_TAG_imported_module: + CurrentType = createTypeImport(); + CurrentType->setIsImportModule(); + return CurrentType; + case dwarf::DW_TAG_pointer_type: + CurrentType = createType(); + CurrentType->setIsPointer(); + CurrentType->setName("*"); + return CurrentType; + case dwarf::DW_TAG_ptr_to_member_type: + CurrentType = createType(); + CurrentType->setIsPointerMember(); + CurrentType->setName("*"); + return CurrentType; + case dwarf::DW_TAG_reference_type: + CurrentType = createType(); + CurrentType->setIsReference(); + CurrentType->setName("&"); + return CurrentType; + case dwarf::DW_TAG_restrict_type: + CurrentType = createType(); + CurrentType->setIsRestrict(); + CurrentType->setName("restrict"); + return CurrentType; + case dwarf::DW_TAG_rvalue_reference_type: + CurrentType = createType(); + CurrentType->setIsRvalueReference(); + CurrentType->setName("&&"); + return CurrentType; + case dwarf::DW_TAG_subrange_type: + CurrentType = createTypeSubrange(); + return CurrentType; + case dwarf::DW_TAG_template_value_parameter: + CurrentType = createTypeParam(); + CurrentType->setIsTemplateValueParam(); + return CurrentType; + case dwarf::DW_TAG_template_type_parameter: + CurrentType = createTypeParam(); + CurrentType->setIsTemplateTypeParam(); + return CurrentType; + case dwarf::DW_TAG_GNU_template_template_param: + CurrentType = createTypeParam(); + CurrentType->setIsTemplateTemplateParam(); + return CurrentType; + case dwarf::DW_TAG_typedef: + CurrentType = createTypeDefinition(); + return CurrentType; + case dwarf::DW_TAG_unspecified_type: + CurrentType = createType(); + CurrentType->setIsUnspecified(); + return CurrentType; + case dwarf::DW_TAG_volatile_type: + CurrentType = createType(); + CurrentType->setIsVolatile(); + CurrentType->setName("volatile"); + return CurrentType; + + // Symbols. + case dwarf::DW_TAG_formal_parameter: + CurrentSymbol = createSymbol(); + CurrentSymbol->setIsParameter(); + return CurrentSymbol; + case dwarf::DW_TAG_unspecified_parameters: + CurrentSymbol = createSymbol(); + CurrentSymbol->setIsUnspecified(); + CurrentSymbol->setName("..."); + return CurrentSymbol; + case dwarf::DW_TAG_member: + CurrentSymbol = createSymbol(); + CurrentSymbol->setIsMember(); + return CurrentSymbol; + case dwarf::DW_TAG_variable: + CurrentSymbol = createSymbol(); + CurrentSymbol->setIsVariable(); + return CurrentSymbol; + case dwarf::DW_TAG_inheritance: + CurrentSymbol = createSymbol(); + CurrentSymbol->setIsInheritance(); + return CurrentSymbol; + case dwarf::DW_TAG_call_site_parameter: + case dwarf::DW_TAG_GNU_call_site_parameter: + CurrentSymbol = createSymbol(); + CurrentSymbol->setIsCallSiteParameter(); + return CurrentSymbol; + case dwarf::DW_TAG_constant: + CurrentSymbol = createSymbol(); + CurrentSymbol->setIsConstant(); + return CurrentSymbol; + + // Scopes. + case dwarf::DW_TAG_catch_block: + CurrentScope = createScope(); + CurrentScope->setIsCatchBlock(); + return CurrentScope; + case dwarf::DW_TAG_lexical_block: + CurrentScope = createScope(); + CurrentScope->setIsLexicalBlock(); + return CurrentScope; + case dwarf::DW_TAG_try_block: + CurrentScope = createScope(); + CurrentScope->setIsTryBlock(); + return CurrentScope; + case dwarf::DW_TAG_compile_unit: + case dwarf::DW_TAG_skeleton_unit: + CurrentScope = createScopeCompileUnit(); + CompileUnit = static_cast(CurrentScope); + return CurrentScope; + case dwarf::DW_TAG_inlined_subroutine: + CurrentScope = createScopeFunctionInlined(); + return CurrentScope; + case dwarf::DW_TAG_namespace: + CurrentScope = createScopeNamespace(); + return CurrentScope; + case dwarf::DW_TAG_template_alias: + CurrentScope = createScopeAlias(); + return CurrentScope; + case dwarf::DW_TAG_array_type: + CurrentScope = createScopeArray(); + return CurrentScope; + case dwarf::DW_TAG_call_site: + case dwarf::DW_TAG_GNU_call_site: + CurrentScope = createScopeFunction(); + CurrentScope->setIsCallSite(); + return CurrentScope; + case dwarf::DW_TAG_entry_point: + CurrentScope = createScopeFunction(); + CurrentScope->setIsEntryPoint(); + return CurrentScope; + case dwarf::DW_TAG_subprogram: + CurrentScope = createScopeFunction(); + CurrentScope->setIsSubprogram(); + return CurrentScope; + case dwarf::DW_TAG_subroutine_type: + CurrentScope = createScopeFunctionType(); + return CurrentScope; + case dwarf::DW_TAG_label: + CurrentScope = createScopeFunction(); + CurrentScope->setIsLabel(); + return CurrentScope; + case dwarf::DW_TAG_class_type: + CurrentScope = createScopeAggregate(); + CurrentScope->setIsClass(); + return CurrentScope; + case dwarf::DW_TAG_structure_type: + CurrentScope = createScopeAggregate(); + CurrentScope->setIsStructure(); + return CurrentScope; + case dwarf::DW_TAG_union_type: + CurrentScope = createScopeAggregate(); + CurrentScope->setIsUnion(); + return CurrentScope; + case dwarf::DW_TAG_enumeration_type: + CurrentScope = createScopeEnumeration(); + return CurrentScope; + case dwarf::DW_TAG_GNU_formal_parameter_pack: + CurrentScope = createScopeFormalPack(); + return CurrentScope; + case dwarf::DW_TAG_GNU_template_parameter_pack: + CurrentScope = createScopeTemplatePack(); + return CurrentScope; + case dwarf::DW_TAG_module: + CurrentScope = createScopeModule(); + return CurrentScope; + default: + // Collect TAGs not implemented. + if (options().getInternalTag() && Tag) + CompileUnit->addDebugTag(Tag, CurrentOffset); + break; + } + + LLVM_DEBUG({ + dbgs() << "DWARF Tag not implemented: " << dwarf::TagString(Tag) << "\n"; + }); + + return nullptr; +} + // The Reader is the module that creates the logical view using the debug // information contained in the binary file specified in the command line. // This is the main entry point for the Reader and performs the following diff --git a/llvm/lib/DebugInfo/LogicalView/Readers/LVBinaryReader.cpp b/llvm/lib/DebugInfo/LogicalView/Readers/LVBinaryReader.cpp index 434709f076dc5..6c66a5a163ad5 100644 --- a/llvm/lib/DebugInfo/LogicalView/Readers/LVBinaryReader.cpp +++ b/llvm/lib/DebugInfo/LogicalView/Readers/LVBinaryReader.cpp @@ -367,30 +367,6 @@ LVBinaryReader::getSection(LVScope *Scope, LVAddress Address, return std::make_pair(Iter->first, Iter->second); } -void LVBinaryReader::addSectionRange(LVSectionIndex SectionIndex, - LVScope *Scope) { - LVRange *ScopesWithRanges = getSectionRanges(SectionIndex); - ScopesWithRanges->addEntry(Scope); -} - -void LVBinaryReader::addSectionRange(LVSectionIndex SectionIndex, - LVScope *Scope, LVAddress LowerAddress, - LVAddress UpperAddress) { - LVRange *ScopesWithRanges = getSectionRanges(SectionIndex); - ScopesWithRanges->addEntry(Scope, LowerAddress, UpperAddress); -} - -LVRange *LVBinaryReader::getSectionRanges(LVSectionIndex SectionIndex) { - // Check if we already have a mapping for this section index. - LVSectionRanges::iterator IterSection = SectionRanges.find(SectionIndex); - if (IterSection == SectionRanges.end()) - IterSection = - SectionRanges.emplace(SectionIndex, std::make_unique()).first; - LVRange *Range = IterSection->second.get(); - assert(Range && "Range is null."); - return Range; -} - Error LVBinaryReader::createInstructions(LVScope *Scope, LVSectionIndex SectionIndex, const LVNameInfo &NameInfo) { diff --git a/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp b/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp index 14538c1aefa18..3dbe11accd2d4 100644 --- a/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp +++ b/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp @@ -28,223 +28,6 @@ using namespace llvm::logicalview; #define DEBUG_TYPE "DWARFReader" -LVElement *LVDWARFReader::createElement(dwarf::Tag Tag) { - CurrentScope = nullptr; - CurrentSymbol = nullptr; - CurrentType = nullptr; - CurrentRanges.clear(); - - if (!options().getPrintSymbols()) { - switch (Tag) { - // As the command line options did not specify a request to print - // logical symbols (--print=symbols or --print=all or --print=elements), - // skip its creation. - case dwarf::DW_TAG_formal_parameter: - case dwarf::DW_TAG_unspecified_parameters: - case dwarf::DW_TAG_member: - case dwarf::DW_TAG_variable: - case dwarf::DW_TAG_inheritance: - case dwarf::DW_TAG_constant: - case dwarf::DW_TAG_call_site_parameter: - case dwarf::DW_TAG_GNU_call_site_parameter: - return nullptr; - default: - break; - } - } - - switch (Tag) { - // Types. - case dwarf::DW_TAG_base_type: - CurrentType = createType(); - CurrentType->setIsBase(); - if (options().getAttributeBase()) - CurrentType->setIncludeInPrint(); - return CurrentType; - case dwarf::DW_TAG_const_type: - CurrentType = createType(); - CurrentType->setIsConst(); - CurrentType->setName("const"); - return CurrentType; - case dwarf::DW_TAG_enumerator: - CurrentType = createTypeEnumerator(); - return CurrentType; - case dwarf::DW_TAG_imported_declaration: - CurrentType = createTypeImport(); - CurrentType->setIsImportDeclaration(); - return CurrentType; - case dwarf::DW_TAG_imported_module: - CurrentType = createTypeImport(); - CurrentType->setIsImportModule(); - return CurrentType; - case dwarf::DW_TAG_pointer_type: - CurrentType = createType(); - CurrentType->setIsPointer(); - CurrentType->setName("*"); - return CurrentType; - case dwarf::DW_TAG_ptr_to_member_type: - CurrentType = createType(); - CurrentType->setIsPointerMember(); - CurrentType->setName("*"); - return CurrentType; - case dwarf::DW_TAG_reference_type: - CurrentType = createType(); - CurrentType->setIsReference(); - CurrentType->setName("&"); - return CurrentType; - case dwarf::DW_TAG_restrict_type: - CurrentType = createType(); - CurrentType->setIsRestrict(); - CurrentType->setName("restrict"); - return CurrentType; - case dwarf::DW_TAG_rvalue_reference_type: - CurrentType = createType(); - CurrentType->setIsRvalueReference(); - CurrentType->setName("&&"); - return CurrentType; - case dwarf::DW_TAG_subrange_type: - CurrentType = createTypeSubrange(); - return CurrentType; - case dwarf::DW_TAG_template_value_parameter: - CurrentType = createTypeParam(); - CurrentType->setIsTemplateValueParam(); - return CurrentType; - case dwarf::DW_TAG_template_type_parameter: - CurrentType = createTypeParam(); - CurrentType->setIsTemplateTypeParam(); - return CurrentType; - case dwarf::DW_TAG_GNU_template_template_param: - CurrentType = createTypeParam(); - CurrentType->setIsTemplateTemplateParam(); - return CurrentType; - case dwarf::DW_TAG_typedef: - CurrentType = createTypeDefinition(); - return CurrentType; - case dwarf::DW_TAG_unspecified_type: - CurrentType = createType(); - CurrentType->setIsUnspecified(); - return CurrentType; - case dwarf::DW_TAG_volatile_type: - CurrentType = createType(); - CurrentType->setIsVolatile(); - CurrentType->setName("volatile"); - return CurrentType; - - // Symbols. - case dwarf::DW_TAG_formal_parameter: - CurrentSymbol = createSymbol(); - CurrentSymbol->setIsParameter(); - return CurrentSymbol; - case dwarf::DW_TAG_unspecified_parameters: - CurrentSymbol = createSymbol(); - CurrentSymbol->setIsUnspecified(); - CurrentSymbol->setName("..."); - return CurrentSymbol; - case dwarf::DW_TAG_member: - CurrentSymbol = createSymbol(); - CurrentSymbol->setIsMember(); - return CurrentSymbol; - case dwarf::DW_TAG_variable: - CurrentSymbol = createSymbol(); - CurrentSymbol->setIsVariable(); - return CurrentSymbol; - case dwarf::DW_TAG_inheritance: - CurrentSymbol = createSymbol(); - CurrentSymbol->setIsInheritance(); - return CurrentSymbol; - case dwarf::DW_TAG_call_site_parameter: - case dwarf::DW_TAG_GNU_call_site_parameter: - CurrentSymbol = createSymbol(); - CurrentSymbol->setIsCallSiteParameter(); - return CurrentSymbol; - case dwarf::DW_TAG_constant: - CurrentSymbol = createSymbol(); - CurrentSymbol->setIsConstant(); - return CurrentSymbol; - - // Scopes. - case dwarf::DW_TAG_catch_block: - CurrentScope = createScope(); - CurrentScope->setIsCatchBlock(); - return CurrentScope; - case dwarf::DW_TAG_lexical_block: - CurrentScope = createScope(); - CurrentScope->setIsLexicalBlock(); - return CurrentScope; - case dwarf::DW_TAG_try_block: - CurrentScope = createScope(); - CurrentScope->setIsTryBlock(); - return CurrentScope; - case dwarf::DW_TAG_compile_unit: - case dwarf::DW_TAG_skeleton_unit: - CurrentScope = createScopeCompileUnit(); - CompileUnit = static_cast(CurrentScope); - return CurrentScope; - case dwarf::DW_TAG_inlined_subroutine: - CurrentScope = createScopeFunctionInlined(); - return CurrentScope; - case dwarf::DW_TAG_namespace: - CurrentScope = createScopeNamespace(); - return CurrentScope; - case dwarf::DW_TAG_template_alias: - CurrentScope = createScopeAlias(); - return CurrentScope; - case dwarf::DW_TAG_array_type: - CurrentScope = createScopeArray(); - return CurrentScope; - case dwarf::DW_TAG_call_site: - case dwarf::DW_TAG_GNU_call_site: - CurrentScope = createScopeFunction(); - CurrentScope->setIsCallSite(); - return CurrentScope; - case dwarf::DW_TAG_entry_point: - CurrentScope = createScopeFunction(); - CurrentScope->setIsEntryPoint(); - return CurrentScope; - case dwarf::DW_TAG_subprogram: - CurrentScope = createScopeFunction(); - CurrentScope->setIsSubprogram(); - return CurrentScope; - case dwarf::DW_TAG_subroutine_type: - CurrentScope = createScopeFunctionType(); - return CurrentScope; - case dwarf::DW_TAG_label: - CurrentScope = createScopeFunction(); - CurrentScope->setIsLabel(); - return CurrentScope; - case dwarf::DW_TAG_class_type: - CurrentScope = createScopeAggregate(); - CurrentScope->setIsClass(); - return CurrentScope; - case dwarf::DW_TAG_structure_type: - CurrentScope = createScopeAggregate(); - CurrentScope->setIsStructure(); - return CurrentScope; - case dwarf::DW_TAG_union_type: - CurrentScope = createScopeAggregate(); - CurrentScope->setIsUnion(); - return CurrentScope; - case dwarf::DW_TAG_enumeration_type: - CurrentScope = createScopeEnumeration(); - return CurrentScope; - case dwarf::DW_TAG_GNU_formal_parameter_pack: - CurrentScope = createScopeFormalPack(); - return CurrentScope; - case dwarf::DW_TAG_GNU_template_parameter_pack: - CurrentScope = createScopeTemplatePack(); - return CurrentScope; - case dwarf::DW_TAG_module: - CurrentScope = createScopeModule(); - return CurrentScope; - default: - // Collect TAGs not implemented. - if (options().getInternalTag() && Tag) - CompileUnit->addDebugTag(Tag, CurrentOffset); - break; - } - return nullptr; -} - void LVDWARFReader::processOneAttribute(const DWARFDie &Die, LVOffset *OffsetPtr, const AttributeSpec &AttrSpec) {