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" 230b57cec5SDimitry Andric 245f757f3fSDimitry Andric class DWARFASTParserClang; 255f757f3fSDimitry Andric 265f757f3fSDimitry Andric namespace lldb_private::plugin { 275f757f3fSDimitry Andric namespace dwarf { 280b57cec5SDimitry Andric class SymbolFileDWARF; 29bdd1243dSDimitry Andric class DWARFCompileUnit; 300b57cec5SDimitry Andric class DWARFDebugAranges; 310b57cec5SDimitry Andric class DWARFDeclContext; 320b57cec5SDimitry Andric 335f757f3fSDimitry Andric class SymbolFileDWARFDebugMap : public SymbolFileCommon { 34480093f4SDimitry Andric /// LLVM RTTI support. 35480093f4SDimitry Andric static char ID; 36480093f4SDimitry Andric 370b57cec5SDimitry Andric public: 38480093f4SDimitry Andric /// LLVM RTTI support. 39480093f4SDimitry Andric /// \{ isA(const void * ClassID)40480093f4SDimitry Andric bool isA(const void *ClassID) const override { 4181ad6265SDimitry Andric return ClassID == &ID || SymbolFileCommon::isA(ClassID); 42480093f4SDimitry Andric } classof(const SymbolFile * obj)43480093f4SDimitry Andric static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } 44480093f4SDimitry Andric /// \} 45480093f4SDimitry Andric 460b57cec5SDimitry Andric // Static Functions 470b57cec5SDimitry Andric static void Initialize(); 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric static void Terminate(); 500b57cec5SDimitry Andric GetPluginNameStatic()51349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "dwarf-debugmap"; } 520b57cec5SDimitry Andric 53349cc55cSDimitry Andric static llvm::StringRef GetPluginDescriptionStatic(); 540b57cec5SDimitry Andric 555f757f3fSDimitry Andric static SymbolFile *CreateInstance(lldb::ObjectFileSP objfile_sp); 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric // Constructors and Destructors 589dba64beSDimitry Andric SymbolFileDWARFDebugMap(lldb::ObjectFileSP objfile_sp); 590b57cec5SDimitry Andric ~SymbolFileDWARFDebugMap() override; 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric uint32_t CalculateAbilities() override; 620b57cec5SDimitry Andric void InitializeObject() override; 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric // Compile Unit function calls 655f757f3fSDimitry Andric lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) override; 665f757f3fSDimitry Andric XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) override; 6706c3fb27SDimitry Andric llvm::SmallSet<lldb::LanguageType, 4> 685f757f3fSDimitry Andric ParseAllLanguages(CompileUnit &comp_unit) override; 695f757f3fSDimitry Andric size_t ParseFunctions(CompileUnit &comp_unit) override; 705f757f3fSDimitry Andric bool ParseLineTable(CompileUnit &comp_unit) override; 715f757f3fSDimitry Andric bool ParseDebugMacros(CompileUnit &comp_unit) override; 720b57cec5SDimitry Andric 735f757f3fSDimitry Andric bool ForEachExternalModule(CompileUnit &, llvm::DenseSet<SymbolFile *> &, 745f757f3fSDimitry Andric llvm::function_ref<bool(Module &)>) override; 759dba64beSDimitry Andric 765f757f3fSDimitry Andric bool ParseSupportFiles(CompileUnit &comp_unit, 771db9f3b2SDimitry Andric SupportFileList &support_files) override; 780b57cec5SDimitry Andric 795f757f3fSDimitry Andric bool ParseIsOptimized(CompileUnit &comp_unit) override; 800b57cec5SDimitry Andric 815f757f3fSDimitry Andric size_t ParseTypes(CompileUnit &comp_unit) override; 820b57cec5SDimitry Andric 835f757f3fSDimitry Andric bool 845f757f3fSDimitry Andric ParseImportedModules(const SymbolContext &sc, 855f757f3fSDimitry Andric std::vector<SourceModule> &imported_modules) override; 865f757f3fSDimitry Andric size_t ParseBlocksRecursive(Function &func) override; 875f757f3fSDimitry Andric size_t ParseVariablesForContext(const SymbolContext &sc) override; 880b57cec5SDimitry Andric 895f757f3fSDimitry Andric Type *ResolveTypeUID(lldb::user_id_t type_uid) override; 905f757f3fSDimitry Andric std::optional<ArrayInfo> 915f757f3fSDimitry Andric GetDynamicArrayInfoForUID(lldb::user_id_t type_uid, 925f757f3fSDimitry Andric const ExecutionContext *exe_ctx) override; 930b57cec5SDimitry Andric 945f757f3fSDimitry Andric CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid) override; 955f757f3fSDimitry Andric CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid) override; 965f757f3fSDimitry Andric std::vector<CompilerContext> 975f757f3fSDimitry Andric GetCompilerContextForUID(lldb::user_id_t uid) override; 985f757f3fSDimitry Andric void ParseDeclsForContext(CompilerDeclContext decl_ctx) override; 990b57cec5SDimitry Andric 1005f757f3fSDimitry Andric bool CompleteType(CompilerType &compiler_type) override; 1015f757f3fSDimitry Andric uint32_t ResolveSymbolContext(const Address &so_addr, 1020b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1035f757f3fSDimitry Andric SymbolContext &sc) override; 1045f757f3fSDimitry Andric uint32_t ResolveSymbolContext(const SourceLocationSpec &src_location_spec, 1050b57cec5SDimitry Andric lldb::SymbolContextItem resolve_scope, 1065f757f3fSDimitry Andric SymbolContextList &sc_list) override; 107bdd1243dSDimitry Andric 1085f757f3fSDimitry Andric Status CalculateFrameVariableError(StackFrame &frame) override; 109bdd1243dSDimitry Andric 1105f757f3fSDimitry Andric void FindGlobalVariables(ConstString name, 1115f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 1120b57cec5SDimitry Andric uint32_t max_matches, 1135f757f3fSDimitry Andric VariableList &variables) override; 1145f757f3fSDimitry Andric void FindGlobalVariables(const RegularExpression ®ex, uint32_t max_matches, 1155f757f3fSDimitry Andric VariableList &variables) override; 1165f757f3fSDimitry Andric void FindFunctions(const Module::LookupInfo &lookup_info, 1175f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 1185f757f3fSDimitry Andric bool include_inlines, SymbolContextList &sc_list) override; 1195f757f3fSDimitry Andric void FindFunctions(const RegularExpression ®ex, bool include_inlines, 1205f757f3fSDimitry Andric SymbolContextList &sc_list) override; 1215f757f3fSDimitry Andric void FindTypes(const lldb_private::TypeQuery &match, 1225f757f3fSDimitry Andric lldb_private::TypeResults &results) override; 1235f757f3fSDimitry Andric CompilerDeclContext FindNamespace(ConstString name, 1245f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 12506c3fb27SDimitry Andric bool only_root_namespaces) override; 1265f757f3fSDimitry Andric void GetTypes(SymbolContextScope *sc_scope, lldb::TypeClass type_mask, 1275f757f3fSDimitry Andric TypeList &type_list) override; 1285f757f3fSDimitry Andric std::vector<std::unique_ptr<CallEdge>> 1295f757f3fSDimitry Andric ParseCallEdgesInFunction(UserID func_id) override; 1300b57cec5SDimitry Andric 1315f757f3fSDimitry Andric void DumpClangAST(Stream &s) override; 1325f757f3fSDimitry Andric 1335f757f3fSDimitry Andric /// List separate oso files. 1345f757f3fSDimitry Andric bool GetSeparateDebugInfo(StructuredData::Dictionary &d, 1355f757f3fSDimitry Andric bool errors_only) override; 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric // PluginInterface protocol GetPluginName()138349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 1390b57cec5SDimitry Andric 14081ad6265SDimitry Andric // Statistics overrides. 1415f757f3fSDimitry Andric ModuleList GetDebugInfoModules() override; 1420b57cec5SDimitry Andric 1435f757f3fSDimitry Andric void 1445f757f3fSDimitry Andric GetCompileOptions(std::unordered_map<lldb::CompUnitSP, Args> &args) override; 14506c3fb27SDimitry Andric 1460b57cec5SDimitry Andric protected: 1470b57cec5SDimitry Andric enum { kHaveInitializedOSOs = (1 << 0), kNumFlags }; 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andric friend class DebugMapModule; 1505f757f3fSDimitry Andric friend class ::DWARFASTParserClang; 1510b57cec5SDimitry Andric friend class DWARFCompileUnit; 1520b57cec5SDimitry Andric friend class SymbolFileDWARF; 1530b57cec5SDimitry Andric struct OSOInfo { 1540b57cec5SDimitry Andric lldb::ModuleSP module_sp; 1550b57cec5SDimitry Andric OSOInfoOSOInfo1560b57cec5SDimitry Andric OSOInfo() : module_sp() {} 1570b57cec5SDimitry Andric }; 1580b57cec5SDimitry Andric 1590b57cec5SDimitry Andric typedef std::shared_ptr<OSOInfo> OSOInfoSP; 1600b57cec5SDimitry Andric 1615f757f3fSDimitry Andric typedef RangeDataVector<lldb::addr_t, lldb::addr_t, lldb::addr_t> 1620b57cec5SDimitry Andric FileRangeMap; 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric // Class specific types 1650b57cec5SDimitry Andric struct CompileUnitInfo { 1665f757f3fSDimitry Andric FileSpec so_file; 1675f757f3fSDimitry Andric ConstString oso_path; 1680b57cec5SDimitry Andric llvm::sys::TimePoint<> oso_mod_time; 1695f757f3fSDimitry Andric Status oso_load_error; 1700b57cec5SDimitry Andric OSOInfoSP oso_sp; 171bdd1243dSDimitry Andric /// The compile units that an object file contains. 172bdd1243dSDimitry Andric llvm::SmallVector<lldb::CompUnitSP, 2> compile_units_sps; 173bdd1243dSDimitry Andric /// A map from the compile unit ID to its index in the vector. 174bdd1243dSDimitry Andric llvm::SmallDenseMap<uint64_t, uint64_t, 2> id_to_index_map; 175fe6060f1SDimitry Andric uint32_t first_symbol_index = UINT32_MAX; 176fe6060f1SDimitry Andric uint32_t last_symbol_index = UINT32_MAX; 177fe6060f1SDimitry Andric uint32_t first_symbol_id = UINT32_MAX; 178fe6060f1SDimitry Andric uint32_t last_symbol_id = UINT32_MAX; 1790b57cec5SDimitry Andric FileRangeMap file_range_map; 180fe6060f1SDimitry Andric bool file_range_map_valid = false; 1810b57cec5SDimitry Andric 182bdd1243dSDimitry Andric CompileUnitInfo() = default; 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric const FileRangeMap &GetFileRangeMap(SymbolFileDWARFDebugMap *exe_symfile); 1850b57cec5SDimitry Andric }; 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric // Protected Member Functions 1880b57cec5SDimitry Andric void InitOSO(); 1890b57cec5SDimitry Andric 190bdd1243dSDimitry Andric /// This function actually returns the number of object files, which may be 191bdd1243dSDimitry Andric /// less than the actual number of compile units, since an object file may 192bdd1243dSDimitry Andric /// contain more than one compile unit. SymbolFileDWARFDebugMap looks up the 193bdd1243dSDimitry Andric /// number of compile units by reading the nlist symbol table, which 194bdd1243dSDimitry Andric /// currently, on macOS, only reports one compile unit per object file, and 195bdd1243dSDimitry Andric /// there's no efficient way to calculate the actual number of compile units 196bdd1243dSDimitry Andric /// upfront. 1979dba64beSDimitry Andric uint32_t CalculateNumCompileUnits() override; 198bdd1243dSDimitry Andric 199bdd1243dSDimitry Andric /// This function actually returns the first compile unit the object file at 200bdd1243dSDimitry Andric /// the given index contains. 2019dba64beSDimitry Andric lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; 2029dba64beSDimitry Andric GetOSOIndexFromUserID(lldb::user_id_t uid)2030b57cec5SDimitry Andric static uint32_t GetOSOIndexFromUserID(lldb::user_id_t uid) { 20406c3fb27SDimitry Andric std::optional<uint32_t> OsoNum = DIERef(uid).file_index(); 20506c3fb27SDimitry Andric lldbassert(OsoNum && "Invalid OSO Index"); 20606c3fb27SDimitry Andric return *OsoNum; 2070b57cec5SDimitry Andric } 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric static SymbolFileDWARF *GetSymbolFileAsSymbolFileDWARF(SymbolFile *sym_file); 2100b57cec5SDimitry Andric 2115f757f3fSDimitry Andric bool GetFileSpecForSO(uint32_t oso_idx, FileSpec &file_spec); 2120b57cec5SDimitry Andric 2135f757f3fSDimitry Andric CompileUnitInfo *GetCompUnitInfo(const SymbolContext &sc); 2145f757f3fSDimitry Andric CompileUnitInfo *GetCompUnitInfo(const CompileUnit &comp_unit); 2150b57cec5SDimitry Andric 2165f757f3fSDimitry Andric size_t GetCompUnitInfosForModule(const Module *oso_module, 2170b57cec5SDimitry Andric std::vector<CompileUnitInfo *> &cu_infos); 2180b57cec5SDimitry Andric 2195f757f3fSDimitry Andric Module *GetModuleByCompUnitInfo(CompileUnitInfo *comp_unit_info); 2200b57cec5SDimitry Andric 2215f757f3fSDimitry Andric Module *GetModuleByOSOIndex(uint32_t oso_idx); 2220b57cec5SDimitry Andric 2235f757f3fSDimitry Andric ObjectFile *GetObjectFileByCompUnitInfo(CompileUnitInfo *comp_unit_info); 2240b57cec5SDimitry Andric 2255f757f3fSDimitry Andric ObjectFile *GetObjectFileByOSOIndex(uint32_t oso_idx); 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andric uint32_t GetCompUnitInfoIndex(const CompileUnitInfo *comp_unit_info); 2280b57cec5SDimitry Andric 2295f757f3fSDimitry Andric SymbolFileDWARF *GetSymbolFile(const SymbolContext &sc); 2305f757f3fSDimitry Andric SymbolFileDWARF *GetSymbolFile(const CompileUnit &comp_unit); 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric SymbolFileDWARF *GetSymbolFileByCompUnitInfo(CompileUnitInfo *comp_unit_info); 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andric SymbolFileDWARF *GetSymbolFileByOSOIndex(uint32_t oso_idx); 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric // If closure returns "false", iteration continues. If it returns 2370b57cec5SDimitry Andric // "true", iteration terminates. ForEachSymbolFile(std::function<bool (SymbolFileDWARF *)> closure)2380b57cec5SDimitry Andric void ForEachSymbolFile(std::function<bool(SymbolFileDWARF *)> closure) { 2390b57cec5SDimitry Andric for (uint32_t oso_idx = 0, num_oso_idxs = m_compile_unit_infos.size(); 2400b57cec5SDimitry Andric oso_idx < num_oso_idxs; ++oso_idx) { 2410b57cec5SDimitry Andric if (SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx)) { 2420b57cec5SDimitry Andric if (closure(oso_dwarf)) 2430b57cec5SDimitry Andric return; 2440b57cec5SDimitry Andric } 2450b57cec5SDimitry Andric } 2460b57cec5SDimitry Andric } 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andric CompileUnitInfo *GetCompileUnitInfoForSymbolWithIndex(uint32_t symbol_idx, 2490b57cec5SDimitry Andric uint32_t *oso_idx_ptr); 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andric CompileUnitInfo *GetCompileUnitInfoForSymbolWithID(lldb::user_id_t symbol_id, 2520b57cec5SDimitry Andric uint32_t *oso_idx_ptr); 2530b57cec5SDimitry Andric 2540b57cec5SDimitry Andric static int 2550b57cec5SDimitry Andric SymbolContainsSymbolWithIndex(uint32_t *symbol_idx_ptr, 2560b57cec5SDimitry Andric const CompileUnitInfo *comp_unit_info); 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric static int SymbolContainsSymbolWithID(lldb::user_id_t *symbol_idx_ptr, 2590b57cec5SDimitry Andric const CompileUnitInfo *comp_unit_info); 2600b57cec5SDimitry Andric 2615f757f3fSDimitry Andric void 2625f757f3fSDimitry Andric PrivateFindGlobalVariables(ConstString name, 2635f757f3fSDimitry Andric const CompilerDeclContext &parent_decl_ctx, 2645f757f3fSDimitry Andric const std::vector<uint32_t> &name_symbol_indexes, 2655f757f3fSDimitry Andric uint32_t max_matches, VariableList &variables); 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andric void SetCompileUnit(SymbolFileDWARF *oso_dwarf, 2680b57cec5SDimitry Andric const lldb::CompUnitSP &cu_sp); 2690b57cec5SDimitry Andric 270bdd1243dSDimitry Andric /// Returns the compile unit associated with the dwarf compile unit. This may 271bdd1243dSDimitry Andric /// be one of the extra compile units an object file contains which isn't 272bdd1243dSDimitry Andric /// reachable by ParseCompileUnitAtIndex(uint32_t). 273bdd1243dSDimitry Andric lldb::CompUnitSP GetCompileUnit(SymbolFileDWARF *oso_dwarf, 274bdd1243dSDimitry Andric DWARFCompileUnit &dwarf_cu); 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric CompileUnitInfo *GetCompileUnitInfo(SymbolFileDWARF *oso_dwarf); 2770b57cec5SDimitry Andric 278bdd1243dSDimitry Andric lldb::TypeSP FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die); 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric bool Supports_DW_AT_APPLE_objc_complete_type(SymbolFileDWARF *skip_dwarf_oso); 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE( 2835f757f3fSDimitry Andric const DWARFDIE &die, ConstString type_name, bool must_be_implementation); 2840b57cec5SDimitry Andric GetUniqueDWARFASTTypeMap()2850b57cec5SDimitry Andric UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap() { 2860b57cec5SDimitry Andric return m_unique_ast_type_map; 2870b57cec5SDimitry Andric } 2880b57cec5SDimitry Andric 2890b57cec5SDimitry Andric // OSOEntry 2900b57cec5SDimitry Andric class OSOEntry { 2910b57cec5SDimitry Andric public: 292fe6060f1SDimitry Andric OSOEntry() = default; 2930b57cec5SDimitry Andric OSOEntry(uint32_t exe_sym_idx,lldb::addr_t oso_file_addr)2940b57cec5SDimitry Andric OSOEntry(uint32_t exe_sym_idx, lldb::addr_t oso_file_addr) 2950b57cec5SDimitry Andric : m_exe_sym_idx(exe_sym_idx), m_oso_file_addr(oso_file_addr) {} 2960b57cec5SDimitry Andric GetExeSymbolIndex()2970b57cec5SDimitry Andric uint32_t GetExeSymbolIndex() const { return m_exe_sym_idx; } 2980b57cec5SDimitry Andric 2990b57cec5SDimitry Andric bool operator<(const OSOEntry &rhs) const { 3000b57cec5SDimitry Andric return m_exe_sym_idx < rhs.m_exe_sym_idx; 3010b57cec5SDimitry Andric } 3020b57cec5SDimitry Andric GetOSOFileAddress()3030b57cec5SDimitry Andric lldb::addr_t GetOSOFileAddress() const { return m_oso_file_addr; } 3040b57cec5SDimitry Andric SetOSOFileAddress(lldb::addr_t oso_file_addr)3050b57cec5SDimitry Andric void SetOSOFileAddress(lldb::addr_t oso_file_addr) { 3060b57cec5SDimitry Andric m_oso_file_addr = oso_file_addr; 3070b57cec5SDimitry Andric } 3080b57cec5SDimitry Andric 3090b57cec5SDimitry Andric protected: 310fe6060f1SDimitry Andric uint32_t m_exe_sym_idx = UINT32_MAX; 311fe6060f1SDimitry Andric lldb::addr_t m_oso_file_addr = LLDB_INVALID_ADDRESS; 3120b57cec5SDimitry Andric }; 3130b57cec5SDimitry Andric 3145f757f3fSDimitry Andric typedef RangeDataVector<lldb::addr_t, lldb::addr_t, OSOEntry> DebugMap; 3150b57cec5SDimitry Andric 3160b57cec5SDimitry Andric // Member Variables 3170b57cec5SDimitry Andric std::bitset<kNumFlags> m_flags; 3180b57cec5SDimitry Andric std::vector<CompileUnitInfo> m_compile_unit_infos; 3190b57cec5SDimitry Andric std::vector<uint32_t> m_func_indexes; // Sorted by address 3200b57cec5SDimitry Andric std::vector<uint32_t> m_glob_indexes; 3215f757f3fSDimitry Andric std::map<std::pair<ConstString, llvm::sys::TimePoint<>>, OSOInfoSP> m_oso_map; 3220b57cec5SDimitry Andric UniqueDWARFASTTypeMap m_unique_ast_type_map; 3235f757f3fSDimitry Andric LazyBool m_supports_DW_AT_APPLE_objc_complete_type; 3240b57cec5SDimitry Andric DebugMap m_debug_map; 3250b57cec5SDimitry Andric 3260b57cec5SDimitry Andric // When an object file from the debug map gets parsed in 3270b57cec5SDimitry Andric // SymbolFileDWARF, it needs to tell the debug map about the object 3280b57cec5SDimitry Andric // files addresses by calling this function once for each N_FUN, 3290b57cec5SDimitry Andric // N_GSYM and N_STSYM and after all entries in the debug map have 3300b57cec5SDimitry Andric // been matched up, FinalizeOSOFileRanges() should be called. 3310b57cec5SDimitry Andric bool AddOSOFileRange(CompileUnitInfo *cu_info, lldb::addr_t exe_file_addr, 3320b57cec5SDimitry Andric lldb::addr_t exe_byte_size, lldb::addr_t oso_file_addr, 3330b57cec5SDimitry Andric lldb::addr_t oso_byte_size); 3340b57cec5SDimitry Andric 3350b57cec5SDimitry Andric // Called after calling AddOSOFileRange() for each object file debug 3360b57cec5SDimitry Andric // map entry to finalize the info for the unlinked compile unit. 3370b57cec5SDimitry Andric void FinalizeOSOFileRanges(CompileUnitInfo *cu_info); 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric /// Convert \a addr from a .o file address, to an executable address. 3400b57cec5SDimitry Andric /// 3410b57cec5SDimitry Andric /// \param[in] addr 3420b57cec5SDimitry Andric /// A section offset address from a .o file 3430b57cec5SDimitry Andric /// 3440b57cec5SDimitry Andric /// \return 3450b57cec5SDimitry Andric /// Returns true if \a addr was converted to be an executable 3460b57cec5SDimitry Andric /// section/offset address, false otherwise. 3475f757f3fSDimitry Andric bool LinkOSOAddress(Address &addr); 3480b57cec5SDimitry Andric 3490b57cec5SDimitry Andric /// Convert a .o file "file address" to an executable "file address". 3500b57cec5SDimitry Andric /// 3510b57cec5SDimitry Andric /// \param[in] oso_symfile 3520b57cec5SDimitry Andric /// The DWARF symbol file that contains \a oso_file_addr 3530b57cec5SDimitry Andric /// 3540b57cec5SDimitry Andric /// \param[in] oso_file_addr 3550b57cec5SDimitry Andric /// A .o file "file address" to convert. 3560b57cec5SDimitry Andric /// 3570b57cec5SDimitry Andric /// \return 3580b57cec5SDimitry Andric /// LLDB_INVALID_ADDRESS if \a oso_file_addr is not in the 3590b57cec5SDimitry Andric /// linked executable, otherwise a valid "file address" from the 3600b57cec5SDimitry Andric /// linked executable that contains the debug map. 3610b57cec5SDimitry Andric lldb::addr_t LinkOSOFileAddress(SymbolFileDWARF *oso_symfile, 3620b57cec5SDimitry Andric lldb::addr_t oso_file_addr); 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andric /// Given a line table full of lines with "file addresses" that are 3650b57cec5SDimitry Andric /// for a .o file represented by \a oso_symfile, link a new line table 3660b57cec5SDimitry Andric /// and return it. 3670b57cec5SDimitry Andric /// 3680b57cec5SDimitry Andric /// \param[in] oso_symfile 3690b57cec5SDimitry Andric /// The DWARF symbol file that produced the \a line_table 3700b57cec5SDimitry Andric /// 371480093f4SDimitry Andric /// \param[in] line_table 372480093f4SDimitry Andric /// A pointer to the line table. 3730b57cec5SDimitry Andric /// 3740b57cec5SDimitry Andric /// \return 3750b57cec5SDimitry Andric /// Returns a valid line table full of linked addresses, or NULL 3760b57cec5SDimitry Andric /// if none of the line table addresses exist in the main 3770b57cec5SDimitry Andric /// executable. 3785f757f3fSDimitry Andric LineTable *LinkOSOLineTable(SymbolFileDWARF *oso_symfile, 3795f757f3fSDimitry Andric LineTable *line_table); 3800b57cec5SDimitry Andric 3810b57cec5SDimitry Andric size_t AddOSOARanges(SymbolFileDWARF *dwarf2Data, 3820b57cec5SDimitry Andric DWARFDebugAranges *debug_aranges); 3830b57cec5SDimitry Andric }; 3845f757f3fSDimitry Andric } // namespace dwarf 3855f757f3fSDimitry Andric } // namespace lldb_private::plugin 3860b57cec5SDimitry Andric 3875ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARFDEBUGMAP_H 388