blob: 0596415885be8fa07fe69148eb8e35c5ec1f81c1 [file] [log] [blame]
Raphael Isemann80814282020-01-24 08:23:27 +01001//===-- ValueObjectConstResult.cpp ----------------------------------------===//
Greg Clayton1d3afba2010-10-05 00:00:42 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Greg Clayton1d3afba2010-10-05 00:00:42 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/Core/ValueObjectConstResult.h"
10
Greg Clayton94073022012-07-07 01:22:45 +000011#include "lldb/Core/ValueObjectDynamicValue.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000012#include "lldb/Symbol/CompilerType.h"
13#include "lldb/Target/ExecutionContext.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000014#include "lldb/Target/ExecutionContextScope.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000015#include "lldb/Target/Process.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000016#include "lldb/Utility/DataBuffer.h"
17#include "lldb/Utility/DataBufferHeap.h"
Zachary Turner666cc0b2017-03-04 01:30:05 +000018#include "lldb/Utility/DataExtractor.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000019#include "lldb/Utility/Scalar.h"
Greg Clayton1d3afba2010-10-05 00:00:42 +000020
Zachary Turner2f3df612017-04-06 21:28:29 +000021namespace lldb_private {
22class Module;
23}
Greg Clayton1d3afba2010-10-05 00:00:42 +000024
25using namespace lldb;
26using namespace lldb_private;
27
Kate Stoneb9c1b512016-09-06 20:57:50 +000028ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
29 ByteOrder byte_order,
30 uint32_t addr_byte_size,
31 lldb::addr_t address) {
32 return (new ValueObjectConstResult(exe_scope, byte_order, addr_byte_size,
33 address))
34 ->GetSP();
Jim Ingham58b59f92011-04-22 23:53:53 +000035}
36
Kate Stoneb9c1b512016-09-06 20:57:50 +000037ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
38 ByteOrder byte_order,
39 uint32_t addr_byte_size,
40 lldb::addr_t address)
41 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
42 m_impl(this, address) {
43 SetIsConstant();
44 SetValueIsValid(true);
45 m_data.SetByteOrder(byte_order);
46 m_data.SetAddressByteSize(addr_byte_size);
47 SetAddressTypeOfChildren(eAddressTypeLoad);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000048}
49
Kate Stoneb9c1b512016-09-06 20:57:50 +000050ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
51 const CompilerType &compiler_type,
Adrian Prantl0e4c4822019-03-06 21:22:25 +000052 ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +000053 const DataExtractor &data,
54 lldb::addr_t address) {
55 return (new ValueObjectConstResult(exe_scope, compiler_type, name, data,
56 address))
57 ->GetSP();
Jim Ingham58b59f92011-04-22 23:53:53 +000058}
59
Kate Stoneb9c1b512016-09-06 20:57:50 +000060ValueObjectConstResult::ValueObjectConstResult(
61 ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
Adrian Prantl0e4c4822019-03-06 21:22:25 +000062 ConstString name, const DataExtractor &data, lldb::addr_t address)
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
64 m_impl(this, address) {
65 m_data = data;
66
67 if (!m_data.GetSharedDataBuffer()) {
68 DataBufferSP shared_data_buffer(
69 new DataBufferHeap(data.GetDataStart(), data.GetByteSize()));
70 m_data.SetData(shared_data_buffer);
71 }
72
73 m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
74 m_value.SetValueType(Value::eValueTypeHostAddress);
75 m_value.SetCompilerType(compiler_type);
76 m_name = name;
77 SetIsConstant();
78 SetValueIsValid(true);
79 SetAddressTypeOfChildren(eAddressTypeLoad);
80}
81
82ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
83 const CompilerType &compiler_type,
Adrian Prantl0e4c4822019-03-06 21:22:25 +000084 ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +000085 const lldb::DataBufferSP &data_sp,
86 lldb::ByteOrder data_byte_order,
87 uint32_t data_addr_size,
88 lldb::addr_t address) {
89 return (new ValueObjectConstResult(exe_scope, compiler_type, name, data_sp,
90 data_byte_order, data_addr_size, address))
91 ->GetSP();
92}
93
94ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
95 Value &value,
Adrian Prantl0e4c4822019-03-06 21:22:25 +000096 ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +000097 Module *module) {
98 return (new ValueObjectConstResult(exe_scope, value, name, module))->GetSP();
99}
100
101ValueObjectConstResult::ValueObjectConstResult(
102 ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000103 ConstString name, const lldb::DataBufferSP &data_sp,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 lldb::ByteOrder data_byte_order, uint32_t data_addr_size,
105 lldb::addr_t address)
106 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
107 m_impl(this, address) {
108 m_data.SetByteOrder(data_byte_order);
109 m_data.SetAddressByteSize(data_addr_size);
110 m_data.SetData(data_sp);
111 m_value.GetScalar() = (uintptr_t)data_sp->GetBytes();
112 m_value.SetValueType(Value::eValueTypeHostAddress);
113 // m_value.SetContext(Value::eContextTypeClangType, compiler_type);
114 m_value.SetCompilerType(compiler_type);
115 m_name = name;
116 SetIsConstant();
117 SetValueIsValid(true);
118 SetAddressTypeOfChildren(eAddressTypeLoad);
119}
120
121ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
122 const CompilerType &compiler_type,
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000123 ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 lldb::addr_t address,
125 AddressType address_type,
126 uint32_t addr_byte_size) {
127 return (new ValueObjectConstResult(exe_scope, compiler_type, name, address,
128 address_type, addr_byte_size))
129 ->GetSP();
130}
131
132ValueObjectConstResult::ValueObjectConstResult(
133 ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000134 ConstString name, lldb::addr_t address, AddressType address_type,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 uint32_t addr_byte_size)
136 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
137 m_impl(this, address) {
138 m_value.GetScalar() = address;
139 m_data.SetAddressByteSize(addr_byte_size);
140 m_value.GetScalar().GetData(m_data, addr_byte_size);
141 // m_value.SetValueType(Value::eValueTypeHostAddress);
142 switch (address_type) {
143 case eAddressTypeInvalid:
144 m_value.SetValueType(Value::eValueTypeScalar);
145 break;
146 case eAddressTypeFile:
147 m_value.SetValueType(Value::eValueTypeFileAddress);
148 break;
149 case eAddressTypeLoad:
150 m_value.SetValueType(Value::eValueTypeLoadAddress);
151 break;
152 case eAddressTypeHost:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000153 m_value.SetValueType(Value::eValueTypeHostAddress);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000154 break;
155 }
156 // m_value.SetContext(Value::eContextTypeClangType, compiler_type);
157 m_value.SetCompilerType(compiler_type);
158 m_name = name;
159 SetIsConstant();
160 SetValueIsValid(true);
161 SetAddressTypeOfChildren(eAddressTypeLoad);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000162}
163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
Zachary Turner97206d52017-05-12 04:51:55 +0000165 const Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166 return (new ValueObjectConstResult(exe_scope, error))->GetSP();
Jim Ingham58b59f92011-04-22 23:53:53 +0000167}
168
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
Zachary Turner97206d52017-05-12 04:51:55 +0000170 const Status &error)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 : ValueObject(exe_scope), m_type_name(), m_byte_size(0), m_impl(this) {
172 m_error = error;
173 SetIsConstant();
Jim Ingham73ca05a2011-12-17 01:35:57 +0000174}
175
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
177 const Value &value,
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000178 ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179 Module *module)
180 : ValueObject(exe_scope), m_type_name(), m_byte_size(0), m_impl(this) {
181 m_value = value;
182 m_name = name;
183 ExecutionContext exe_ctx;
184 exe_scope->CalculateExecutionContext(exe_ctx);
Adrian Prantld9cbd2a2019-08-08 19:22:32 +0000185 m_error = m_value.GetValueAsData(&exe_ctx, m_data, module);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000186}
187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188ValueObjectConstResult::~ValueObjectConstResult() {}
189
190CompilerType ValueObjectConstResult::GetCompilerTypeImpl() {
191 return m_value.GetCompilerType();
Jim Ingham58b59f92011-04-22 23:53:53 +0000192}
193
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194lldb::ValueType ValueObjectConstResult::GetValueType() const {
195 return eValueTypeConstResult;
196}
197
198uint64_t ValueObjectConstResult::GetByteSize() {
199 ExecutionContext exe_ctx(GetExecutionContextRef());
Adrian Prantld963a7c2019-01-15 18:07:52 +0000200 if (m_byte_size == 0) {
201 if (auto size =
202 GetCompilerType().GetByteSize(exe_ctx.GetBestExecutionContextScope()))
203 SetByteSize(*size);
204 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000205 return m_byte_size;
206}
207
208void ValueObjectConstResult::SetByteSize(size_t size) { m_byte_size = size; }
209
210size_t ValueObjectConstResult::CalculateNumChildren(uint32_t max) {
Adrian Prantleca07c52018-11-05 20:49:07 +0000211 ExecutionContext exe_ctx(GetExecutionContextRef());
212 auto children_count = GetCompilerType().GetNumChildren(true, &exe_ctx);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 return children_count <= max ? children_count : max;
214}
215
216ConstString ValueObjectConstResult::GetTypeName() {
217 if (m_type_name.IsEmpty())
218 m_type_name = GetCompilerType().GetConstTypeName();
219 return m_type_name;
220}
221
222ConstString ValueObjectConstResult::GetDisplayTypeName() {
223 return GetCompilerType().GetDisplayTypeName();
224}
225
226bool ValueObjectConstResult::UpdateValue() {
227 // Const value is always valid
228 SetValueIsValid(true);
229 return true;
230}
231
232bool ValueObjectConstResult::IsInScope() {
233 // A const result value is always in scope since it serializes all
234 // information needed to contain the constant value.
235 return true;
236}
237
Zachary Turner97206d52017-05-12 04:51:55 +0000238lldb::ValueObjectSP ValueObjectConstResult::Dereference(Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239 return m_impl.Dereference(error);
240}
241
242lldb::ValueObjectSP ValueObjectConstResult::GetSyntheticChildAtOffset(
243 uint32_t offset, const CompilerType &type, bool can_create,
244 ConstString name_const_str) {
245 return m_impl.GetSyntheticChildAtOffset(offset, type, can_create,
246 name_const_str);
247}
248
Zachary Turner97206d52017-05-12 04:51:55 +0000249lldb::ValueObjectSP ValueObjectConstResult::AddressOf(Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000250 return m_impl.AddressOf(error);
251}
252
253lldb::addr_t ValueObjectConstResult::GetAddressOf(bool scalar_is_load_address,
254 AddressType *address_type) {
255 return m_impl.GetAddressOf(scalar_is_load_address, address_type);
256}
257
258ValueObject *ValueObjectConstResult::CreateChildAtIndex(
259 size_t idx, bool synthetic_array_member, int32_t synthetic_index) {
260 return m_impl.CreateChildAtIndex(idx, synthetic_array_member,
261 synthetic_index);
262}
263
264size_t ValueObjectConstResult::GetPointeeData(DataExtractor &data,
265 uint32_t item_idx,
266 uint32_t item_count) {
267 return m_impl.GetPointeeData(data, item_idx, item_count);
268}
269
270lldb::ValueObjectSP
271ValueObjectConstResult::GetDynamicValue(lldb::DynamicValueType use_dynamic) {
272 // Always recalculate dynamic values for const results as the memory that
273 // they might point to might have changed at any time.
274 if (use_dynamic != eNoDynamicValues) {
275 if (!IsDynamic()) {
276 ExecutionContext exe_ctx(GetExecutionContextRef());
277 Process *process = exe_ctx.GetProcessPtr();
278 if (process && process->IsPossibleDynamicValue(*this))
279 m_dynamic_value = new ValueObjectDynamicValue(*this, use_dynamic);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000280 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000281 if (m_dynamic_value)
282 return m_dynamic_value->GetSP();
283 }
284 return ValueObjectSP();
Greg Clayton1d3afba2010-10-05 00:00:42 +0000285}
Enrico Granata9128ee22011-09-06 19:20:51 +0000286
287lldb::ValueObjectSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000288ValueObjectConstResult::Cast(const CompilerType &compiler_type) {
289 return m_impl.Cast(compiler_type);
Enrico Granata9128ee22011-09-06 19:20:51 +0000290}
291
Kate Stoneb9c1b512016-09-06 20:57:50 +0000292lldb::LanguageType ValueObjectConstResult::GetPreferredDisplayLanguage() {
293 if (m_preferred_display_language != lldb::eLanguageTypeUnknown)
294 return m_preferred_display_language;
295 return GetCompilerTypeImpl().GetMinimumLanguage();
Enrico Granatac1247f52014-11-06 21:23:20 +0000296}