Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.h
39645 views
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
dw_offset_t GetOffset() const;
89
90
// Get the LLDB user ID for this DIE. This is often just the DIE offset,
91
// but it might have a SymbolFileDWARF::GetID() in the high 32 bits if
92
// we are doing Darwin DWARF in .o file, or DWARF stand alone debug
93
// info.
94
lldb::user_id_t GetID() const;
95
96
const char *GetName() const;
97
98
lldb::ModuleSP GetModule() const;
99
100
// Getting attribute values from the DIE.
101
//
102
// GetAttributeValueAsXXX() functions should only be used if you are
103
// looking for one or two attributes on a DIE. If you are trying to
104
// parse all attributes, use GetAttributes (...) instead
105
const char *GetAttributeValueAsString(const dw_attr_t attr,
106
const char *fail_value) const;
107
108
uint64_t GetAttributeValueAsUnsigned(const dw_attr_t attr,
109
uint64_t fail_value) const;
110
111
std::optional<uint64_t>
112
GetAttributeValueAsOptionalUnsigned(const dw_attr_t attr) const;
113
114
uint64_t GetAttributeValueAsAddress(const dw_attr_t attr,
115
uint64_t fail_value) const;
116
117
enum class Recurse : bool { no, yes };
118
DWARFAttributes GetAttributes(Recurse recurse = Recurse::yes) const;
119
120
protected:
121
DWARFUnit *m_cu = nullptr;
122
DWARFDebugInfoEntry *m_die = nullptr;
123
};
124
125
bool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs);
126
bool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs);
127
} // namespace dwarf
128
} // namespace lldb_private::plugin
129
130
#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFBASEDIE_H
131
132