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 ®_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 llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override; 51 52 lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, 53 bool can_create = true) override; 54 55 size_t GetIndexOfChildWithName(llvm::StringRef name) override; 56 57 protected: 58 bool UpdateValue() override; 59 60 CompilerType GetCompilerTypeImpl() override; 61 62 lldb::RegisterContextSP m_reg_ctx_sp; 63 const RegisterSet *m_reg_set; 64 uint32_t m_reg_set_idx; 65 66 private: 67 friend class ValueObjectRegisterContext; 68 69 ValueObjectRegisterSet(ExecutionContextScope *exe_scope, 70 ValueObjectManager &manager, 71 lldb::RegisterContextSP ®_ctx_sp, uint32_t set_idx); 72 73 ValueObject *CreateChildAtIndex(size_t idx) override; 74 ValueObject *CreateSyntheticArrayMember(size_t idx) override { 75 return nullptr; 76 } 77 78 // For ValueObject only 79 ValueObjectRegisterSet(const ValueObjectRegisterSet &) = delete; 80 const ValueObjectRegisterSet & 81 operator=(const ValueObjectRegisterSet &) = delete; 82 }; 83 84 class ValueObjectRegister : public ValueObject { 85 public: 86 ~ValueObjectRegister() override; 87 88 static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, 89 lldb::RegisterContextSP ®_ctx_sp, 90 const RegisterInfo *reg_info); 91 92 std::optional<uint64_t> GetByteSize() override; 93 94 lldb::ValueType GetValueType() const override { 95 return lldb::eValueTypeRegister; 96 } 97 98 ConstString GetTypeName() override; 99 100 llvm::Expected<uint32_t> CalculateNumChildren(uint32_t max) override; 101 102 bool SetValueFromCString(const char *value_str, Status &error) override; 103 104 bool SetData(DataExtractor &data, Status &error) override; 105 106 bool ResolveValue(Scalar &scalar) override; 107 108 void 109 GetExpressionPath(Stream &s, 110 GetExpressionPathFormat epformat = 111 eGetExpressionPathFormatDereferencePointers) override; 112 113 protected: 114 bool UpdateValue() override; 115 116 CompilerType GetCompilerTypeImpl() override; 117 118 lldb::RegisterContextSP m_reg_ctx_sp; 119 RegisterInfo m_reg_info; 120 RegisterValue m_reg_value; 121 ConstString m_type_name; 122 CompilerType m_compiler_type; 123 124 private: 125 void ConstructObject(const RegisterInfo *reg_info); 126 127 friend class ValueObjectRegisterSet; 128 129 ValueObjectRegister(ValueObject &parent, lldb::RegisterContextSP ®_ctx_sp, 130 const RegisterInfo *reg_info); 131 ValueObjectRegister(ExecutionContextScope *exe_scope, 132 ValueObjectManager &manager, 133 lldb::RegisterContextSP ®_ctx_sp, 134 const RegisterInfo *reg_info); 135 136 // For ValueObject only 137 ValueObjectRegister(const ValueObjectRegister &) = delete; 138 const ValueObjectRegister &operator=(const ValueObjectRegister &) = delete; 139 }; 140 141 } // namespace lldb_private 142 143 #endif // LLDB_CORE_VALUEOBJECTREGISTER_H 144