1 //===-- DWARFDebugInfo.h ----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDEBUGINFO_H 10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDEBUGINFO_H 11 12 #include <map> 13 #include <vector> 14 15 #include "DWARFDIE.h" 16 #include "DWARFTypeUnit.h" 17 #include "DWARFUnit.h" 18 #include "SymbolFileDWARF.h" 19 #include "lldb/lldb-private.h" 20 #include "llvm/Support/Error.h" 21 22 namespace lldb_private { 23 class DWARFContext; 24 } 25 26 class DWARFDebugInfo { 27 public: 28 typedef dw_offset_t (*Callback)(SymbolFileDWARF *dwarf2Data, 29 DWARFUnit *cu, 30 DWARFDebugInfoEntry *die, 31 const dw_offset_t next_offset, 32 const uint32_t depth, void *userData); 33 34 explicit DWARFDebugInfo(SymbolFileDWARF &dwarf, 35 lldb_private::DWARFContext &context); 36 37 size_t GetNumUnits(); 38 DWARFUnit *GetUnitAtIndex(size_t idx); 39 DWARFUnit *GetUnitAtOffset(DIERef::Section section, dw_offset_t cu_offset, 40 uint32_t *idx_ptr = nullptr); 41 DWARFUnit *GetUnitContainingDIEOffset(DIERef::Section section, 42 dw_offset_t die_offset); 43 DWARFUnit *GetUnit(const DIERef &die_ref); 44 DWARFTypeUnit *GetTypeUnitForHash(uint64_t hash); 45 bool ContainsTypeUnits(); 46 DWARFDIE GetDIEForDIEOffset(DIERef::Section section, 47 dw_offset_t die_offset); 48 DWARFDIE GetDIE(const DIERef &die_ref); 49 50 enum { 51 eDumpFlag_Verbose = (1 << 0), // Verbose dumping 52 eDumpFlag_ShowForm = (1 << 1), // Show the DW_form type 53 eDumpFlag_ShowAncestors = 54 (1 << 2) // Show all parent DIEs when dumping single DIEs 55 }; 56 57 llvm::Expected<DWARFDebugAranges &> GetCompileUnitAranges(); 58 59 protected: 60 typedef std::vector<DWARFUnitSP> UnitColl; 61 62 SymbolFileDWARF &m_dwarf; 63 lldb_private::DWARFContext &m_context; 64 65 llvm::once_flag m_units_once_flag; 66 UnitColl m_units; 67 68 std::unique_ptr<DWARFDebugAranges> 69 m_cu_aranges_up; // A quick address to compile unit table 70 71 std::vector<std::pair<uint64_t, uint32_t>> m_type_hash_to_unit_index; 72 73 private: 74 // All parsing needs to be done partially any managed by this class as 75 // accessors are called. 76 void ParseUnitHeadersIfNeeded(); 77 78 void ParseUnitsFor(DIERef::Section section); 79 80 uint32_t FindUnitIndex(DIERef::Section section, dw_offset_t offset); 81 82 DWARFDebugInfo(const DWARFDebugInfo &) = delete; 83 const DWARFDebugInfo &operator=(const DWARFDebugInfo &) = delete; 84 }; 85 86 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDEBUGINFO_H 87