diff options
Diffstat (limited to 'source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h')
-rw-r--r-- | source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 155 |
1 files changed, 67 insertions, 88 deletions
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index d351289f8b51..018af47305f4 100644 --- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -1,9 +1,8 @@ //===-- SymbolFileDWARF.h --------------------------------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -20,9 +19,6 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/Support/Threading.h" -#include "lldb/Utility/Flags.h" - -#include "lldb/Core/RangeMap.h" #include "lldb/Core/UniqueCStringMap.h" #include "lldb/Core/dwarf.h" #include "lldb/Expression/DWARFExpression.h" @@ -30,20 +26,21 @@ #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Utility/ConstString.h" +#include "lldb/Utility/Flags.h" +#include "lldb/Utility/RangeMap.h" #include "lldb/lldb-private.h" +#include "DWARFContext.h" #include "DWARFDataExtractor.h" #include "DWARFDefines.h" #include "DWARFIndex.h" #include "UniqueDWARFASTType.h" -//---------------------------------------------------------------------- // Forward Declarations for this DWARF plugin -//---------------------------------------------------------------------- class DebugMapModule; class DWARFAbbreviationDeclaration; class DWARFAbbreviationDeclarationSet; -class DWARFileUnit; +class DWARFCompileUnit; class DWARFDebugAbbrev; class DWARFDebugAranges; class DWARFDebugInfo; @@ -51,8 +48,8 @@ class DWARFDebugInfoEntry; class DWARFDebugLine; class DWARFDebugRangesBase; class DWARFDeclContext; -class DWARFDIECollection; class DWARFFormValue; +class DWARFTypeUnit; class SymbolFileDWARFDebugMap; class SymbolFileDWARFDwo; class SymbolFileDWARFDwp; @@ -65,14 +62,11 @@ public: friend class SymbolFileDWARFDebugMap; friend class SymbolFileDWARFDwo; friend class DebugMapModule; - friend struct DIERef; - friend class DWARFUnit; + friend class DWARFCompileUnit; friend class DWARFDIE; friend class DWARFASTParserClang; - //------------------------------------------------------------------ // Static Functions - //------------------------------------------------------------------ static void Initialize(); static void Terminate(); @@ -86,11 +80,12 @@ public: static lldb_private::SymbolFile * CreateInstance(lldb_private::ObjectFile *obj_file); - //------------------------------------------------------------------ + static lldb_private::FileSpecList GetSymlinkPaths(); + // Constructors and Destructors - //------------------------------------------------------------------ - SymbolFileDWARF(lldb_private::ObjectFile *ofile); + SymbolFileDWARF(lldb_private::ObjectFile *ofile, + lldb_private::SectionList *dwo_section_list); ~SymbolFileDWARF() override; @@ -98,9 +93,7 @@ public: void InitializeObject() override; - //------------------------------------------------------------------ // Compile Unit function calls - //------------------------------------------------------------------ uint32_t GetNumCompileUnits() override; @@ -124,7 +117,7 @@ public: bool ParseImportedModules( const lldb_private::SymbolContext &sc, - std::vector<lldb_private::ConstString> &imported_modules) override; + std::vector<lldb_private::SourceModule> &imported_modules) override; size_t ParseBlocksRecursive(lldb_private::Function &func) override; @@ -142,11 +135,6 @@ public: bool assert_not_being_parsed = true, bool resolve_function_context = false); - SymbolFileDWARF *GetDWARFForUID(lldb::user_id_t uid); - - DWARFDIE - GetDIEFromUID(lldb::user_id_t uid); - lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; lldb_private::CompilerDeclContext @@ -169,7 +157,7 @@ public: lldb_private::SymbolContextList &sc_list) override; uint32_t - FindGlobalVariables(const lldb_private::ConstString &name, + FindGlobalVariables(lldb_private::ConstString name, const lldb_private::CompilerDeclContext *parent_decl_ctx, uint32_t max_matches, lldb_private::VariableList &variables) override; @@ -179,7 +167,7 @@ public: lldb_private::VariableList &variables) override; uint32_t - FindFunctions(const lldb_private::ConstString &name, + FindFunctions(lldb_private::ConstString name, const lldb_private::CompilerDeclContext *parent_decl_ctx, lldb::FunctionNameType name_type_mask, bool include_inlines, bool append, lldb_private::SymbolContextList &sc_list) override; @@ -193,7 +181,7 @@ public: std::vector<lldb_private::ConstString> &mangled_names) override; uint32_t - FindTypes(const lldb_private::ConstString &name, + FindTypes(lldb_private::ConstString name, const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, @@ -212,40 +200,20 @@ public: GetTypeSystemForLanguage(lldb::LanguageType language) override; lldb_private::CompilerDeclContext FindNamespace( - const lldb_private::ConstString &name, + lldb_private::ConstString name, const lldb_private::CompilerDeclContext *parent_decl_ctx) override; void PreloadSymbols() override; std::recursive_mutex &GetModuleMutex() const override; - //------------------------------------------------------------------ // PluginInterface protocol - //------------------------------------------------------------------ lldb_private::ConstString GetPluginName() override; uint32_t GetPluginVersion() override; - virtual const lldb_private::DWARFDataExtractor &get_debug_abbrev_data(); - virtual const lldb_private::DWARFDataExtractor &get_debug_addr_data(); - const lldb_private::DWARFDataExtractor &get_debug_aranges_data(); - const lldb_private::DWARFDataExtractor &get_debug_frame_data(); - virtual const lldb_private::DWARFDataExtractor &get_debug_info_data(); - const lldb_private::DWARFDataExtractor &get_debug_line_data(); - const lldb_private::DWARFDataExtractor &get_debug_line_str_data(); - const lldb_private::DWARFDataExtractor &get_debug_macro_data(); const lldb_private::DWARFDataExtractor &get_debug_loc_data(); const lldb_private::DWARFDataExtractor &get_debug_loclists_data(); - const lldb_private::DWARFDataExtractor &get_debug_ranges_data(); - const lldb_private::DWARFDataExtractor &get_debug_rnglists_data(); - virtual const lldb_private::DWARFDataExtractor &get_debug_str_data(); - virtual const lldb_private::DWARFDataExtractor &get_debug_str_offsets_data(); - const lldb_private::DWARFDataExtractor &get_debug_types_data(); - const lldb_private::DWARFDataExtractor &get_apple_names_data(); - const lldb_private::DWARFDataExtractor &get_apple_types_data(); - const lldb_private::DWARFDataExtractor &get_apple_namespaces_data(); - const lldb_private::DWARFDataExtractor &get_apple_objc_data(); - const lldb_private::DWARFDataExtractor &get_gnu_debugaltlink(); DWARFDebugAbbrev *DebugAbbrev(); @@ -255,9 +223,8 @@ public: const DWARFDebugInfo *DebugInfo() const; - DWARFDebugRangesBase *DebugRanges(); - - const DWARFDebugRangesBase *DebugRanges() const; + DWARFDebugRangesBase *GetDebugRanges(); + DWARFDebugRangesBase *GetDebugRngLists(); const lldb_private::DWARFDataExtractor &DebugLocData(); @@ -270,8 +237,7 @@ public: HasForwardDeclForClangType(const lldb_private::CompilerType &compiler_type); lldb_private::CompileUnit * - GetCompUnitForDWARFCompUnit(DWARFUnit *dwarf_cu, - uint32_t cu_idx = UINT32_MAX); + GetCompUnitForDWARFCompUnit(DWARFCompileUnit &dwarf_cu); virtual size_t GetObjCMethodDIEOffsets(lldb_private::ConstString class_name, DIEArray &method_die_offsets); @@ -282,8 +248,7 @@ public: static DWARFDIE GetParentSymbolContextDIE(const DWARFDIE &die); - virtual lldb::CompUnitSP ParseCompileUnit(DWARFUnit *dwarf_cu, - uint32_t cu_idx); + virtual lldb::CompUnitSP ParseCompileUnit(DWARFCompileUnit &dwarf_cu); virtual lldb_private::DWARFExpression::LocationListFormat GetLocationListFormat() const; @@ -300,6 +265,18 @@ public: virtual DWARFDIE GetDIE(const DIERef &die_ref); + DWARFDIE GetDIE(lldb::user_id_t uid); + + lldb::user_id_t GetUID(const DWARFBaseDIE &die) { + return GetUID(die.GetDIERef()); + } + + lldb::user_id_t GetUID(const llvm::Optional<DIERef> &ref) { + return ref ? GetUID(*ref) : LLDB_INVALID_UID; + } + + lldb::user_id_t GetUID(DIERef ref); + virtual std::unique_ptr<SymbolFileDWARFDwo> GetDwoSymbolFileForCompileUnit(DWARFUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die); @@ -307,7 +284,9 @@ public: // For regular SymbolFileDWARF instances the method returns nullptr, // for the instances of the subclass SymbolFileDWARFDwo // the method returns a pointer to the base compile unit. - virtual DWARFUnit *GetBaseCompileUnit(); + virtual DWARFCompileUnit *GetBaseCompileUnit() { return nullptr; } + + virtual llvm::Optional<uint32_t> GetDwoNum() { return llvm::None; } static bool DIEInDeclContext(const lldb_private::CompilerDeclContext *parent_decl_ctx, @@ -320,6 +299,10 @@ public: void DumpClangAST(lldb_private::Stream &s) override; + lldb_private::DWARFContext &GetDWARFContext() { return m_context; } + + lldb_private::FileSpec GetFile(DWARFUnit &unit, size_t file_idx); + protected: typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr; @@ -328,7 +311,8 @@ protected: typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::opaque_compiler_type_t> DIEToClangType; - typedef llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> ClangTypeToDIE; + typedef llvm::DenseMap<lldb::opaque_compiler_type_t, lldb::user_id_t> + ClangTypeToDIE; struct DWARFDataSegment { llvm::once_flag m_flag; @@ -381,7 +365,7 @@ protected: const DWARFDIE &orig_die, const lldb::addr_t func_low_pc, bool parse_siblings, bool parse_children, - lldb_private::VariableList *cc_variable_list = NULL); + lldb_private::VariableList *cc_variable_list = nullptr); bool ClassOrStructIsVirtual(const DWARFDIE &die); @@ -393,11 +377,11 @@ protected: FindDefinitionTypeForDWARFDeclContext(const DWARFDeclContext &die_decl_ctx); virtual lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE( - const DWARFDIE &die, const lldb_private::ConstString &type_name, + const DWARFDIE &die, lldb_private::ConstString type_name, bool must_be_implementation); lldb_private::Symbol * - GetObjCClassSymbol(const lldb_private::ConstString &objc_class_name); + GetObjCClassSymbol(lldb_private::ConstString objc_class_name); lldb::TypeSP GetTypeForDIE(const DWARFDIE &die, bool resolve_function_context = false); @@ -421,7 +405,7 @@ protected: bool DIEDeclContextsMatch(const DWARFDIE &die1, const DWARFDIE &die2); bool ClassContainsSelector(const DWARFDIE &class_die, - const lldb_private::ConstString &selector); + lldb_private::ConstString selector); bool FixupAddress(lldb_private::Address &addr); @@ -451,44 +435,35 @@ protected: return m_forward_decl_clang_type_to_die; } + void BuildCuTranslationTable(); + llvm::Optional<uint32_t> GetDWARFUnitIndex(uint32_t cu_idx); + + struct DecodedUID { + SymbolFileDWARF &dwarf; + DIERef ref; + }; + llvm::Optional<DecodedUID> DecodeUID(lldb::user_id_t uid); + SymbolFileDWARFDwp *GetDwpSymbolFile(); + const lldb_private::FileSpecList &GetTypeUnitSupportFiles(DWARFTypeUnit &tu); + lldb::ModuleWP m_debug_map_module_wp; SymbolFileDWARFDebugMap *m_debug_map_symfile; llvm::once_flag m_dwp_symfile_once_flag; std::unique_ptr<SymbolFileDWARFDwp> m_dwp_symfile; - lldb_private::DWARFDataExtractor m_dwarf_data; + lldb_private::DWARFContext m_context; - DWARFDataSegment m_data_debug_abbrev; - DWARFDataSegment m_data_debug_addr; - DWARFDataSegment m_data_debug_aranges; - DWARFDataSegment m_data_debug_frame; - DWARFDataSegment m_data_debug_info; - DWARFDataSegment m_data_debug_line; - DWARFDataSegment m_data_debug_line_str; - DWARFDataSegment m_data_debug_macro; DWARFDataSegment m_data_debug_loc; DWARFDataSegment m_data_debug_loclists; - DWARFDataSegment m_data_debug_ranges; - DWARFDataSegment m_data_debug_rnglists; - DWARFDataSegment m_data_debug_str; - DWARFDataSegment m_data_debug_str_offsets; - DWARFDataSegment m_data_debug_types; - DWARFDataSegment m_data_apple_names; - DWARFDataSegment m_data_apple_types; - DWARFDataSegment m_data_apple_namespaces; - DWARFDataSegment m_data_apple_objc; - DWARFDataSegment m_data_gnu_debugaltlink; // The unique pointer items below are generated on demand if and when someone - // accesses - // them through a non const version of this class. + // accesses them through a non const version of this class. std::unique_ptr<DWARFDebugAbbrev> m_abbr; std::unique_ptr<DWARFDebugInfo> m_info; - std::unique_ptr<DWARFDebugLine> m_line; - std::unique_ptr<GlobalVariableMap> m_global_aranges_ap; + std::unique_ptr<GlobalVariableMap> m_global_aranges_up; typedef std::unordered_map<lldb::offset_t, lldb_private::DebugMacrosSP> DebugMacrosMap; @@ -499,15 +474,19 @@ protected: bool m_fetched_external_modules : 1; lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type; - typedef std::shared_ptr<std::set<DIERef>> DIERefSetSP; - typedef std::unordered_map<std::string, DIERefSetSP> NameToOffsetMap; + typedef std::set<lldb::user_id_t> DIERefSet; + typedef llvm::StringMap<DIERefSet> NameToOffsetMap; NameToOffsetMap m_function_scope_qualified_name_map; std::unique_ptr<DWARFDebugRangesBase> m_ranges; + std::unique_ptr<DWARFDebugRangesBase> m_rnglists; UniqueDWARFASTTypeMap m_unique_ast_type_map; DIEToTypePtr m_die_to_type; DIEToVariableSP m_die_to_variable_sp; DIEToClangType m_forward_decl_die_to_clang_type; ClangTypeToDIE m_forward_decl_clang_type_to_die; + llvm::DenseMap<dw_offset_t, lldb_private::FileSpecList> + m_type_unit_support_files; + std::vector<uint32_t> m_lldb_cu_to_dwarf_unit; }; #endif // SymbolFileDWARF_SymbolFileDWARF_h_ |