1 //===-- ValueObjectRegister.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_CORE_VALUEOBJECTREGISTER_H
10 #define LLDB_CORE_VALUEOBJECTREGISTER_H
11 
12 #include "lldb/Core/ValueObject.h"
13 #include "lldb/Symbol/CompilerType.h"
14 #include "lldb/Utility/ConstString.h"
15 #include "lldb/Utility/RegisterValue.h"
16 #include "lldb/lldb-defines.h"
17 #include "lldb/lldb-enumerations.h"
18 #include "lldb/lldb-forward.h"
19 #include "lldb/lldb-private-types.h"
20 
21 #include <cstddef>
22 #include <cstdint>
23 #include <optional>
24 
25 namespace lldb_private {
26 class DataExtractor;
27 class Status;
28 class ExecutionContextScope;
29 class Scalar;
30 class Stream;
31 
32 class ValueObjectRegisterSet : public ValueObject {
33 public:
34   ~ValueObjectRegisterSet() override;
35 
36   static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope,
37                                     lldb::RegisterContextSP &reg_ctx_sp,
38                                     uint32_t set_idx);
39 
40   std::optional<uint64_t> GetByteSize() override;
41 
42   lldb::ValueType GetValueType() const override {
43     return lldb::eValueTypeRegisterSet;
44   }
45 
46   ConstString GetTypeName() override;
47 
48   ConstString GetQualifiedTypeName() override;
49 
50   size_t CalculateNumChildren(uint32_t max) override;
51 
52   ValueObject *CreateChildAtIndex(size_t idx, bool synthetic_array_member,
53                                   int32_t synthetic_index) override;
54 
55   lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
56                                              bool can_create = true) override;
57 
58   size_t GetIndexOfChildWithName(llvm::StringRef name) override;
59 
60 protected:
61   bool UpdateValue() override;
62 
63   CompilerType GetCompilerTypeImpl() override;
64 
65   lldb::RegisterContextSP m_reg_ctx_sp;
66   const RegisterSet *m_reg_set;
67   uint32_t m_reg_set_idx;
68 
69 private:
70   friend class ValueObjectRegisterContext;
71 
72   ValueObjectRegisterSet(ExecutionContextScope *exe_scope,
73                          ValueObjectManager &manager,
74                          lldb::RegisterContextSP &reg_ctx_sp, uint32_t set_idx);
75 
76   // For ValueObject only
77   ValueObjectRegisterSet(const ValueObjectRegisterSet &) = delete;
78   const ValueObjectRegisterSet &
79   operator=(const ValueObjectRegisterSet &) = delete;
80 };
81 
82 class ValueObjectRegister : public ValueObject {
83 public:
84   ~ValueObjectRegister() override;
85 
86   static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope,
87                                     lldb::RegisterContextSP &reg_ctx_sp,
88                                     const RegisterInfo *reg_info);
89 
90   std::optional<uint64_t> GetByteSize() override;
91 
92   lldb::ValueType GetValueType() const override {
93     return lldb::eValueTypeRegister;
94   }
95 
96   ConstString GetTypeName() override;
97 
98   size_t CalculateNumChildren(uint32_t max) override;
99 
100   bool SetValueFromCString(const char *value_str, Status &error) override;
101 
102   bool SetData(DataExtractor &data, Status &error) override;
103 
104   bool ResolveValue(Scalar &scalar) override;
105 
106   void
107   GetExpressionPath(Stream &s,
108                     GetExpressionPathFormat epformat =
109                         eGetExpressionPathFormatDereferencePointers) override;
110 
111 protected:
112   bool UpdateValue() override;
113 
114   CompilerType GetCompilerTypeImpl() override;
115 
116   lldb::RegisterContextSP m_reg_ctx_sp;
117   RegisterInfo m_reg_info;
118   RegisterValue m_reg_value;
119   ConstString m_type_name;
120   CompilerType m_compiler_type;
121 
122 private:
123   void ConstructObject(const RegisterInfo *reg_info);
124 
125   friend class ValueObjectRegisterSet;
126 
127   ValueObjectRegister(ValueObject &parent, lldb::RegisterContextSP &reg_ctx_sp,
128                       const RegisterInfo *reg_info);
129   ValueObjectRegister(ExecutionContextScope *exe_scope,
130                       ValueObjectManager &manager,
131                       lldb::RegisterContextSP &reg_ctx_sp,
132                       const RegisterInfo *reg_info);
133 
134   // For ValueObject only
135   ValueObjectRegister(const ValueObjectRegister &) = delete;
136   const ValueObjectRegister &operator=(const ValueObjectRegister &) = delete;
137 };
138 
139 } // namespace lldb_private
140 
141 #endif // LLDB_CORE_VALUEOBJECTREGISTER_H
142