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::plugin {
23 namespace dwarf {
24 class DWARFContext;
25 
26 class DWARFDebugInfo {
27 public:
28   typedef dw_offset_t (*Callback)(SymbolFileDWARF *dwarf2Data, DWARFUnit *cu,
29                                   DWARFDebugInfoEntry *die,
30                                   const dw_offset_t next_offset,
31                                   const uint32_t depth, void *userData);
32 
33   explicit DWARFDebugInfo(SymbolFileDWARF &dwarf, DWARFContext &context);
34 
35   size_t GetNumUnits();
36   DWARFUnit *GetUnitAtIndex(size_t idx);
37   DWARFUnit *GetUnitAtOffset(DIERef::Section section, dw_offset_t cu_offset,
38                              uint32_t *idx_ptr = nullptr);
39   DWARFUnit *GetUnitContainingDIEOffset(DIERef::Section section,
40                                         dw_offset_t die_offset);
41   DWARFUnit *GetUnit(const DIERef &die_ref);
42   DWARFTypeUnit *GetTypeUnitForHash(uint64_t hash);
43   bool ContainsTypeUnits();
44   DWARFDIE GetDIE(const DIERef &die_ref);
45 
46   /// Returns the AT_Name of this DIE, if it exists, without parsing the entire
47   /// compile unit. An empty is string is returned upon error or if the
48   /// attribute is not present.
49   llvm::StringRef PeekDIEName(const DIERef &die_ref);
50 
51   enum {
52     eDumpFlag_Verbose = (1 << 0),  // Verbose dumping
53     eDumpFlag_ShowForm = (1 << 1), // Show the DW_form type
54     eDumpFlag_ShowAncestors =
55         (1 << 2) // Show all parent DIEs when dumping single DIEs
56   };
57 
58   const DWARFDebugAranges &GetCompileUnitAranges();
59 
60 protected:
61   typedef std::vector<DWARFUnitSP> UnitColl;
62 
63   SymbolFileDWARF &m_dwarf;
64   DWARFContext &m_context;
65 
66   llvm::once_flag m_units_once_flag;
67   UnitColl m_units;
68 
69   std::unique_ptr<DWARFDebugAranges>
70       m_cu_aranges_up; // A quick address to compile unit table
71 
72   std::vector<std::pair<uint64_t, uint32_t>> m_type_hash_to_unit_index;
73 
74 private:
75   // All parsing needs to be done partially any managed by this class as
76   // accessors are called.
77   void ParseUnitHeadersIfNeeded();
78 
79   void ParseUnitsFor(DIERef::Section section);
80 
81   uint32_t FindUnitIndex(DIERef::Section section, dw_offset_t offset);
82 
83   DWARFDebugInfo(const DWARFDebugInfo &) = delete;
84   const DWARFDebugInfo &operator=(const DWARFDebugInfo &) = delete;
85 };
86 } // namespace dwarf
87 } // namespace lldb_private::plugin
88 
89 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDEBUGINFO_H
90