1 | //===-- DWARFBaseDIE.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_DWARFBASEDIE_H |
10 | #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFBASEDIE_H |
11 | |
12 | #include "lldb/Core/dwarf.h" |
13 | #include "lldb/lldb-types.h" |
14 | |
15 | #include "llvm/Support/Error.h" |
16 | #include <optional> |
17 | |
18 | namespace lldb_private::plugin { |
19 | namespace dwarf { |
20 | class DIERef; |
21 | class DWARFASTParser; |
22 | class DWARFAttributes; |
23 | class DWARFUnit; |
24 | class DWARFDebugInfoEntry; |
25 | class DWARFDeclContext; |
26 | class SymbolFileDWARF; |
27 | |
28 | class DWARFBaseDIE { |
29 | public: |
30 | DWARFBaseDIE() = default; |
31 | |
32 | DWARFBaseDIE(DWARFUnit *cu, DWARFDebugInfoEntry *die) |
33 | : m_cu(cu), m_die(die) {} |
34 | |
35 | DWARFBaseDIE(const DWARFUnit *cu, DWARFDebugInfoEntry *die) |
36 | : m_cu(const_cast<DWARFUnit *>(cu)), m_die(die) {} |
37 | |
38 | DWARFBaseDIE(DWARFUnit *cu, const DWARFDebugInfoEntry *die) |
39 | : m_cu(cu), m_die(const_cast<DWARFDebugInfoEntry *>(die)) {} |
40 | |
41 | DWARFBaseDIE(const DWARFUnit *cu, const DWARFDebugInfoEntry *die) |
42 | : m_cu(const_cast<DWARFUnit *>(cu)), |
43 | m_die(const_cast<DWARFDebugInfoEntry *>(die)) {} |
44 | |
45 | // Tests |
46 | explicit operator bool() const { return IsValid(); } |
47 | |
48 | bool IsValid() const { return m_cu && m_die; } |
49 | |
50 | bool HasChildren() const; |
51 | |
52 | bool Supports_DW_AT_APPLE_objc_complete_type() const; |
53 | |
54 | // Accessors |
55 | SymbolFileDWARF *GetDWARF() const; |
56 | |
57 | DWARFUnit *GetCU() const { return m_cu; } |
58 | |
59 | DWARFDebugInfoEntry *GetDIE() const { return m_die; } |
60 | |
61 | std::optional<DIERef> GetDIERef() const; |
62 | |
63 | void Set(DWARFUnit *cu, DWARFDebugInfoEntry *die) { |
64 | if (cu && die) { |
65 | m_cu = cu; |
66 | m_die = die; |
67 | } else { |
68 | Clear(); |
69 | } |
70 | } |
71 | |
72 | void Clear() { |
73 | m_cu = nullptr; |
74 | m_die = nullptr; |
75 | } |
76 | |
77 | // Get the data that contains the attribute values for this DIE. Support |
78 | // for .debug_types means that any DIE can have its data either in the |
79 | // .debug_info or the .debug_types section; this method will return the |
80 | // correct section data. |
81 | // |
82 | // Clients must validate that this object is valid before calling this. |
83 | const DWARFDataExtractor &GetData() const; |
84 | |
85 | // Accessing information about a DIE |
86 | dw_tag_t Tag() const; |
87 | |
88 | const char *GetTagAsCString() const; |
89 | |
90 | dw_offset_t GetOffset() const; |
91 | |
92 | // Get the LLDB user ID for this DIE. This is often just the DIE offset, |
93 | // but it might have a SymbolFileDWARF::GetID() in the high 32 bits if |
94 | // we are doing Darwin DWARF in .o file, or DWARF stand alone debug |
95 | // info. |
96 | lldb::user_id_t GetID() const; |
97 | |
98 | const char *GetName() const; |
99 | |
100 | lldb::ModuleSP GetModule() const; |
101 | |
102 | // Getting attribute values from the DIE. |
103 | // |
104 | // GetAttributeValueAsXXX() functions should only be used if you are |
105 | // looking for one or two attributes on a DIE. If you are trying to |
106 | // parse all attributes, use GetAttributes (...) instead |
107 | const char *GetAttributeValueAsString(const dw_attr_t attr, |
108 | const char *fail_value) const; |
109 | |
110 | uint64_t GetAttributeValueAsUnsigned(const dw_attr_t attr, |
111 | uint64_t fail_value) const; |
112 | |
113 | std::optional<uint64_t> |
114 | GetAttributeValueAsOptionalUnsigned(const dw_attr_t attr) const; |
115 | |
116 | uint64_t GetAttributeValueAsAddress(const dw_attr_t attr, |
117 | uint64_t fail_value) const; |
118 | |
119 | enum class Recurse : bool { no, yes }; |
120 | DWARFAttributes GetAttributes(Recurse recurse = Recurse::yes) const; |
121 | |
122 | protected: |
123 | DWARFUnit *m_cu = nullptr; |
124 | DWARFDebugInfoEntry *m_die = nullptr; |
125 | }; |
126 | |
127 | bool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs); |
128 | bool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs); |
129 | } // namespace dwarf |
130 | } // namespace lldb_private::plugin |
131 | |
132 | #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFBASEDIE_H |
133 | |