1dda28197Spatrick //===-- ValueObjectConstResult.cpp ----------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/Core/ValueObjectConstResult.h"
10061da546Spatrick
11061da546Spatrick #include "lldb/Core/ValueObjectDynamicValue.h"
12061da546Spatrick #include "lldb/Symbol/CompilerType.h"
13061da546Spatrick #include "lldb/Target/ExecutionContext.h"
14061da546Spatrick #include "lldb/Target/ExecutionContextScope.h"
15061da546Spatrick #include "lldb/Target/Process.h"
16061da546Spatrick #include "lldb/Utility/DataBuffer.h"
17061da546Spatrick #include "lldb/Utility/DataBufferHeap.h"
18061da546Spatrick #include "lldb/Utility/DataExtractor.h"
19061da546Spatrick #include "lldb/Utility/Scalar.h"
20*f6aab3d8Srobert #include <optional>
21061da546Spatrick
22061da546Spatrick namespace lldb_private {
23061da546Spatrick class Module;
24061da546Spatrick }
25061da546Spatrick
26061da546Spatrick using namespace lldb;
27061da546Spatrick using namespace lldb_private;
28061da546Spatrick
Create(ExecutionContextScope * exe_scope,ByteOrder byte_order,uint32_t addr_byte_size,lldb::addr_t address)29061da546Spatrick ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
30061da546Spatrick ByteOrder byte_order,
31061da546Spatrick uint32_t addr_byte_size,
32061da546Spatrick lldb::addr_t address) {
33dda28197Spatrick auto manager_sp = ValueObjectManager::Create();
34dda28197Spatrick return (new ValueObjectConstResult(exe_scope, *manager_sp, byte_order,
35dda28197Spatrick addr_byte_size, address))
36061da546Spatrick ->GetSP();
37061da546Spatrick }
38061da546Spatrick
ValueObjectConstResult(ExecutionContextScope * exe_scope,ValueObjectManager & manager,ByteOrder byte_order,uint32_t addr_byte_size,lldb::addr_t address)39061da546Spatrick ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
40dda28197Spatrick ValueObjectManager &manager,
41061da546Spatrick ByteOrder byte_order,
42061da546Spatrick uint32_t addr_byte_size,
43061da546Spatrick lldb::addr_t address)
44be691f3bSpatrick : ValueObject(exe_scope, manager), m_impl(this, address) {
45061da546Spatrick SetIsConstant();
46061da546Spatrick SetValueIsValid(true);
47061da546Spatrick m_data.SetByteOrder(byte_order);
48061da546Spatrick m_data.SetAddressByteSize(addr_byte_size);
49061da546Spatrick SetAddressTypeOfChildren(eAddressTypeLoad);
50061da546Spatrick }
51061da546Spatrick
Create(ExecutionContextScope * exe_scope,const CompilerType & compiler_type,ConstString name,const DataExtractor & data,lldb::addr_t address)52061da546Spatrick ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
53061da546Spatrick const CompilerType &compiler_type,
54061da546Spatrick ConstString name,
55061da546Spatrick const DataExtractor &data,
56061da546Spatrick lldb::addr_t address) {
57dda28197Spatrick auto manager_sp = ValueObjectManager::Create();
58dda28197Spatrick return (new ValueObjectConstResult(exe_scope, *manager_sp, compiler_type,
59dda28197Spatrick name, data, address))
60061da546Spatrick ->GetSP();
61061da546Spatrick }
62061da546Spatrick
ValueObjectConstResult(ExecutionContextScope * exe_scope,ValueObjectManager & manager,const CompilerType & compiler_type,ConstString name,const DataExtractor & data,lldb::addr_t address)63061da546Spatrick ValueObjectConstResult::ValueObjectConstResult(
64dda28197Spatrick ExecutionContextScope *exe_scope, ValueObjectManager &manager,
65dda28197Spatrick const CompilerType &compiler_type, ConstString name,
66dda28197Spatrick const DataExtractor &data, lldb::addr_t address)
67be691f3bSpatrick : ValueObject(exe_scope, manager), m_impl(this, address) {
68061da546Spatrick m_data = data;
69061da546Spatrick
70061da546Spatrick if (!m_data.GetSharedDataBuffer()) {
71061da546Spatrick DataBufferSP shared_data_buffer(
72061da546Spatrick new DataBufferHeap(data.GetDataStart(), data.GetByteSize()));
73061da546Spatrick m_data.SetData(shared_data_buffer);
74061da546Spatrick }
75061da546Spatrick
76061da546Spatrick m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
77be691f3bSpatrick m_value.SetValueType(Value::ValueType::HostAddress);
78061da546Spatrick m_value.SetCompilerType(compiler_type);
79061da546Spatrick m_name = name;
80061da546Spatrick SetIsConstant();
81061da546Spatrick SetValueIsValid(true);
82061da546Spatrick SetAddressTypeOfChildren(eAddressTypeLoad);
83061da546Spatrick }
84061da546Spatrick
Create(ExecutionContextScope * exe_scope,const CompilerType & compiler_type,ConstString name,const lldb::DataBufferSP & data_sp,lldb::ByteOrder data_byte_order,uint32_t data_addr_size,lldb::addr_t address)85061da546Spatrick ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
86061da546Spatrick const CompilerType &compiler_type,
87061da546Spatrick ConstString name,
88061da546Spatrick const lldb::DataBufferSP &data_sp,
89061da546Spatrick lldb::ByteOrder data_byte_order,
90061da546Spatrick uint32_t data_addr_size,
91061da546Spatrick lldb::addr_t address) {
92dda28197Spatrick auto manager_sp = ValueObjectManager::Create();
93dda28197Spatrick return (new ValueObjectConstResult(exe_scope, *manager_sp, compiler_type,
94dda28197Spatrick name, data_sp, data_byte_order,
95dda28197Spatrick data_addr_size, address))
96061da546Spatrick ->GetSP();
97061da546Spatrick }
98061da546Spatrick
Create(ExecutionContextScope * exe_scope,Value & value,ConstString name,Module * module)99061da546Spatrick ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
100061da546Spatrick Value &value,
101061da546Spatrick ConstString name,
102061da546Spatrick Module *module) {
103dda28197Spatrick auto manager_sp = ValueObjectManager::Create();
104dda28197Spatrick return (new ValueObjectConstResult(exe_scope, *manager_sp, value, name,
105dda28197Spatrick module))
106dda28197Spatrick ->GetSP();
107061da546Spatrick }
108061da546Spatrick
ValueObjectConstResult(ExecutionContextScope * exe_scope,ValueObjectManager & manager,const CompilerType & compiler_type,ConstString name,const lldb::DataBufferSP & data_sp,lldb::ByteOrder data_byte_order,uint32_t data_addr_size,lldb::addr_t address)109061da546Spatrick ValueObjectConstResult::ValueObjectConstResult(
110dda28197Spatrick ExecutionContextScope *exe_scope, ValueObjectManager &manager,
111dda28197Spatrick const CompilerType &compiler_type, ConstString name,
112dda28197Spatrick const lldb::DataBufferSP &data_sp, lldb::ByteOrder data_byte_order,
113dda28197Spatrick uint32_t data_addr_size, lldb::addr_t address)
114be691f3bSpatrick : ValueObject(exe_scope, manager), m_impl(this, address) {
115061da546Spatrick m_data.SetByteOrder(data_byte_order);
116061da546Spatrick m_data.SetAddressByteSize(data_addr_size);
117061da546Spatrick m_data.SetData(data_sp);
118061da546Spatrick m_value.GetScalar() = (uintptr_t)data_sp->GetBytes();
119be691f3bSpatrick m_value.SetValueType(Value::ValueType::HostAddress);
120061da546Spatrick m_value.SetCompilerType(compiler_type);
121061da546Spatrick m_name = name;
122061da546Spatrick SetIsConstant();
123061da546Spatrick SetValueIsValid(true);
124061da546Spatrick SetAddressTypeOfChildren(eAddressTypeLoad);
125061da546Spatrick }
126061da546Spatrick
Create(ExecutionContextScope * exe_scope,const CompilerType & compiler_type,ConstString name,lldb::addr_t address,AddressType address_type,uint32_t addr_byte_size)127061da546Spatrick ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
128061da546Spatrick const CompilerType &compiler_type,
129061da546Spatrick ConstString name,
130061da546Spatrick lldb::addr_t address,
131061da546Spatrick AddressType address_type,
132061da546Spatrick uint32_t addr_byte_size) {
133dda28197Spatrick auto manager_sp = ValueObjectManager::Create();
134dda28197Spatrick return (new ValueObjectConstResult(exe_scope, *manager_sp, compiler_type,
135dda28197Spatrick name, address, address_type,
136dda28197Spatrick addr_byte_size))
137061da546Spatrick ->GetSP();
138061da546Spatrick }
139061da546Spatrick
ValueObjectConstResult(ExecutionContextScope * exe_scope,ValueObjectManager & manager,const CompilerType & compiler_type,ConstString name,lldb::addr_t address,AddressType address_type,uint32_t addr_byte_size)140061da546Spatrick ValueObjectConstResult::ValueObjectConstResult(
141dda28197Spatrick ExecutionContextScope *exe_scope, ValueObjectManager &manager,
142dda28197Spatrick const CompilerType &compiler_type, ConstString name, lldb::addr_t address,
143dda28197Spatrick AddressType address_type, uint32_t addr_byte_size)
144be691f3bSpatrick : ValueObject(exe_scope, manager), m_type_name(),
145061da546Spatrick m_impl(this, address) {
146061da546Spatrick m_value.GetScalar() = address;
147061da546Spatrick m_data.SetAddressByteSize(addr_byte_size);
148061da546Spatrick m_value.GetScalar().GetData(m_data, addr_byte_size);
149be691f3bSpatrick // m_value.SetValueType(Value::ValueType::HostAddress);
150061da546Spatrick switch (address_type) {
151061da546Spatrick case eAddressTypeInvalid:
152be691f3bSpatrick m_value.SetValueType(Value::ValueType::Scalar);
153061da546Spatrick break;
154061da546Spatrick case eAddressTypeFile:
155be691f3bSpatrick m_value.SetValueType(Value::ValueType::FileAddress);
156061da546Spatrick break;
157061da546Spatrick case eAddressTypeLoad:
158be691f3bSpatrick m_value.SetValueType(Value::ValueType::LoadAddress);
159061da546Spatrick break;
160061da546Spatrick case eAddressTypeHost:
161be691f3bSpatrick m_value.SetValueType(Value::ValueType::HostAddress);
162061da546Spatrick break;
163061da546Spatrick }
164061da546Spatrick m_value.SetCompilerType(compiler_type);
165061da546Spatrick m_name = name;
166061da546Spatrick SetIsConstant();
167061da546Spatrick SetValueIsValid(true);
168061da546Spatrick SetAddressTypeOfChildren(eAddressTypeLoad);
169061da546Spatrick }
170061da546Spatrick
Create(ExecutionContextScope * exe_scope,const Status & error)171061da546Spatrick ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
172061da546Spatrick const Status &error) {
173dda28197Spatrick auto manager_sp = ValueObjectManager::Create();
174dda28197Spatrick return (new ValueObjectConstResult(exe_scope, *manager_sp, error))->GetSP();
175061da546Spatrick }
176061da546Spatrick
ValueObjectConstResult(ExecutionContextScope * exe_scope,ValueObjectManager & manager,const Status & error)177061da546Spatrick ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
178dda28197Spatrick ValueObjectManager &manager,
179061da546Spatrick const Status &error)
180be691f3bSpatrick : ValueObject(exe_scope, manager), m_impl(this) {
181061da546Spatrick m_error = error;
182061da546Spatrick SetIsConstant();
183061da546Spatrick }
184061da546Spatrick
ValueObjectConstResult(ExecutionContextScope * exe_scope,ValueObjectManager & manager,const Value & value,ConstString name,Module * module)185061da546Spatrick ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
186dda28197Spatrick ValueObjectManager &manager,
187061da546Spatrick const Value &value,
188dda28197Spatrick ConstString name, Module *module)
189be691f3bSpatrick : ValueObject(exe_scope, manager), m_impl(this) {
190061da546Spatrick m_value = value;
191061da546Spatrick m_name = name;
192061da546Spatrick ExecutionContext exe_ctx;
193061da546Spatrick exe_scope->CalculateExecutionContext(exe_ctx);
194061da546Spatrick m_error = m_value.GetValueAsData(&exe_ctx, m_data, module);
195061da546Spatrick }
196061da546Spatrick
197be691f3bSpatrick ValueObjectConstResult::~ValueObjectConstResult() = default;
198061da546Spatrick
GetCompilerTypeImpl()199061da546Spatrick CompilerType ValueObjectConstResult::GetCompilerTypeImpl() {
200061da546Spatrick return m_value.GetCompilerType();
201061da546Spatrick }
202061da546Spatrick
GetValueType() const203061da546Spatrick lldb::ValueType ValueObjectConstResult::GetValueType() const {
204061da546Spatrick return eValueTypeConstResult;
205061da546Spatrick }
206061da546Spatrick
GetByteSize()207*f6aab3d8Srobert std::optional<uint64_t> ValueObjectConstResult::GetByteSize() {
208061da546Spatrick ExecutionContext exe_ctx(GetExecutionContextRef());
209be691f3bSpatrick if (!m_byte_size) {
210061da546Spatrick if (auto size =
211061da546Spatrick GetCompilerType().GetByteSize(exe_ctx.GetBestExecutionContextScope()))
212061da546Spatrick SetByteSize(*size);
213061da546Spatrick }
214061da546Spatrick return m_byte_size;
215061da546Spatrick }
216061da546Spatrick
SetByteSize(size_t size)217061da546Spatrick void ValueObjectConstResult::SetByteSize(size_t size) { m_byte_size = size; }
218061da546Spatrick
CalculateNumChildren(uint32_t max)219061da546Spatrick size_t ValueObjectConstResult::CalculateNumChildren(uint32_t max) {
220061da546Spatrick ExecutionContext exe_ctx(GetExecutionContextRef());
221061da546Spatrick auto children_count = GetCompilerType().GetNumChildren(true, &exe_ctx);
222061da546Spatrick return children_count <= max ? children_count : max;
223061da546Spatrick }
224061da546Spatrick
GetTypeName()225061da546Spatrick ConstString ValueObjectConstResult::GetTypeName() {
226061da546Spatrick if (m_type_name.IsEmpty())
227dda28197Spatrick m_type_name = GetCompilerType().GetTypeName();
228061da546Spatrick return m_type_name;
229061da546Spatrick }
230061da546Spatrick
GetDisplayTypeName()231061da546Spatrick ConstString ValueObjectConstResult::GetDisplayTypeName() {
232061da546Spatrick return GetCompilerType().GetDisplayTypeName();
233061da546Spatrick }
234061da546Spatrick
UpdateValue()235061da546Spatrick bool ValueObjectConstResult::UpdateValue() {
236061da546Spatrick // Const value is always valid
237061da546Spatrick SetValueIsValid(true);
238061da546Spatrick return true;
239061da546Spatrick }
240061da546Spatrick
IsInScope()241061da546Spatrick bool ValueObjectConstResult::IsInScope() {
242061da546Spatrick // A const result value is always in scope since it serializes all
243061da546Spatrick // information needed to contain the constant value.
244061da546Spatrick return true;
245061da546Spatrick }
246061da546Spatrick
Dereference(Status & error)247061da546Spatrick lldb::ValueObjectSP ValueObjectConstResult::Dereference(Status &error) {
248061da546Spatrick return m_impl.Dereference(error);
249061da546Spatrick }
250061da546Spatrick
GetSyntheticChildAtOffset(uint32_t offset,const CompilerType & type,bool can_create,ConstString name_const_str)251061da546Spatrick lldb::ValueObjectSP ValueObjectConstResult::GetSyntheticChildAtOffset(
252061da546Spatrick uint32_t offset, const CompilerType &type, bool can_create,
253061da546Spatrick ConstString name_const_str) {
254061da546Spatrick return m_impl.GetSyntheticChildAtOffset(offset, type, can_create,
255061da546Spatrick name_const_str);
256061da546Spatrick }
257061da546Spatrick
AddressOf(Status & error)258061da546Spatrick lldb::ValueObjectSP ValueObjectConstResult::AddressOf(Status &error) {
259061da546Spatrick return m_impl.AddressOf(error);
260061da546Spatrick }
261061da546Spatrick
GetAddressOf(bool scalar_is_load_address,AddressType * address_type)262061da546Spatrick lldb::addr_t ValueObjectConstResult::GetAddressOf(bool scalar_is_load_address,
263061da546Spatrick AddressType *address_type) {
264061da546Spatrick return m_impl.GetAddressOf(scalar_is_load_address, address_type);
265061da546Spatrick }
266061da546Spatrick
CreateChildAtIndex(size_t idx,bool synthetic_array_member,int32_t synthetic_index)267061da546Spatrick ValueObject *ValueObjectConstResult::CreateChildAtIndex(
268061da546Spatrick size_t idx, bool synthetic_array_member, int32_t synthetic_index) {
269061da546Spatrick return m_impl.CreateChildAtIndex(idx, synthetic_array_member,
270061da546Spatrick synthetic_index);
271061da546Spatrick }
272061da546Spatrick
GetPointeeData(DataExtractor & data,uint32_t item_idx,uint32_t item_count)273061da546Spatrick size_t ValueObjectConstResult::GetPointeeData(DataExtractor &data,
274061da546Spatrick uint32_t item_idx,
275061da546Spatrick uint32_t item_count) {
276061da546Spatrick return m_impl.GetPointeeData(data, item_idx, item_count);
277061da546Spatrick }
278061da546Spatrick
279061da546Spatrick lldb::ValueObjectSP
GetDynamicValue(lldb::DynamicValueType use_dynamic)280061da546Spatrick ValueObjectConstResult::GetDynamicValue(lldb::DynamicValueType use_dynamic) {
281061da546Spatrick // Always recalculate dynamic values for const results as the memory that
282061da546Spatrick // they might point to might have changed at any time.
283061da546Spatrick if (use_dynamic != eNoDynamicValues) {
284061da546Spatrick if (!IsDynamic()) {
285061da546Spatrick ExecutionContext exe_ctx(GetExecutionContextRef());
286061da546Spatrick Process *process = exe_ctx.GetProcessPtr();
287061da546Spatrick if (process && process->IsPossibleDynamicValue(*this))
288061da546Spatrick m_dynamic_value = new ValueObjectDynamicValue(*this, use_dynamic);
289061da546Spatrick }
290061da546Spatrick if (m_dynamic_value)
291061da546Spatrick return m_dynamic_value->GetSP();
292061da546Spatrick }
293061da546Spatrick return ValueObjectSP();
294061da546Spatrick }
295061da546Spatrick
296061da546Spatrick lldb::ValueObjectSP
Cast(const CompilerType & compiler_type)297061da546Spatrick ValueObjectConstResult::Cast(const CompilerType &compiler_type) {
298061da546Spatrick return m_impl.Cast(compiler_type);
299061da546Spatrick }
300061da546Spatrick
GetPreferredDisplayLanguage()301061da546Spatrick lldb::LanguageType ValueObjectConstResult::GetPreferredDisplayLanguage() {
302061da546Spatrick if (m_preferred_display_language != lldb::eLanguageTypeUnknown)
303061da546Spatrick return m_preferred_display_language;
304061da546Spatrick return GetCompilerTypeImpl().GetMinimumLanguage();
305061da546Spatrick }
306