1 | //===-- DWARFFormValue.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_DWARFFORMVALUE_H |
10 | #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFFORMVALUE_H |
11 | |
12 | #include "DWARFDataExtractor.h" |
13 | #include <cstddef> |
14 | #include <optional> |
15 | |
16 | namespace lldb_private::plugin { |
17 | namespace dwarf { |
18 | class DWARFUnit; |
19 | class SymbolFileDWARF; |
20 | class DWARFDIE; |
21 | |
22 | class DWARFFormValue { |
23 | public: |
24 | typedef struct ValueTypeTag { |
25 | ValueTypeTag() : value() { value.uval = 0; } |
26 | |
27 | union { |
28 | uint64_t uval; |
29 | int64_t sval; |
30 | const char *cstr; |
31 | } value; |
32 | const uint8_t *data = nullptr; |
33 | } ValueType; |
34 | |
35 | enum { |
36 | eValueTypeInvalid = 0, |
37 | eValueTypeUnsigned, |
38 | eValueTypeSigned, |
39 | eValueTypeCStr, |
40 | eValueTypeBlock |
41 | }; |
42 | |
43 | DWARFFormValue() = default; |
44 | DWARFFormValue(const DWARFUnit *unit) : m_unit(unit) {} |
45 | DWARFFormValue(const DWARFUnit *unit, dw_form_t form) |
46 | : m_unit(unit), m_form(form) {} |
47 | const DWARFUnit *GetUnit() const { return m_unit; } |
48 | void SetUnit(const DWARFUnit *unit) { m_unit = unit; } |
49 | dw_form_t Form() const { return m_form; } |
50 | dw_form_t &FormRef() { return m_form; } |
51 | void SetForm(dw_form_t form) { m_form = form; } |
52 | const ValueType &Value() const { return m_value; } |
53 | ValueType &ValueRef() { return m_value; } |
54 | void SetValue(const ValueType &val) { m_value = val; } |
55 | |
56 | void Dump(Stream &s) const; |
57 | bool (const DWARFDataExtractor &data, lldb::offset_t *offset_ptr); |
58 | const uint8_t *BlockData() const; |
59 | static std::optional<uint8_t> GetFixedSize(dw_form_t form, |
60 | const DWARFUnit *u); |
61 | std::optional<uint8_t> GetFixedSize() const; |
62 | DWARFDIE Reference() const; |
63 | |
64 | /// If this is a reference to another DIE, return the corresponding DWARFUnit |
65 | /// and DIE offset such that Unit->GetDIE(offset) produces the desired DIE. |
66 | /// Otherwise, a nullptr and unspecified offset are returned. |
67 | std::pair<DWARFUnit *, uint64_t> ReferencedUnitAndOffset() const; |
68 | |
69 | uint64_t Reference(dw_offset_t offset) const; |
70 | bool Boolean() const { return m_value.value.uval != 0; } |
71 | uint64_t Unsigned() const { return m_value.value.uval; } |
72 | void SetUnsigned(uint64_t uval) { m_value.value.uval = uval; } |
73 | int64_t Signed() const { return m_value.value.sval; } |
74 | void SetSigned(int64_t sval) { m_value.value.sval = sval; } |
75 | const char *AsCString() const; |
76 | dw_addr_t Address() const; |
77 | bool IsValid() const { return m_form != 0; } |
78 | bool (const DWARFDataExtractor &debug_info_data, |
79 | lldb::offset_t *offset_ptr) const; |
80 | static bool (const dw_form_t form, |
81 | const DWARFDataExtractor &debug_info_data, |
82 | lldb::offset_t *offset_ptr, const DWARFUnit *unit); |
83 | static bool IsBlockForm(const dw_form_t form); |
84 | static bool IsDataForm(const dw_form_t form); |
85 | static int Compare(const DWARFFormValue &a, const DWARFFormValue &b); |
86 | void Clear(); |
87 | static bool FormIsSupported(dw_form_t form); |
88 | |
89 | protected: |
90 | // Compile unit where m_value was located. |
91 | // It may be different from compile unit where m_value refers to. |
92 | const DWARFUnit *m_unit = nullptr; // Unit for this form |
93 | dw_form_t m_form = dw_form_t(0); // Form for this value |
94 | ValueType m_value; // Contains all data for the form |
95 | }; |
96 | } // namespace dwarf |
97 | } // namespace lldb_private::plugin |
98 | |
99 | #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFFORMVALUE_H |
100 | |