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 GetDIE(const DIERef &die_ref);
47 
48   enum {
49     eDumpFlag_Verbose = (1 << 0),  // Verbose dumping
50     eDumpFlag_ShowForm = (1 << 1), // Show the DW_form type
51     eDumpFlag_ShowAncestors =
52         (1 << 2) // Show all parent DIEs when dumping single DIEs
53   };
54 
55   const DWARFDebugAranges &GetCompileUnitAranges();
56 
57 protected:
58   typedef std::vector<DWARFUnitSP> UnitColl;
59 
60   SymbolFileDWARF &m_dwarf;
61   lldb_private::DWARFContext &m_context;
62 
63   llvm::once_flag m_units_once_flag;
64   UnitColl m_units;
65 
66   std::unique_ptr<DWARFDebugAranges>
67       m_cu_aranges_up; // A quick address to compile unit table
68 
69   std::vector<std::pair<uint64_t, uint32_t>> m_type_hash_to_unit_index;
70 
71 private:
72   // All parsing needs to be done partially any managed by this class as
73   // accessors are called.
74   void ParseUnitHeadersIfNeeded();
75 
76   void ParseUnitsFor(DIERef::Section section);
77 
78   uint32_t FindUnitIndex(DIERef::Section section, dw_offset_t offset);
79 
80   DWARFDebugInfo(const DWARFDebugInfo &) = delete;
81   const DWARFDebugInfo &operator=(const DWARFDebugInfo &) = delete;
82 };
83 
84 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDEBUGINFO_H
85