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/DWARFFormValue.h
39645 views
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 ExtractValue(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 SkipValue(const DWARFDataExtractor &debug_info_data,
79
lldb::offset_t *offset_ptr) const;
80
static bool SkipValue(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
101