10b57cec5SDimitry Andric //===-- SymbolFileDWARFDebugMap.h ------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARFDEBUGMAP_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARFDEBUGMAP_H 110b57cec5SDimitry Andric 1206c3fb27SDimitry Andric #include "DIERef.h" 130b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h" 140b57cec5SDimitry Andric #include "lldb/Utility/RangeMap.h" 150b57cec5SDimitry Andric #include "llvm/Support/Chrono.h" 160b57cec5SDimitry Andric #include <bitset> 170b57cec5SDimitry Andric #include <map> 18bdd1243dSDimitry Andric #include <optional> 190b57cec5SDimitry Andric #include <vector> 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric #include "UniqueDWARFASTType.h" 225f757f3fSDimitry Andric #include "lldb/Utility/StructuredData.h" 23*0fca6ea1SDimitry Andric #include "lldb/lldb-private-enumerations.h" 240b57cec5SDimitry Andric 255f757f3fSDimitry Andric class DWARFASTParserClang; 265f757f3fSDimitry Andric 275f757f3fSDimitry Andric namespace lldb_private::plugin { 285f757f3fSDimitry Andric namespace dwarf { 290b57cec5SDimitry Andric class SymbolFileDWARF; 30bdd1243dSDimitry Andric class DWARFCompileUnit; 310b57cec5SDimitry Andric class DWARFDebugAranges; 320b57cec5SDimitry Andric class DWARFDeclContext; 330b57cec5SDimitry Andric 345f757f3fSDimitry Andric class SymbolFileDWARFDebugMap : public SymbolFileCommon { 35480093f4SDimitry Andric /// LLVM RTTI support. 36480093f4SDimitry Andric static char ID; 37480093f4SDimitry Andric 380b57cec5SDimitry Andric public: 39480093f4SDimitry Andric /// LLVM RTTI support. 40480093f4SDimitry Andric /// \{ 41480093f4SDimitry Andric bool isA(const void *ClassID) const override { 4281ad6265SDimitry Andric return ClassID == &ID || SymbolFileCommon::isA(ClassID); 43480093f4SDimitry Andric } 44480093f4SDimitry Andric static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } 45480093f4SDimitry Andric /// \} 46480093f4SDimitry Andric 470b57cec5SDimitry Andric // Static Functions 480b57cec5SDimitry Andric static void Initialize(); 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric static void Terminate(); 510b57cec5SDimitry Andric 52349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "dwarf-debugmap"; } 530b57cec5SDimitry Andric 54349cc55cSDimitry Andric static llvm::StringRef GetPluginDescriptionStatic(); 550b57cec5SDimitry Andric 565f757f3fSDimitry Andric static SymbolFile *CreateInstance(lldb::ObjectFileSP objfile_sp); 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric // Constructors and Destructors 599dba64beSDimitry Andric SymbolFileDWARFDebugMap(lldb::ObjectFileSP objfile_sp); 600b57cec5SDimitry Andric ~SymbolFileDWARFDebugMap() override; 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric uint32_t CalculateAbilities() override; 630b57cec5SDimitry Andric void InitializeObject() override; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric // Compile Unit function calls 665f757f3fSDimitry Andric lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) override; 675f757f3fSDimitry Andric XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) override; 6806c3fb27SDimitry Andric llvm::SmallSet<lldb::LanguageType, 4> 695f757f3fSDimitry Andric ParseAllLanguages(CompileUnit &comp_unit) override; 705f757f3fSDimitry Andric size_t ParseFunctions(CompileUnit &comp_unit) override; 715f757f3fSDimitry Andric bool ParseLineTable(CompileUnit &comp_unit) override; 725f757f3fSDimitry Andric bool ParseDebugMacros(CompileUnit &comp_unit) override; 730b57cec5SDimitry Andric 745f757f3fSDimitry Andric bool ForEachExternalModule(CompileUnit &, llvm::DenseSet<SymbolFile *> &, 755f757f3fSDimitry Andric llvm::function_ref<bool(Module &)>) override; 769dba64beSDimitry Andric 775f757f3fSDimitry Andric bool ParseSupportFiles(CompileUnit &comp_unit, 781db9f3b2SDimitry Andric SupportFileList &support_files) override; 790b57cec5SDimitry Andric 805f757f3fSDimitry Andric bool ParseIsOptimized(CompileUnit &comp_unit) override; 810b57cec5SDimitry Andric 825f757f3fSDimitry Andric size_t ParseTypes(CompileUnit &comp_unit) override; 830b57cec5SDimitry Andric 845f757f3fSDimitry Andric bool 855f757f3fSDimitry Andric ParseImportedModules(const SymbolContext &sc, 865f757f3fSDimitry Andric std::vector<SourceModule> &imported_modules) override; 875f757f3fSDimitry Andric size_t ParseBlocksRecursive(Function &func) override; 885f757f3fSDimitry Andric size_t ParseVariablesForContext(const SymbolContext &sc) override; 890b57cec5SDimitry Andric 905f757f3fSDimitry Andric Type *ResolveTypeUID(lldb::user_id_t type_uid) override; 915f757f3fSDimitry Andric std::optional<ArrayInfo> 925f757f3fSDimitry Andric GetDynamicArrayInfoForUID(lldb::user_id_t type_uid, 935f757f3fSDimitry Andric const ExecutionContext *exe_ctx) override; 940b57cec5SDimitry Andric 955f757f3fSDimitry Andric CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid) override; 965f757f3fSDimitry Andric CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid) override; 975f757f3fSDimitry Andric std::vector<CompilerContext> 985f757f3fSDimitry Andric GetCompilerContextForUID(lldb::user_id_t uid) override; 995f757f3fSDimitry Andric void ParseDeclsForContext(CompilerDeclContext decl_ctx) override; 1000b57cec5SDimitry Andric 1015f757f3fSDimitry Andric bool CompleteType(CompilerType &compiler_type) override; 1025f757f3fSDimitry Andric uint32_t ResolveSymbolContext(const Address &so_addr, 1030b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1045f757f3fSDimitry Andric SymbolContext &sc) override; 1055f757f3fSDimitry Andric uint32_t ResolveSymbolContext(const SourceLocationSpec &src_location_spec, 1060b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1075f757f3fSDimitry Andric SymbolContextList &sc_list) override; 108bdd1243dSDimitry Andric 1095f757f3fSDimitry Andric Status CalculateFrameVariableError(StackFrame &frame) override; 110bdd1243dSDimitry Andric 1115f757f3fSDimitry Andric void FindGlobalVariables(ConstString name, 1125f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 1130b57cec5SDimitry Andric uint32_t max_matches, 1145f757f3fSDimitry Andric VariableList &variables) override; 1155f757f3fSDimitry Andric void FindGlobalVariables(const RegularExpression ®ex, uint32_t max_matches, 1165f757f3fSDimitry Andric VariableList &variables) override; 1175f757f3fSDimitry Andric void FindFunctions(const Module::LookupInfo &lookup_info, 1185f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 1195f757f3fSDimitry Andric bool include_inlines, SymbolContextList &sc_list) override; 1205f757f3fSDimitry Andric void FindFunctions(const RegularExpression ®ex, bool include_inlines, 1215f757f3fSDimitry Andric SymbolContextList &sc_list) override; 1225f757f3fSDimitry Andric void FindTypes(const lldb_private::TypeQuery &match, 1235f757f3fSDimitry Andric lldb_private::TypeResults &results) override; 1245f757f3fSDimitry Andric CompilerDeclContext FindNamespace(ConstString name, 1255f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 12606c3fb27SDimitry Andric bool only_root_namespaces) override; 1275f757f3fSDimitry Andric void GetTypes(SymbolContextScope *sc_scope, lldb::TypeClass type_mask, 1285f757f3fSDimitry Andric TypeList &type_list) override; 1295f757f3fSDimitry Andric std::vector<std::unique_ptr<CallEdge>> 1305f757f3fSDimitry Andric ParseCallEdgesInFunction(UserID func_id) override; 1310b57cec5SDimitry Andric 1325f757f3fSDimitry Andric void DumpClangAST(Stream &s) override; 1335f757f3fSDimitry Andric 1345f757f3fSDimitry Andric /// List separate oso files. 1355f757f3fSDimitry Andric bool GetSeparateDebugInfo(StructuredData::Dictionary &d, 1365f757f3fSDimitry Andric bool errors_only) override; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric // PluginInterface protocol 139349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 1400b57cec5SDimitry Andric 14181ad6265SDimitry Andric // Statistics overrides. 1425f757f3fSDimitry Andric ModuleList GetDebugInfoModules() override; 1430b57cec5SDimitry Andric 1445f757f3fSDimitry Andric void 1455f757f3fSDimitry Andric GetCompileOptions(std::unordered_map<lldb::CompUnitSP, Args> &args) override; 14606c3fb27SDimitry Andric 1470b57cec5SDimitry Andric protected: 1480b57cec5SDimitry Andric enum { kHaveInitializedOSOs = (1 << 0), kNumFlags }; 1490b57cec5SDimitry Andric 1500b57cec5SDimitry Andric friend class DebugMapModule; 1515f757f3fSDimitry Andric friend class ::DWARFASTParserClang; 1520b57cec5SDimitry Andric friend class DWARFCompileUnit; 1530b57cec5SDimitry Andric friend class SymbolFileDWARF; 1540b57cec5SDimitry Andric struct OSOInfo { 1550b57cec5SDimitry Andric lldb::ModuleSP module_sp; 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric OSOInfo() : module_sp() {} 1580b57cec5SDimitry Andric }; 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric typedef std::shared_ptr<OSOInfo> OSOInfoSP; 1610b57cec5SDimitry Andric 1625f757f3fSDimitry Andric typedef RangeDataVector<lldb::addr_t, lldb::addr_t, lldb::addr_t> 1630b57cec5SDimitry Andric FileRangeMap; 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric // Class specific types 1660b57cec5SDimitry Andric struct CompileUnitInfo { 1675f757f3fSDimitry Andric FileSpec so_file; 1685f757f3fSDimitry Andric ConstString oso_path; 1690b57cec5SDimitry Andric llvm::sys::TimePoint<> oso_mod_time; 1705f757f3fSDimitry Andric Status oso_load_error; 1710b57cec5SDimitry Andric OSOInfoSP oso_sp; 172bdd1243dSDimitry Andric /// The compile units that an object file contains. 173bdd1243dSDimitry Andric llvm::SmallVector<lldb::CompUnitSP, 2> compile_units_sps; 174bdd1243dSDimitry Andric /// A map from the compile unit ID to its index in the vector. 175bdd1243dSDimitry Andric llvm::SmallDenseMap<uint64_t, uint64_t, 2> id_to_index_map; 176fe6060f1SDimitry Andric uint32_t first_symbol_index = UINT32_MAX; 177fe6060f1SDimitry Andric uint32_t last_symbol_index = UINT32_MAX; 178fe6060f1SDimitry Andric uint32_t first_symbol_id = UINT32_MAX; 179fe6060f1SDimitry Andric uint32_t last_symbol_id = UINT32_MAX; 1800b57cec5SDimitry Andric FileRangeMap file_range_map; 181fe6060f1SDimitry Andric bool file_range_map_valid = false; 1820b57cec5SDimitry Andric 183bdd1243dSDimitry Andric CompileUnitInfo() = default; 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric const FileRangeMap &GetFileRangeMap(SymbolFileDWARFDebugMap *exe_symfile); 1860b57cec5SDimitry Andric }; 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric // Protected Member Functions 1890b57cec5SDimitry Andric void InitOSO(); 1900b57cec5SDimitry Andric 191bdd1243dSDimitry Andric /// This function actually returns the number of object files, which may be 192bdd1243dSDimitry Andric /// less than the actual number of compile units, since an object file may 193bdd1243dSDimitry Andric /// contain more than one compile unit. SymbolFileDWARFDebugMap looks up the 194bdd1243dSDimitry Andric /// number of compile units by reading the nlist symbol table, which 195bdd1243dSDimitry Andric /// currently, on macOS, only reports one compile unit per object file, and 196bdd1243dSDimitry Andric /// there's no efficient way to calculate the actual number of compile units 197bdd1243dSDimitry Andric /// upfront. 1989dba64beSDimitry Andric uint32_t CalculateNumCompileUnits() override; 199bdd1243dSDimitry Andric 200bdd1243dSDimitry Andric /// This function actually returns the first compile unit the object file at 201bdd1243dSDimitry Andric /// the given index contains. 2029dba64beSDimitry Andric lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; 2039dba64beSDimitry Andric 2040b57cec5SDimitry Andric static uint32_t GetOSOIndexFromUserID(lldb::user_id_t uid) { 20506c3fb27SDimitry Andric std::optional<uint32_t> OsoNum = DIERef(uid).file_index(); 20606c3fb27SDimitry Andric lldbassert(OsoNum && "Invalid OSO Index"); 20706c3fb27SDimitry Andric return *OsoNum; 2080b57cec5SDimitry Andric } 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andric static SymbolFileDWARF *GetSymbolFileAsSymbolFileDWARF(SymbolFile *sym_file); 2110b57cec5SDimitry Andric 2125f757f3fSDimitry Andric bool GetFileSpecForSO(uint32_t oso_idx, FileSpec &file_spec); 2130b57cec5SDimitry Andric 2145f757f3fSDimitry Andric CompileUnitInfo *GetCompUnitInfo(const SymbolContext &sc); 2155f757f3fSDimitry Andric CompileUnitInfo *GetCompUnitInfo(const CompileUnit &comp_unit); 2160b57cec5SDimitry Andric 2175f757f3fSDimitry Andric size_t GetCompUnitInfosForModule(const Module *oso_module, 2180b57cec5SDimitry Andric std::vector<CompileUnitInfo *> &cu_infos); 2190b57cec5SDimitry Andric 2205f757f3fSDimitry Andric Module *GetModuleByCompUnitInfo(CompileUnitInfo *comp_unit_info); 2210b57cec5SDimitry Andric 2225f757f3fSDimitry Andric Module *GetModuleByOSOIndex(uint32_t oso_idx); 2230b57cec5SDimitry Andric 2245f757f3fSDimitry Andric ObjectFile *GetObjectFileByCompUnitInfo(CompileUnitInfo *comp_unit_info); 2250b57cec5SDimitry Andric 2265f757f3fSDimitry Andric ObjectFile *GetObjectFileByOSOIndex(uint32_t oso_idx); 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric uint32_t GetCompUnitInfoIndex(const CompileUnitInfo *comp_unit_info); 2290b57cec5SDimitry Andric 2305f757f3fSDimitry Andric SymbolFileDWARF *GetSymbolFile(const SymbolContext &sc); 2315f757f3fSDimitry Andric SymbolFileDWARF *GetSymbolFile(const CompileUnit &comp_unit); 2320b57cec5SDimitry Andric 2330b57cec5SDimitry Andric SymbolFileDWARF *GetSymbolFileByCompUnitInfo(CompileUnitInfo *comp_unit_info); 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andric SymbolFileDWARF *GetSymbolFileByOSOIndex(uint32_t oso_idx); 2360b57cec5SDimitry Andric 237*0fca6ea1SDimitry Andric /// If closure returns \ref IterationAction::Continue, iteration 238*0fca6ea1SDimitry Andric /// continues. Otherwise, iteration terminates. 239*0fca6ea1SDimitry Andric void 240*0fca6ea1SDimitry Andric ForEachSymbolFile(std::function<IterationAction(SymbolFileDWARF *)> closure) { 2410b57cec5SDimitry Andric for (uint32_t oso_idx = 0, num_oso_idxs = m_compile_unit_infos.size(); 2420b57cec5SDimitry Andric oso_idx < num_oso_idxs; ++oso_idx) { 2430b57cec5SDimitry Andric if (SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx)) { 244*0fca6ea1SDimitry Andric if (closure(oso_dwarf) == IterationAction::Stop) 2450b57cec5SDimitry Andric return; 2460b57cec5SDimitry Andric } 2470b57cec5SDimitry Andric } 2480b57cec5SDimitry Andric } 2490b57cec5SDimitry Andric 2500b57cec5SDimitry Andric CompileUnitInfo *GetCompileUnitInfoForSymbolWithIndex(uint32_t symbol_idx, 2510b57cec5SDimitry Andric uint32_t *oso_idx_ptr); 2520b57cec5SDimitry Andric 2530b57cec5SDimitry Andric CompileUnitInfo *GetCompileUnitInfoForSymbolWithID(lldb::user_id_t symbol_id, 2540b57cec5SDimitry Andric uint32_t *oso_idx_ptr); 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric static int 2570b57cec5SDimitry Andric SymbolContainsSymbolWithIndex(uint32_t *symbol_idx_ptr, 2580b57cec5SDimitry Andric const CompileUnitInfo *comp_unit_info); 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric static int SymbolContainsSymbolWithID(lldb::user_id_t *symbol_idx_ptr, 2610b57cec5SDimitry Andric const CompileUnitInfo *comp_unit_info); 2620b57cec5SDimitry Andric 2635f757f3fSDimitry Andric void 2645f757f3fSDimitry Andric PrivateFindGlobalVariables(ConstString name, 2655f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 2665f757f3fSDimitry Andric const std::vector<uint32_t> &name_symbol_indexes, 2675f757f3fSDimitry Andric uint32_t max_matches, VariableList &variables); 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric void SetCompileUnit(SymbolFileDWARF *oso_dwarf, 2700b57cec5SDimitry Andric const lldb::CompUnitSP &cu_sp); 2710b57cec5SDimitry Andric 272bdd1243dSDimitry Andric /// Returns the compile unit associated with the dwarf compile unit. This may 273bdd1243dSDimitry Andric /// be one of the extra compile units an object file contains which isn't 274bdd1243dSDimitry Andric /// reachable by ParseCompileUnitAtIndex(uint32_t). 275bdd1243dSDimitry Andric lldb::CompUnitSP GetCompileUnit(SymbolFileDWARF *oso_dwarf, 276bdd1243dSDimitry Andric DWARFCompileUnit &dwarf_cu); 2770b57cec5SDimitry Andric 2780b57cec5SDimitry Andric CompileUnitInfo *GetCompileUnitInfo(SymbolFileDWARF *oso_dwarf); 2790b57cec5SDimitry Andric 280*0fca6ea1SDimitry Andric DWARFDIE FindDefinitionDIE(const DWARFDIE &die); 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric bool Supports_DW_AT_APPLE_objc_complete_type(SymbolFileDWARF *skip_dwarf_oso); 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andric lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE( 2855f757f3fSDimitry Andric const DWARFDIE &die, ConstString type_name, bool must_be_implementation); 2860b57cec5SDimitry Andric 287*0fca6ea1SDimitry Andric llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> & 288*0fca6ea1SDimitry Andric GetForwardDeclCompilerTypeToDIE() { 289*0fca6ea1SDimitry Andric return m_forward_decl_compiler_type_to_die; 290*0fca6ea1SDimitry Andric } 291*0fca6ea1SDimitry Andric 2920b57cec5SDimitry Andric UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap() { 2930b57cec5SDimitry Andric return m_unique_ast_type_map; 2940b57cec5SDimitry Andric } 2950b57cec5SDimitry Andric 2960b57cec5SDimitry Andric // OSOEntry 2970b57cec5SDimitry Andric class OSOEntry { 2980b57cec5SDimitry Andric public: 299fe6060f1SDimitry Andric OSOEntry() = default; 3000b57cec5SDimitry Andric 3010b57cec5SDimitry Andric OSOEntry(uint32_t exe_sym_idx, lldb::addr_t oso_file_addr) 3020b57cec5SDimitry Andric : m_exe_sym_idx(exe_sym_idx), m_oso_file_addr(oso_file_addr) {} 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric uint32_t GetExeSymbolIndex() const { return m_exe_sym_idx; } 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andric bool operator<(const OSOEntry &rhs) const { 3070b57cec5SDimitry Andric return m_exe_sym_idx < rhs.m_exe_sym_idx; 3080b57cec5SDimitry Andric } 3090b57cec5SDimitry Andric 3100b57cec5SDimitry Andric lldb::addr_t GetOSOFileAddress() const { return m_oso_file_addr; } 3110b57cec5SDimitry Andric 3120b57cec5SDimitry Andric void SetOSOFileAddress(lldb::addr_t oso_file_addr) { 3130b57cec5SDimitry Andric m_oso_file_addr = oso_file_addr; 3140b57cec5SDimitry Andric } 3150b57cec5SDimitry Andric 3160b57cec5SDimitry Andric protected: 317fe6060f1SDimitry Andric uint32_t m_exe_sym_idx = UINT32_MAX; 318fe6060f1SDimitry Andric lldb::addr_t m_oso_file_addr = LLDB_INVALID_ADDRESS; 3190b57cec5SDimitry Andric }; 3200b57cec5SDimitry Andric 3215f757f3fSDimitry Andric typedef RangeDataVector<lldb::addr_t, lldb::addr_t, OSOEntry> DebugMap; 3220b57cec5SDimitry Andric 3230b57cec5SDimitry Andric // Member Variables 3240b57cec5SDimitry Andric std::bitset<kNumFlags> m_flags; 3250b57cec5SDimitry Andric std::vector<CompileUnitInfo> m_compile_unit_infos; 3260b57cec5SDimitry Andric std::vector<uint32_t> m_func_indexes; // Sorted by address 3270b57cec5SDimitry Andric std::vector<uint32_t> m_glob_indexes; 3285f757f3fSDimitry Andric std::map<std::pair<ConstString, llvm::sys::TimePoint<>>, OSOInfoSP> m_oso_map; 329*0fca6ea1SDimitry Andric // A map from CompilerType to the struct/class/union/enum DIE (might be a 330*0fca6ea1SDimitry Andric // declaration or a definition) that is used to construct it. 331*0fca6ea1SDimitry Andric llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> 332*0fca6ea1SDimitry Andric m_forward_decl_compiler_type_to_die; 3330b57cec5SDimitry Andric UniqueDWARFASTTypeMap m_unique_ast_type_map; 3345f757f3fSDimitry Andric LazyBool m_supports_DW_AT_APPLE_objc_complete_type; 3350b57cec5SDimitry Andric DebugMap m_debug_map; 3360b57cec5SDimitry Andric 3370b57cec5SDimitry Andric // When an object file from the debug map gets parsed in 3380b57cec5SDimitry Andric // SymbolFileDWARF, it needs to tell the debug map about the object 3390b57cec5SDimitry Andric // files addresses by calling this function once for each N_FUN, 3400b57cec5SDimitry Andric // N_GSYM and N_STSYM and after all entries in the debug map have 3410b57cec5SDimitry Andric // been matched up, FinalizeOSOFileRanges() should be called. 3420b57cec5SDimitry Andric bool AddOSOFileRange(CompileUnitInfo *cu_info, lldb::addr_t exe_file_addr, 3430b57cec5SDimitry Andric lldb::addr_t exe_byte_size, lldb::addr_t oso_file_addr, 3440b57cec5SDimitry Andric lldb::addr_t oso_byte_size); 3450b57cec5SDimitry Andric 3460b57cec5SDimitry Andric // Called after calling AddOSOFileRange() for each object file debug 3470b57cec5SDimitry Andric // map entry to finalize the info for the unlinked compile unit. 3480b57cec5SDimitry Andric void FinalizeOSOFileRanges(CompileUnitInfo *cu_info); 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andric /// Convert \a addr from a .o file address, to an executable address. 3510b57cec5SDimitry Andric /// 3520b57cec5SDimitry Andric /// \param[in] addr 3530b57cec5SDimitry Andric /// A section offset address from a .o file 3540b57cec5SDimitry Andric /// 3550b57cec5SDimitry Andric /// \return 3560b57cec5SDimitry Andric /// Returns true if \a addr was converted to be an executable 3570b57cec5SDimitry Andric /// section/offset address, false otherwise. 3585f757f3fSDimitry Andric bool LinkOSOAddress(Address &addr); 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andric /// Convert a .o file "file address" to an executable "file address". 3610b57cec5SDimitry Andric /// 3620b57cec5SDimitry Andric /// \param[in] oso_symfile 3630b57cec5SDimitry Andric /// The DWARF symbol file that contains \a oso_file_addr 3640b57cec5SDimitry Andric /// 3650b57cec5SDimitry Andric /// \param[in] oso_file_addr 3660b57cec5SDimitry Andric /// A .o file "file address" to convert. 3670b57cec5SDimitry Andric /// 3680b57cec5SDimitry Andric /// \return 3690b57cec5SDimitry Andric /// LLDB_INVALID_ADDRESS if \a oso_file_addr is not in the 3700b57cec5SDimitry Andric /// linked executable, otherwise a valid "file address" from the 3710b57cec5SDimitry Andric /// linked executable that contains the debug map. 3720b57cec5SDimitry Andric lldb::addr_t LinkOSOFileAddress(SymbolFileDWARF *oso_symfile, 3730b57cec5SDimitry Andric lldb::addr_t oso_file_addr); 3740b57cec5SDimitry Andric 3750b57cec5SDimitry Andric /// Given a line table full of lines with "file addresses" that are 3760b57cec5SDimitry Andric /// for a .o file represented by \a oso_symfile, link a new line table 3770b57cec5SDimitry Andric /// and return it. 3780b57cec5SDimitry Andric /// 3790b57cec5SDimitry Andric /// \param[in] oso_symfile 3800b57cec5SDimitry Andric /// The DWARF symbol file that produced the \a line_table 3810b57cec5SDimitry Andric /// 382480093f4SDimitry Andric /// \param[in] line_table 383480093f4SDimitry Andric /// A pointer to the line table. 3840b57cec5SDimitry Andric /// 3850b57cec5SDimitry Andric /// \return 3860b57cec5SDimitry Andric /// Returns a valid line table full of linked addresses, or NULL 3870b57cec5SDimitry Andric /// if none of the line table addresses exist in the main 3880b57cec5SDimitry Andric /// executable. 3895f757f3fSDimitry Andric LineTable *LinkOSOLineTable(SymbolFileDWARF *oso_symfile, 3905f757f3fSDimitry Andric LineTable *line_table); 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andric size_t AddOSOARanges(SymbolFileDWARF *dwarf2Data, 3930b57cec5SDimitry Andric DWARFDebugAranges *debug_aranges); 3940b57cec5SDimitry Andric }; 3955f757f3fSDimitry Andric } // namespace dwarf 3965f757f3fSDimitry Andric } // namespace lldb_private::plugin 3970b57cec5SDimitry Andric 3985ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARFDEBUGMAP_H 399