[llvm] fef5096 - [llvm-debuginfo-analyzer][NFC] Move some functionality to LVReader. (#142740)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 4 06:35:51 PDT 2025
Author: Carlos Alberto Enciso
Date: 2025-06-04T14:35:48+01:00
New Revision: fef5096a8ac64c391a4d07dfbddb9f874b007e65
URL: https://github.com/llvm/llvm-project/commit/fef5096a8ac64c391a4d07dfbddb9f874b007e65
DIFF: https://github.com/llvm/llvm-project/commit/fef5096a8ac64c391a4d07dfbddb9f874b007e65.diff
LOG: [llvm-debuginfo-analyzer][NFC] Move some functionality to LVReader. (#142740)
Hoist out from LVDWARFReader and LVBinaryReader some generic
code, so it can be available to other readers that do not share the
binary format.
Added:
Modified:
llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
llvm/include/llvm/DebugInfo/LogicalView/Readers/LVDWARFReader.h
llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp
llvm/lib/DebugInfo/LogicalView/Readers/LVBinaryReader.cpp
llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp
Removed:
################################################################################
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<LVSectionIndex, std::unique_ptr<LVRange>>;
+ 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<LVAddressRange> 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
diff erent 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<LVSectionIndex, std::unique_ptr<LVRange>>;
- 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<std::pair<LVSectionIndex, object::SectionRef>>
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<LVAddressRange> 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<LVRange>()).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<LVScopeCompileUnit *>(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 ed1d5e46f00a8..80b4185b7c600 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<LVRange>()).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<LVScopeCompileUnit *>(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) {
More information about the llvm-commits
mailing list