blob: f6e32c03b0eb34eab374c6e01a3e5ed57bce7b31 [file] [log] [blame]
Greg Clayton1d3afba2010-10-05 00:00:42 +00001//===-- ValueObjectConstResult.cpp ------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Core/ValueObjectConstResult.h"
11
Greg Clayton94073022012-07-07 01:22:45 +000012#include "lldb/Core/ValueObjectDynamicValue.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000013#include "lldb/Symbol/CompilerType.h"
14#include "lldb/Target/ExecutionContext.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000015#include "lldb/Target/ExecutionContextScope.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000016#include "lldb/Target/Process.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000017#include "lldb/Utility/DataBuffer.h"
18#include "lldb/Utility/DataBufferHeap.h"
Zachary Turner666cc0b2017-03-04 01:30:05 +000019#include "lldb/Utility/DataExtractor.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000020#include "lldb/Utility/Scalar.h"
Greg Clayton1d3afba2010-10-05 00:00:42 +000021
Zachary Turner2f3df612017-04-06 21:28:29 +000022namespace lldb_private {
23class Module;
24}
Greg Clayton1d3afba2010-10-05 00:00:42 +000025
26using namespace lldb;
27using namespace lldb_private;
28
Kate Stoneb9c1b512016-09-06 20:57:50 +000029ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
30 ByteOrder byte_order,
31 uint32_t addr_byte_size,
32 lldb::addr_t address) {
33 return (new ValueObjectConstResult(exe_scope, byte_order, addr_byte_size,
34 address))
35 ->GetSP();
Jim Ingham58b59f92011-04-22 23:53:53 +000036}
37
Kate Stoneb9c1b512016-09-06 20:57:50 +000038ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
39 ByteOrder byte_order,
40 uint32_t addr_byte_size,
41 lldb::addr_t address)
42 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
43 m_impl(this, address) {
44 SetIsConstant();
45 SetValueIsValid(true);
46 m_data.SetByteOrder(byte_order);
47 m_data.SetAddressByteSize(addr_byte_size);
48 SetAddressTypeOfChildren(eAddressTypeLoad);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000049}
50
Kate Stoneb9c1b512016-09-06 20:57:50 +000051ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
52 const CompilerType &compiler_type,
53 const ConstString &name,
54 const DataExtractor &data,
55 lldb::addr_t address) {
56 return (new ValueObjectConstResult(exe_scope, compiler_type, name, data,
57 address))
58 ->GetSP();
Jim Ingham58b59f92011-04-22 23:53:53 +000059}
60
Kate Stoneb9c1b512016-09-06 20:57:50 +000061ValueObjectConstResult::ValueObjectConstResult(
62 ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
63 const ConstString &name, const DataExtractor &data, lldb::addr_t address)
64 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
65 m_impl(this, address) {
66 m_data = data;
67
68 if (!m_data.GetSharedDataBuffer()) {
69 DataBufferSP shared_data_buffer(
70 new DataBufferHeap(data.GetDataStart(), data.GetByteSize()));
71 m_data.SetData(shared_data_buffer);
72 }
73
74 m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
75 m_value.SetValueType(Value::eValueTypeHostAddress);
76 m_value.SetCompilerType(compiler_type);
77 m_name = name;
78 SetIsConstant();
79 SetValueIsValid(true);
80 SetAddressTypeOfChildren(eAddressTypeLoad);
81}
82
83ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
84 const CompilerType &compiler_type,
85 const ConstString &name,
86 const lldb::DataBufferSP &data_sp,
87 lldb::ByteOrder data_byte_order,
88 uint32_t data_addr_size,
89 lldb::addr_t address) {
90 return (new ValueObjectConstResult(exe_scope, compiler_type, name, data_sp,
91 data_byte_order, data_addr_size, address))
92 ->GetSP();
93}
94
95ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
96 Value &value,
97 const ConstString &name,
98 Module *module) {
99 return (new ValueObjectConstResult(exe_scope, value, name, module))->GetSP();
100}
101
102ValueObjectConstResult::ValueObjectConstResult(
103 ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
104 const ConstString &name, const lldb::DataBufferSP &data_sp,
105 lldb::ByteOrder data_byte_order, uint32_t data_addr_size,
106 lldb::addr_t address)
107 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
108 m_impl(this, address) {
109 m_data.SetByteOrder(data_byte_order);
110 m_data.SetAddressByteSize(data_addr_size);
111 m_data.SetData(data_sp);
112 m_value.GetScalar() = (uintptr_t)data_sp->GetBytes();
113 m_value.SetValueType(Value::eValueTypeHostAddress);
114 // m_value.SetContext(Value::eContextTypeClangType, compiler_type);
115 m_value.SetCompilerType(compiler_type);
116 m_name = name;
117 SetIsConstant();
118 SetValueIsValid(true);
119 SetAddressTypeOfChildren(eAddressTypeLoad);
120}
121
122ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
123 const CompilerType &compiler_type,
124 const ConstString &name,
125 lldb::addr_t address,
126 AddressType address_type,
127 uint32_t addr_byte_size) {
128 return (new ValueObjectConstResult(exe_scope, compiler_type, name, address,
129 address_type, addr_byte_size))
130 ->GetSP();
131}
132
133ValueObjectConstResult::ValueObjectConstResult(
134 ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
135 const ConstString &name, lldb::addr_t address, AddressType address_type,
136 uint32_t addr_byte_size)
137 : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
138 m_impl(this, address) {
139 m_value.GetScalar() = address;
140 m_data.SetAddressByteSize(addr_byte_size);
141 m_value.GetScalar().GetData(m_data, addr_byte_size);
142 // m_value.SetValueType(Value::eValueTypeHostAddress);
143 switch (address_type) {
144 case eAddressTypeInvalid:
145 m_value.SetValueType(Value::eValueTypeScalar);
146 break;
147 case eAddressTypeFile:
148 m_value.SetValueType(Value::eValueTypeFileAddress);
149 break;
150 case eAddressTypeLoad:
151 m_value.SetValueType(Value::eValueTypeLoadAddress);
152 break;
153 case eAddressTypeHost:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000154 m_value.SetValueType(Value::eValueTypeHostAddress);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155 break;
156 }
157 // m_value.SetContext(Value::eContextTypeClangType, compiler_type);
158 m_value.SetCompilerType(compiler_type);
159 m_name = name;
160 SetIsConstant();
161 SetValueIsValid(true);
162 SetAddressTypeOfChildren(eAddressTypeLoad);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000163}
164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
Zachary Turner97206d52017-05-12 04:51:55 +0000166 const Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 return (new ValueObjectConstResult(exe_scope, error))->GetSP();
Jim Ingham58b59f92011-04-22 23:53:53 +0000168}
169
Kate Stoneb9c1b512016-09-06 20:57:50 +0000170ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
Zachary Turner97206d52017-05-12 04:51:55 +0000171 const Status &error)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 : ValueObject(exe_scope), m_type_name(), m_byte_size(0), m_impl(this) {
173 m_error = error;
174 SetIsConstant();
Jim Ingham73ca05a2011-12-17 01:35:57 +0000175}
176
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
178 const Value &value,
179 const ConstString &name,
180 Module *module)
181 : ValueObject(exe_scope), m_type_name(), m_byte_size(0), m_impl(this) {
182 m_value = value;
183 m_name = name;
184 ExecutionContext exe_ctx;
185 exe_scope->CalculateExecutionContext(exe_ctx);
186 m_error = m_value.GetValueAsData(&exe_ctx, m_data, 0, module);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000187}
188
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189ValueObjectConstResult::~ValueObjectConstResult() {}
190
191CompilerType ValueObjectConstResult::GetCompilerTypeImpl() {
192 return m_value.GetCompilerType();
Jim Ingham58b59f92011-04-22 23:53:53 +0000193}
194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195lldb::ValueType ValueObjectConstResult::GetValueType() const {
196 return eValueTypeConstResult;
197}
198
199uint64_t ValueObjectConstResult::GetByteSize() {
200 ExecutionContext exe_ctx(GetExecutionContextRef());
Adrian Prantld963a7c2019-01-15 18:07:52 +0000201 if (m_byte_size == 0) {
202 if (auto size =
203 GetCompilerType().GetByteSize(exe_ctx.GetBestExecutionContextScope()))
204 SetByteSize(*size);
205 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206 return m_byte_size;
207}
208
209void ValueObjectConstResult::SetByteSize(size_t size) { m_byte_size = size; }
210
211size_t ValueObjectConstResult::CalculateNumChildren(uint32_t max) {
Adrian Prantleca07c52018-11-05 20:49:07 +0000212 ExecutionContext exe_ctx(GetExecutionContextRef());
213 auto children_count = GetCompilerType().GetNumChildren(true, &exe_ctx);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214 return children_count <= max ? children_count : max;
215}
216
217ConstString ValueObjectConstResult::GetTypeName() {
218 if (m_type_name.IsEmpty())
219 m_type_name = GetCompilerType().GetConstTypeName();
220 return m_type_name;
221}
222
223ConstString ValueObjectConstResult::GetDisplayTypeName() {
224 return GetCompilerType().GetDisplayTypeName();
225}
226
227bool ValueObjectConstResult::UpdateValue() {
228 // Const value is always valid
229 SetValueIsValid(true);
230 return true;
231}
232
233bool ValueObjectConstResult::IsInScope() {
234 // A const result value is always in scope since it serializes all
235 // information needed to contain the constant value.
236 return true;
237}
238
Zachary Turner97206d52017-05-12 04:51:55 +0000239lldb::ValueObjectSP ValueObjectConstResult::Dereference(Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000240 return m_impl.Dereference(error);
241}
242
243lldb::ValueObjectSP ValueObjectConstResult::GetSyntheticChildAtOffset(
244 uint32_t offset, const CompilerType &type, bool can_create,
245 ConstString name_const_str) {
246 return m_impl.GetSyntheticChildAtOffset(offset, type, can_create,
247 name_const_str);
248}
249
Zachary Turner97206d52017-05-12 04:51:55 +0000250lldb::ValueObjectSP ValueObjectConstResult::AddressOf(Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251 return m_impl.AddressOf(error);
252}
253
254lldb::addr_t ValueObjectConstResult::GetAddressOf(bool scalar_is_load_address,
255 AddressType *address_type) {
256 return m_impl.GetAddressOf(scalar_is_load_address, address_type);
257}
258
259ValueObject *ValueObjectConstResult::CreateChildAtIndex(
260 size_t idx, bool synthetic_array_member, int32_t synthetic_index) {
261 return m_impl.CreateChildAtIndex(idx, synthetic_array_member,
262 synthetic_index);
263}
264
265size_t ValueObjectConstResult::GetPointeeData(DataExtractor &data,
266 uint32_t item_idx,
267 uint32_t item_count) {
268 return m_impl.GetPointeeData(data, item_idx, item_count);
269}
270
271lldb::ValueObjectSP
272ValueObjectConstResult::GetDynamicValue(lldb::DynamicValueType use_dynamic) {
273 // Always recalculate dynamic values for const results as the memory that
274 // they might point to might have changed at any time.
275 if (use_dynamic != eNoDynamicValues) {
276 if (!IsDynamic()) {
277 ExecutionContext exe_ctx(GetExecutionContextRef());
278 Process *process = exe_ctx.GetProcessPtr();
279 if (process && process->IsPossibleDynamicValue(*this))
280 m_dynamic_value = new ValueObjectDynamicValue(*this, use_dynamic);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000281 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000282 if (m_dynamic_value)
283 return m_dynamic_value->GetSP();
284 }
285 return ValueObjectSP();
Greg Clayton1d3afba2010-10-05 00:00:42 +0000286}
Enrico Granata9128ee22011-09-06 19:20:51 +0000287
288lldb::ValueObjectSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000289ValueObjectConstResult::Cast(const CompilerType &compiler_type) {
290 return m_impl.Cast(compiler_type);
Enrico Granata9128ee22011-09-06 19:20:51 +0000291}
292
Kate Stoneb9c1b512016-09-06 20:57:50 +0000293lldb::LanguageType ValueObjectConstResult::GetPreferredDisplayLanguage() {
294 if (m_preferred_display_language != lldb::eLanguageTypeUnknown)
295 return m_preferred_display_language;
296 return GetCompilerTypeImpl().GetMinimumLanguage();
Enrico Granatac1247f52014-11-06 21:23:20 +0000297}