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   const 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