blob: 2364a0e38ff47e3ba864361d0b906bfca49a15c4 [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"
15#include "lldb/Target/ExecutionContextScope.h" // for ExecutionContextScope
16#include "lldb/Target/Process.h"
17#include "lldb/Utility/DataBuffer.h" // for DataBuffer
18#include "lldb/Utility/DataBufferHeap.h" // for DataBufferHeap
Zachary Turner666cc0b2017-03-04 01:30:05 +000019#include "lldb/Utility/DataExtractor.h"
Pavel Labathd821c992018-08-07 11:07:21 +000020#include "lldb/Utility/Scalar.h" // for Scalar
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());
201
202 if (m_byte_size == 0)
203 SetByteSize(
204 GetCompilerType().GetByteSize(exe_ctx.GetBestExecutionContextScope()));
205 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}