xref: /freebsd/contrib/llvm-project/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h (revision 6966ac055c3b7a39266fb982493330df7a097997)
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 SymbolFileDWARF_DWARFFormValue_h_
10 #define SymbolFileDWARF_DWARFFormValue_h_
11 
12 #include "DWARFDataExtractor.h"
13 #include <stddef.h>
14 #include "llvm/ADT/Optional.h"
15 
16 class DWARFUnit;
17 class SymbolFileDWARF;
18 class DWARFDIE;
19 
20 class DWARFFormValue {
21 public:
22   typedef struct ValueTypeTag {
23     ValueTypeTag() : value(), data(nullptr) { value.uval = 0; }
24 
25     union {
26       uint64_t uval;
27       int64_t sval;
28       const char *cstr;
29     } value;
30     const uint8_t *data;
31   } ValueType;
32 
33   enum {
34     eValueTypeInvalid = 0,
35     eValueTypeUnsigned,
36     eValueTypeSigned,
37     eValueTypeCStr,
38     eValueTypeBlock
39   };
40 
41   DWARFFormValue() = default;
42   DWARFFormValue(const DWARFUnit *unit) : m_unit(unit) {}
43   DWARFFormValue(const DWARFUnit *unit, dw_form_t form)
44       : m_unit(unit), m_form(form) {}
45   void SetUnit(const DWARFUnit *unit) { m_unit = unit; }
46   dw_form_t Form() const { return m_form; }
47   dw_form_t& FormRef() { return m_form; }
48   void SetForm(dw_form_t form) { m_form = form; }
49   const ValueType &Value() const { return m_value; }
50   ValueType &ValueRef() { return m_value; }
51   void SetValue(const ValueType &val) { m_value = val; }
52 
53   void Dump(lldb_private::Stream &s) const;
54   bool ExtractValue(const lldb_private::DWARFDataExtractor &data,
55                     lldb::offset_t *offset_ptr);
56   const uint8_t *BlockData() const;
57   static llvm::Optional<uint8_t> GetFixedSize(dw_form_t form,
58                                               const DWARFUnit *u);
59   llvm::Optional<uint8_t> GetFixedSize() const;
60   DWARFDIE Reference() const;
61   uint64_t Reference(dw_offset_t offset) const;
62   bool Boolean() const { return m_value.value.uval != 0; }
63   uint64_t Unsigned() const { return m_value.value.uval; }
64   void SetUnsigned(uint64_t uval) { m_value.value.uval = uval; }
65   int64_t Signed() const { return m_value.value.sval; }
66   void SetSigned(int64_t sval) { m_value.value.sval = sval; }
67   const char *AsCString() const;
68   dw_addr_t Address() const;
69   bool IsValid() const { return m_form != 0; }
70   bool SkipValue(const lldb_private::DWARFDataExtractor &debug_info_data,
71                  lldb::offset_t *offset_ptr) const;
72   static bool SkipValue(const dw_form_t form,
73                         const lldb_private::DWARFDataExtractor &debug_info_data,
74                         lldb::offset_t *offset_ptr, const DWARFUnit *unit);
75   static bool IsBlockForm(const dw_form_t form);
76   static bool IsDataForm(const dw_form_t form);
77   static int Compare(const DWARFFormValue &a, const DWARFFormValue &b);
78   void Clear();
79   static bool FormIsSupported(dw_form_t form);
80 
81 protected:
82   // Compile unit where m_value was located.
83   // It may be different from compile unit where m_value refers to.
84   const DWARFUnit *m_unit = nullptr; // Unit for this form
85   dw_form_t m_form = 0;              // Form for this value
86   ValueType m_value;            // Contains all data for the form
87 };
88 
89 #endif // SymbolFileDWARF_DWARFFormValue_h_
90