1 //===-- ValueObject.cpp ---------------------------------------------------===//
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 #include "lldb/Core/ValueObject.h"
10
11 #include "lldb/Core/Address.h"
12 #include "lldb/Core/Module.h"
13 #include "lldb/Core/ValueObjectCast.h"
14 #include "lldb/Core/ValueObjectChild.h"
15 #include "lldb/Core/ValueObjectConstResult.h"
16 #include "lldb/Core/ValueObjectDynamicValue.h"
17 #include "lldb/Core/ValueObjectMemory.h"
18 #include "lldb/Core/ValueObjectSyntheticFilter.h"
19 #include "lldb/DataFormatters/DataVisualization.h"
20 #include "lldb/DataFormatters/DumpValueObjectOptions.h"
21 #include "lldb/DataFormatters/FormatManager.h"
22 #include "lldb/DataFormatters/StringPrinter.h"
23 #include "lldb/DataFormatters/TypeFormat.h"
24 #include "lldb/DataFormatters/TypeSummary.h"
25 #include "lldb/DataFormatters/ValueObjectPrinter.h"
26 #include "lldb/Expression/ExpressionVariable.h"
27 #include "lldb/Host/Config.h"
28 #include "lldb/Symbol/CompileUnit.h"
29 #include "lldb/Symbol/CompilerType.h"
30 #include "lldb/Symbol/Declaration.h"
31 #include "lldb/Symbol/SymbolContext.h"
32 #include "lldb/Symbol/Type.h"
33 #include "lldb/Symbol/Variable.h"
34 #include "lldb/Target/ExecutionContext.h"
35 #include "lldb/Target/Language.h"
36 #include "lldb/Target/LanguageRuntime.h"
37 #include "lldb/Target/Process.h"
38 #include "lldb/Target/StackFrame.h"
39 #include "lldb/Target/Target.h"
40 #include "lldb/Target/Thread.h"
41 #include "lldb/Target/ThreadList.h"
42 #include "lldb/Utility/DataBuffer.h"
43 #include "lldb/Utility/DataBufferHeap.h"
44 #include "lldb/Utility/Flags.h"
45 #include "lldb/Utility/Log.h"
46 #include "lldb/Utility/Logging.h"
47 #include "lldb/Utility/Scalar.h"
48 #include "lldb/Utility/Stream.h"
49 #include "lldb/Utility/StreamString.h"
50 #include "lldb/lldb-private-types.h"
51
52 #include "llvm/Support/Compiler.h"
53
54 #include <algorithm>
55 #include <cstdint>
56 #include <cstdlib>
57 #include <memory>
58 #include <tuple>
59
60 #include <assert.h>
61 #include <inttypes.h>
62 #include <stdio.h>
63 #include <string.h>
64
65 namespace lldb_private {
66 class ExecutionContextScope;
67 }
68 namespace lldb_private {
69 class SymbolContextScope;
70 }
71
72 using namespace lldb;
73 using namespace lldb_private;
74
75 static user_id_t g_value_obj_uid = 0;
76
77 // ValueObject constructor
ValueObject(ValueObject & parent)78 ValueObject::ValueObject(ValueObject &parent)
79 : UserID(++g_value_obj_uid), // Unique identifier for every value object
80 m_parent(&parent), m_root(nullptr),
81 m_update_point(parent.GetUpdatePoint()), m_name(), m_data(), m_value(),
82 m_error(), m_value_str(), m_old_value_str(), m_location_str(),
83 m_summary_str(), m_object_desc_str(), m_manager(parent.GetManager()),
84 m_children(), m_synthetic_children(), m_dynamic_value(nullptr),
85 m_synthetic_value(nullptr), m_deref_valobj(nullptr),
86 m_format(eFormatDefault), m_last_format(eFormatDefault),
87 m_last_format_mgr_revision(0), m_type_summary_sp(), m_type_format_sp(),
88 m_synthetic_children_sp(), m_user_id_of_forced_summary(),
89 m_address_type_of_ptr_or_ref_children(eAddressTypeInvalid),
90 m_value_checksum(),
91 m_preferred_display_language(lldb::eLanguageTypeUnknown),
92 m_language_flags(0), m_value_is_valid(false), m_value_did_change(false),
93 m_children_count_valid(false), m_old_value_valid(false),
94 m_is_deref_of_parent(false), m_is_array_item_for_pointer(false),
95 m_is_bitfield_for_scalar(false), m_is_child_at_offset(false),
96 m_is_getting_summary(false),
97 m_did_calculate_complete_objc_class_type(false),
98 m_is_synthetic_children_generated(
99 parent.m_is_synthetic_children_generated) {
100 m_data.SetByteOrder(parent.GetDataExtractor().GetByteOrder());
101 m_data.SetAddressByteSize(parent.GetDataExtractor().GetAddressByteSize());
102 m_manager->ManageObject(this);
103 }
104
105 // ValueObject constructor
ValueObject(ExecutionContextScope * exe_scope,ValueObjectManager & manager,AddressType child_ptr_or_ref_addr_type)106 ValueObject::ValueObject(ExecutionContextScope *exe_scope,
107 ValueObjectManager &manager,
108 AddressType child_ptr_or_ref_addr_type)
109 : UserID(++g_value_obj_uid), // Unique identifier for every value object
110 m_parent(nullptr), m_root(nullptr), m_update_point(exe_scope), m_name(),
111 m_data(), m_value(), m_error(), m_value_str(), m_old_value_str(),
112 m_location_str(), m_summary_str(), m_object_desc_str(),
113 m_manager(&manager), m_children(), m_synthetic_children(),
114 m_dynamic_value(nullptr), m_synthetic_value(nullptr),
115 m_deref_valobj(nullptr), m_format(eFormatDefault),
116 m_last_format(eFormatDefault), m_last_format_mgr_revision(0),
117 m_type_summary_sp(), m_type_format_sp(), m_synthetic_children_sp(),
118 m_user_id_of_forced_summary(),
119 m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type),
120 m_value_checksum(),
121 m_preferred_display_language(lldb::eLanguageTypeUnknown),
122 m_language_flags(0), m_value_is_valid(false), m_value_did_change(false),
123 m_children_count_valid(false), m_old_value_valid(false),
124 m_is_deref_of_parent(false), m_is_array_item_for_pointer(false),
125 m_is_bitfield_for_scalar(false), m_is_child_at_offset(false),
126 m_is_getting_summary(false),
127 m_did_calculate_complete_objc_class_type(false),
128 m_is_synthetic_children_generated(false) {
129 if (exe_scope) {
130 TargetSP target_sp(exe_scope->CalculateTarget());
131 if (target_sp) {
132 const ArchSpec &arch = target_sp->GetArchitecture();
133 m_data.SetByteOrder(arch.GetByteOrder());
134 m_data.SetAddressByteSize(arch.GetAddressByteSize());
135 }
136 }
137 m_manager->ManageObject(this);
138 }
139
140 // Destructor
~ValueObject()141 ValueObject::~ValueObject() {}
142
UpdateValueIfNeeded(bool update_format)143 bool ValueObject::UpdateValueIfNeeded(bool update_format) {
144
145 bool did_change_formats = false;
146
147 if (update_format)
148 did_change_formats = UpdateFormatsIfNeeded();
149
150 // If this is a constant value, then our success is predicated on whether we
151 // have an error or not
152 if (GetIsConstant()) {
153 // if you are constant, things might still have changed behind your back
154 // (e.g. you are a frozen object and things have changed deeper than you
155 // cared to freeze-dry yourself) in this case, your value has not changed,
156 // but "computed" entries might have, so you might now have a different
157 // summary, or a different object description. clear these so we will
158 // recompute them
159 if (update_format && !did_change_formats)
160 ClearUserVisibleData(eClearUserVisibleDataItemsSummary |
161 eClearUserVisibleDataItemsDescription);
162 return m_error.Success();
163 }
164
165 bool first_update = IsChecksumEmpty();
166
167 if (NeedsUpdating()) {
168 m_update_point.SetUpdated();
169
170 // Save the old value using swap to avoid a string copy which also will
171 // clear our m_value_str
172 if (m_value_str.empty()) {
173 m_old_value_valid = false;
174 } else {
175 m_old_value_valid = true;
176 m_old_value_str.swap(m_value_str);
177 ClearUserVisibleData(eClearUserVisibleDataItemsValue);
178 }
179
180 ClearUserVisibleData();
181
182 if (IsInScope()) {
183 const bool value_was_valid = GetValueIsValid();
184 SetValueDidChange(false);
185
186 m_error.Clear();
187
188 // Call the pure virtual function to update the value
189
190 bool need_compare_checksums = false;
191 llvm::SmallVector<uint8_t, 16> old_checksum;
192
193 if (!first_update && CanProvideValue()) {
194 need_compare_checksums = true;
195 old_checksum.resize(m_value_checksum.size());
196 std::copy(m_value_checksum.begin(), m_value_checksum.end(),
197 old_checksum.begin());
198 }
199
200 bool success = UpdateValue();
201
202 SetValueIsValid(success);
203
204 if (success) {
205 UpdateChildrenAddressType();
206 const uint64_t max_checksum_size = 128;
207 m_data.Checksum(m_value_checksum, max_checksum_size);
208 } else {
209 need_compare_checksums = false;
210 m_value_checksum.clear();
211 }
212
213 assert(!need_compare_checksums ||
214 (!old_checksum.empty() && !m_value_checksum.empty()));
215
216 if (first_update)
217 SetValueDidChange(false);
218 else if (!m_value_did_change && !success) {
219 // The value wasn't gotten successfully, so we mark this as changed if
220 // the value used to be valid and now isn't
221 SetValueDidChange(value_was_valid);
222 } else if (need_compare_checksums) {
223 SetValueDidChange(memcmp(&old_checksum[0], &m_value_checksum[0],
224 m_value_checksum.size()));
225 }
226
227 } else {
228 m_error.SetErrorString("out of scope");
229 }
230 }
231 return m_error.Success();
232 }
233
UpdateFormatsIfNeeded()234 bool ValueObject::UpdateFormatsIfNeeded() {
235 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS));
236 LLDB_LOGF(log,
237 "[%s %p] checking for FormatManager revisions. ValueObject "
238 "rev: %d - Global rev: %d",
239 GetName().GetCString(), static_cast<void *>(this),
240 m_last_format_mgr_revision,
241 DataVisualization::GetCurrentRevision());
242
243 bool any_change = false;
244
245 if ((m_last_format_mgr_revision != DataVisualization::GetCurrentRevision())) {
246 m_last_format_mgr_revision = DataVisualization::GetCurrentRevision();
247 any_change = true;
248
249 SetValueFormat(DataVisualization::GetFormat(*this, eNoDynamicValues));
250 SetSummaryFormat(
251 DataVisualization::GetSummaryFormat(*this, GetDynamicValueType()));
252 #if LLDB_ENABLE_PYTHON
253 SetSyntheticChildren(
254 DataVisualization::GetSyntheticChildren(*this, GetDynamicValueType()));
255 #endif
256 }
257
258 return any_change;
259 }
260
SetNeedsUpdate()261 void ValueObject::SetNeedsUpdate() {
262 m_update_point.SetNeedsUpdate();
263 // We have to clear the value string here so ConstResult children will notice
264 // if their values are changed by hand (i.e. with SetValueAsCString).
265 ClearUserVisibleData(eClearUserVisibleDataItemsValue);
266 }
267
ClearDynamicTypeInformation()268 void ValueObject::ClearDynamicTypeInformation() {
269 m_children_count_valid = false;
270 m_did_calculate_complete_objc_class_type = false;
271 m_last_format_mgr_revision = 0;
272 m_override_type = CompilerType();
273 SetValueFormat(lldb::TypeFormatImplSP());
274 SetSummaryFormat(lldb::TypeSummaryImplSP());
275 SetSyntheticChildren(lldb::SyntheticChildrenSP());
276 }
277
MaybeCalculateCompleteType()278 CompilerType ValueObject::MaybeCalculateCompleteType() {
279 CompilerType compiler_type(GetCompilerTypeImpl());
280
281 if (m_did_calculate_complete_objc_class_type) {
282 if (m_override_type.IsValid())
283 return m_override_type;
284 else
285 return compiler_type;
286 }
287
288 m_did_calculate_complete_objc_class_type = true;
289
290 ProcessSP process_sp(
291 GetUpdatePoint().GetExecutionContextRef().GetProcessSP());
292
293 if (!process_sp)
294 return compiler_type;
295
296 if (auto *runtime =
297 process_sp->GetLanguageRuntime(GetObjectRuntimeLanguage())) {
298 if (llvm::Optional<CompilerType> complete_type =
299 runtime->GetRuntimeType(compiler_type)) {
300 m_override_type = complete_type.getValue();
301 if (m_override_type.IsValid())
302 return m_override_type;
303 }
304 }
305 return compiler_type;
306 }
307
GetCompilerType()308 CompilerType ValueObject::GetCompilerType() {
309 return MaybeCalculateCompleteType();
310 }
311
GetTypeImpl()312 TypeImpl ValueObject::GetTypeImpl() { return TypeImpl(GetCompilerType()); }
313
GetDataExtractor()314 DataExtractor &ValueObject::GetDataExtractor() {
315 UpdateValueIfNeeded(false);
316 return m_data;
317 }
318
GetError()319 const Status &ValueObject::GetError() {
320 UpdateValueIfNeeded(false);
321 return m_error;
322 }
323
GetName() const324 ConstString ValueObject::GetName() const { return m_name; }
325
GetLocationAsCString()326 const char *ValueObject::GetLocationAsCString() {
327 return GetLocationAsCStringImpl(m_value, m_data);
328 }
329
GetLocationAsCStringImpl(const Value & value,const DataExtractor & data)330 const char *ValueObject::GetLocationAsCStringImpl(const Value &value,
331 const DataExtractor &data) {
332 if (UpdateValueIfNeeded(false)) {
333 if (m_location_str.empty()) {
334 StreamString sstr;
335
336 Value::ValueType value_type = value.GetValueType();
337
338 switch (value_type) {
339 case Value::eValueTypeScalar:
340 if (value.GetContextType() == Value::eContextTypeRegisterInfo) {
341 RegisterInfo *reg_info = value.GetRegisterInfo();
342 if (reg_info) {
343 if (reg_info->name)
344 m_location_str = reg_info->name;
345 else if (reg_info->alt_name)
346 m_location_str = reg_info->alt_name;
347 if (m_location_str.empty())
348 m_location_str = (reg_info->encoding == lldb::eEncodingVector)
349 ? "vector"
350 : "scalar";
351 }
352 }
353 if (m_location_str.empty())
354 m_location_str = "scalar";
355 break;
356
357 case Value::eValueTypeLoadAddress:
358 case Value::eValueTypeFileAddress:
359 case Value::eValueTypeHostAddress: {
360 uint32_t addr_nibble_size = data.GetAddressByteSize() * 2;
361 sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size,
362 value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
363 m_location_str = std::string(sstr.GetString());
364 } break;
365 }
366 }
367 }
368 return m_location_str.c_str();
369 }
370
GetValue()371 Value &ValueObject::GetValue() { return m_value; }
372
GetValue() const373 const Value &ValueObject::GetValue() const { return m_value; }
374
ResolveValue(Scalar & scalar)375 bool ValueObject::ResolveValue(Scalar &scalar) {
376 if (UpdateValueIfNeeded(
377 false)) // make sure that you are up to date before returning anything
378 {
379 ExecutionContext exe_ctx(GetExecutionContextRef());
380 Value tmp_value(m_value);
381 scalar = tmp_value.ResolveValue(&exe_ctx);
382 if (scalar.IsValid()) {
383 const uint32_t bitfield_bit_size = GetBitfieldBitSize();
384 if (bitfield_bit_size)
385 return scalar.ExtractBitfield(bitfield_bit_size,
386 GetBitfieldBitOffset());
387 return true;
388 }
389 }
390 return false;
391 }
392
IsLogicalTrue(Status & error)393 bool ValueObject::IsLogicalTrue(Status &error) {
394 if (Language *language = Language::FindPlugin(GetObjectRuntimeLanguage())) {
395 LazyBool is_logical_true = language->IsLogicalTrue(*this, error);
396 switch (is_logical_true) {
397 case eLazyBoolYes:
398 case eLazyBoolNo:
399 return (is_logical_true == true);
400 case eLazyBoolCalculate:
401 break;
402 }
403 }
404
405 Scalar scalar_value;
406
407 if (!ResolveValue(scalar_value)) {
408 error.SetErrorString("failed to get a scalar result");
409 return false;
410 }
411
412 bool ret;
413 ret = scalar_value.ULongLong(1) != 0;
414 error.Clear();
415 return ret;
416 }
417
GetValueIsValid() const418 bool ValueObject::GetValueIsValid() const { return m_value_is_valid; }
419
SetValueIsValid(bool b)420 void ValueObject::SetValueIsValid(bool b) { m_value_is_valid = b; }
421
GetValueDidChange()422 bool ValueObject::GetValueDidChange() { return m_value_did_change; }
423
SetValueDidChange(bool value_changed)424 void ValueObject::SetValueDidChange(bool value_changed) {
425 m_value_did_change = value_changed;
426 }
427
GetChildAtIndex(size_t idx,bool can_create)428 ValueObjectSP ValueObject::GetChildAtIndex(size_t idx, bool can_create) {
429 ValueObjectSP child_sp;
430 // We may need to update our value if we are dynamic
431 if (IsPossibleDynamicType())
432 UpdateValueIfNeeded(false);
433 if (idx < GetNumChildren()) {
434 // Check if we have already made the child value object?
435 if (can_create && !m_children.HasChildAtIndex(idx)) {
436 // No we haven't created the child at this index, so lets have our
437 // subclass do it and cache the result for quick future access.
438 m_children.SetChildAtIndex(idx, CreateChildAtIndex(idx, false, 0));
439 }
440
441 ValueObject *child = m_children.GetChildAtIndex(idx);
442 if (child != nullptr)
443 return child->GetSP();
444 }
445 return child_sp;
446 }
447
448 lldb::ValueObjectSP
GetChildAtIndexPath(llvm::ArrayRef<size_t> idxs,size_t * index_of_error)449 ValueObject::GetChildAtIndexPath(llvm::ArrayRef<size_t> idxs,
450 size_t *index_of_error) {
451 if (idxs.size() == 0)
452 return GetSP();
453 ValueObjectSP root(GetSP());
454 for (size_t idx : idxs) {
455 root = root->GetChildAtIndex(idx, true);
456 if (!root) {
457 if (index_of_error)
458 *index_of_error = idx;
459 return root;
460 }
461 }
462 return root;
463 }
464
GetChildAtIndexPath(llvm::ArrayRef<std::pair<size_t,bool>> idxs,size_t * index_of_error)465 lldb::ValueObjectSP ValueObject::GetChildAtIndexPath(
466 llvm::ArrayRef<std::pair<size_t, bool>> idxs, size_t *index_of_error) {
467 if (idxs.size() == 0)
468 return GetSP();
469 ValueObjectSP root(GetSP());
470 for (std::pair<size_t, bool> idx : idxs) {
471 root = root->GetChildAtIndex(idx.first, idx.second);
472 if (!root) {
473 if (index_of_error)
474 *index_of_error = idx.first;
475 return root;
476 }
477 }
478 return root;
479 }
480
481 lldb::ValueObjectSP
GetChildAtNamePath(llvm::ArrayRef<ConstString> names,ConstString * name_of_error)482 ValueObject::GetChildAtNamePath(llvm::ArrayRef<ConstString> names,
483 ConstString *name_of_error) {
484 if (names.size() == 0)
485 return GetSP();
486 ValueObjectSP root(GetSP());
487 for (ConstString name : names) {
488 root = root->GetChildMemberWithName(name, true);
489 if (!root) {
490 if (name_of_error)
491 *name_of_error = name;
492 return root;
493 }
494 }
495 return root;
496 }
497
GetChildAtNamePath(llvm::ArrayRef<std::pair<ConstString,bool>> names,ConstString * name_of_error)498 lldb::ValueObjectSP ValueObject::GetChildAtNamePath(
499 llvm::ArrayRef<std::pair<ConstString, bool>> names,
500 ConstString *name_of_error) {
501 if (names.size() == 0)
502 return GetSP();
503 ValueObjectSP root(GetSP());
504 for (std::pair<ConstString, bool> name : names) {
505 root = root->GetChildMemberWithName(name.first, name.second);
506 if (!root) {
507 if (name_of_error)
508 *name_of_error = name.first;
509 return root;
510 }
511 }
512 return root;
513 }
514
GetIndexOfChildWithName(ConstString name)515 size_t ValueObject::GetIndexOfChildWithName(ConstString name) {
516 bool omit_empty_base_classes = true;
517 return GetCompilerType().GetIndexOfChildWithName(name.GetCString(),
518 omit_empty_base_classes);
519 }
520
GetChildMemberWithName(ConstString name,bool can_create)521 ValueObjectSP ValueObject::GetChildMemberWithName(ConstString name,
522 bool can_create) {
523 // We may need to update our value if we are dynamic.
524 if (IsPossibleDynamicType())
525 UpdateValueIfNeeded(false);
526
527 // When getting a child by name, it could be buried inside some base classes
528 // (which really aren't part of the expression path), so we need a vector of
529 // indexes that can get us down to the correct child.
530 std::vector<uint32_t> child_indexes;
531 bool omit_empty_base_classes = true;
532
533 if (!GetCompilerType().IsValid())
534 return ValueObjectSP();
535
536 const size_t num_child_indexes =
537 GetCompilerType().GetIndexOfChildMemberWithName(
538 name.GetCString(), omit_empty_base_classes, child_indexes);
539 if (num_child_indexes == 0)
540 return nullptr;
541
542 ValueObjectSP child_sp = GetSP();
543 for (uint32_t idx : child_indexes)
544 if (child_sp)
545 child_sp = child_sp->GetChildAtIndex(idx, can_create);
546 return child_sp;
547 }
548
GetNumChildren(uint32_t max)549 size_t ValueObject::GetNumChildren(uint32_t max) {
550 UpdateValueIfNeeded();
551
552 if (max < UINT32_MAX) {
553 if (m_children_count_valid) {
554 size_t children_count = m_children.GetChildrenCount();
555 return children_count <= max ? children_count : max;
556 } else
557 return CalculateNumChildren(max);
558 }
559
560 if (!m_children_count_valid) {
561 SetNumChildren(CalculateNumChildren());
562 }
563 return m_children.GetChildrenCount();
564 }
565
MightHaveChildren()566 bool ValueObject::MightHaveChildren() {
567 bool has_children = false;
568 const uint32_t type_info = GetTypeInfo();
569 if (type_info) {
570 if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
571 has_children = true;
572 } else {
573 has_children = GetNumChildren() > 0;
574 }
575 return has_children;
576 }
577
578 // Should only be called by ValueObject::GetNumChildren()
SetNumChildren(size_t num_children)579 void ValueObject::SetNumChildren(size_t num_children) {
580 m_children_count_valid = true;
581 m_children.SetChildrenCount(num_children);
582 }
583
SetName(ConstString name)584 void ValueObject::SetName(ConstString name) { m_name = name; }
585
CreateChildAtIndex(size_t idx,bool synthetic_array_member,int32_t synthetic_index)586 ValueObject *ValueObject::CreateChildAtIndex(size_t idx,
587 bool synthetic_array_member,
588 int32_t synthetic_index) {
589 ValueObject *valobj = nullptr;
590
591 bool omit_empty_base_classes = true;
592 bool ignore_array_bounds = synthetic_array_member;
593 std::string child_name_str;
594 uint32_t child_byte_size = 0;
595 int32_t child_byte_offset = 0;
596 uint32_t child_bitfield_bit_size = 0;
597 uint32_t child_bitfield_bit_offset = 0;
598 bool child_is_base_class = false;
599 bool child_is_deref_of_parent = false;
600 uint64_t language_flags = 0;
601
602 const bool transparent_pointers = !synthetic_array_member;
603 CompilerType child_compiler_type;
604
605 ExecutionContext exe_ctx(GetExecutionContextRef());
606
607 child_compiler_type = GetCompilerType().GetChildCompilerTypeAtIndex(
608 &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
609 ignore_array_bounds, child_name_str, child_byte_size, child_byte_offset,
610 child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
611 child_is_deref_of_parent, this, language_flags);
612 if (child_compiler_type) {
613 if (synthetic_index)
614 child_byte_offset += child_byte_size * synthetic_index;
615
616 ConstString child_name;
617 if (!child_name_str.empty())
618 child_name.SetCString(child_name_str.c_str());
619
620 valobj = new ValueObjectChild(
621 *this, child_compiler_type, child_name, child_byte_size,
622 child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset,
623 child_is_base_class, child_is_deref_of_parent, eAddressTypeInvalid,
624 language_flags);
625 }
626
627 // In case of an incomplete type, try to use the ValueObject's
628 // synthetic value to create the child ValueObject.
629 if (!valobj && synthetic_array_member) {
630 if (ValueObjectSP synth_valobj_sp = GetSyntheticValue()) {
631 valobj = synth_valobj_sp
632 ->GetChildAtIndex(synthetic_index, synthetic_array_member)
633 .get();
634 }
635 }
636
637 return valobj;
638 }
639
GetSummaryAsCString(TypeSummaryImpl * summary_ptr,std::string & destination,lldb::LanguageType lang)640 bool ValueObject::GetSummaryAsCString(TypeSummaryImpl *summary_ptr,
641 std::string &destination,
642 lldb::LanguageType lang) {
643 return GetSummaryAsCString(summary_ptr, destination,
644 TypeSummaryOptions().SetLanguage(lang));
645 }
646
GetSummaryAsCString(TypeSummaryImpl * summary_ptr,std::string & destination,const TypeSummaryOptions & options)647 bool ValueObject::GetSummaryAsCString(TypeSummaryImpl *summary_ptr,
648 std::string &destination,
649 const TypeSummaryOptions &options) {
650 destination.clear();
651
652 // ideally we would like to bail out if passing NULL, but if we do so we end
653 // up not providing the summary for function pointers anymore
654 if (/*summary_ptr == NULL ||*/ m_is_getting_summary)
655 return false;
656
657 m_is_getting_summary = true;
658
659 TypeSummaryOptions actual_options(options);
660
661 if (actual_options.GetLanguage() == lldb::eLanguageTypeUnknown)
662 actual_options.SetLanguage(GetPreferredDisplayLanguage());
663
664 // this is a hot path in code and we prefer to avoid setting this string all
665 // too often also clearing out other information that we might care to see in
666 // a crash log. might be useful in very specific situations though.
667 /*Host::SetCrashDescriptionWithFormat("Trying to fetch a summary for %s %s.
668 Summary provider's description is %s",
669 GetTypeName().GetCString(),
670 GetName().GetCString(),
671 summary_ptr->GetDescription().c_str());*/
672
673 if (UpdateValueIfNeeded(false) && summary_ptr) {
674 if (HasSyntheticValue())
675 m_synthetic_value->UpdateValueIfNeeded(); // the summary might depend on
676 // the synthetic children being
677 // up-to-date (e.g. ${svar%#})
678 summary_ptr->FormatObject(this, destination, actual_options);
679 }
680 m_is_getting_summary = false;
681 return !destination.empty();
682 }
683
GetSummaryAsCString(lldb::LanguageType lang)684 const char *ValueObject::GetSummaryAsCString(lldb::LanguageType lang) {
685 if (UpdateValueIfNeeded(true) && m_summary_str.empty()) {
686 TypeSummaryOptions summary_options;
687 summary_options.SetLanguage(lang);
688 GetSummaryAsCString(GetSummaryFormat().get(), m_summary_str,
689 summary_options);
690 }
691 if (m_summary_str.empty())
692 return nullptr;
693 return m_summary_str.c_str();
694 }
695
GetSummaryAsCString(std::string & destination,const TypeSummaryOptions & options)696 bool ValueObject::GetSummaryAsCString(std::string &destination,
697 const TypeSummaryOptions &options) {
698 return GetSummaryAsCString(GetSummaryFormat().get(), destination, options);
699 }
700
IsCStringContainer(bool check_pointer)701 bool ValueObject::IsCStringContainer(bool check_pointer) {
702 CompilerType pointee_or_element_compiler_type;
703 const Flags type_flags(GetTypeInfo(&pointee_or_element_compiler_type));
704 bool is_char_arr_ptr(type_flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
705 pointee_or_element_compiler_type.IsCharType());
706 if (!is_char_arr_ptr)
707 return false;
708 if (!check_pointer)
709 return true;
710 if (type_flags.Test(eTypeIsArray))
711 return true;
712 addr_t cstr_address = LLDB_INVALID_ADDRESS;
713 AddressType cstr_address_type = eAddressTypeInvalid;
714 cstr_address = GetPointerValue(&cstr_address_type);
715 return (cstr_address != LLDB_INVALID_ADDRESS);
716 }
717
GetPointeeData(DataExtractor & data,uint32_t item_idx,uint32_t item_count)718 size_t ValueObject::GetPointeeData(DataExtractor &data, uint32_t item_idx,
719 uint32_t item_count) {
720 CompilerType pointee_or_element_compiler_type;
721 const uint32_t type_info = GetTypeInfo(&pointee_or_element_compiler_type);
722 const bool is_pointer_type = type_info & eTypeIsPointer;
723 const bool is_array_type = type_info & eTypeIsArray;
724 if (!(is_pointer_type || is_array_type))
725 return 0;
726
727 if (item_count == 0)
728 return 0;
729
730 ExecutionContext exe_ctx(GetExecutionContextRef());
731
732 llvm::Optional<uint64_t> item_type_size =
733 pointee_or_element_compiler_type.GetByteSize(
734 exe_ctx.GetBestExecutionContextScope());
735 if (!item_type_size)
736 return 0;
737 const uint64_t bytes = item_count * *item_type_size;
738 const uint64_t offset = item_idx * *item_type_size;
739
740 if (item_idx == 0 && item_count == 1) // simply a deref
741 {
742 if (is_pointer_type) {
743 Status error;
744 ValueObjectSP pointee_sp = Dereference(error);
745 if (error.Fail() || pointee_sp.get() == nullptr)
746 return 0;
747 return pointee_sp->GetData(data, error);
748 } else {
749 ValueObjectSP child_sp = GetChildAtIndex(0, true);
750 if (child_sp.get() == nullptr)
751 return 0;
752 Status error;
753 return child_sp->GetData(data, error);
754 }
755 return true;
756 } else /* (items > 1) */
757 {
758 Status error;
759 lldb_private::DataBufferHeap *heap_buf_ptr = nullptr;
760 lldb::DataBufferSP data_sp(heap_buf_ptr =
761 new lldb_private::DataBufferHeap());
762
763 AddressType addr_type;
764 lldb::addr_t addr = is_pointer_type ? GetPointerValue(&addr_type)
765 : GetAddressOf(true, &addr_type);
766
767 switch (addr_type) {
768 case eAddressTypeFile: {
769 ModuleSP module_sp(GetModule());
770 if (module_sp) {
771 addr = addr + offset;
772 Address so_addr;
773 module_sp->ResolveFileAddress(addr, so_addr);
774 ExecutionContext exe_ctx(GetExecutionContextRef());
775 Target *target = exe_ctx.GetTargetPtr();
776 if (target) {
777 heap_buf_ptr->SetByteSize(bytes);
778 size_t bytes_read = target->ReadMemory(
779 so_addr, false, heap_buf_ptr->GetBytes(), bytes, error);
780 if (error.Success()) {
781 data.SetData(data_sp);
782 return bytes_read;
783 }
784 }
785 }
786 } break;
787 case eAddressTypeLoad: {
788 ExecutionContext exe_ctx(GetExecutionContextRef());
789 Process *process = exe_ctx.GetProcessPtr();
790 if (process) {
791 heap_buf_ptr->SetByteSize(bytes);
792 size_t bytes_read = process->ReadMemory(
793 addr + offset, heap_buf_ptr->GetBytes(), bytes, error);
794 if (error.Success() || bytes_read > 0) {
795 data.SetData(data_sp);
796 return bytes_read;
797 }
798 }
799 } break;
800 case eAddressTypeHost: {
801 auto max_bytes =
802 GetCompilerType().GetByteSize(exe_ctx.GetBestExecutionContextScope());
803 if (max_bytes && *max_bytes > offset) {
804 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
805 addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
806 if (addr == 0 || addr == LLDB_INVALID_ADDRESS)
807 break;
808 heap_buf_ptr->CopyData((uint8_t *)(addr + offset), bytes_read);
809 data.SetData(data_sp);
810 return bytes_read;
811 }
812 } break;
813 case eAddressTypeInvalid:
814 break;
815 }
816 }
817 return 0;
818 }
819
GetData(DataExtractor & data,Status & error)820 uint64_t ValueObject::GetData(DataExtractor &data, Status &error) {
821 UpdateValueIfNeeded(false);
822 ExecutionContext exe_ctx(GetExecutionContextRef());
823 error = m_value.GetValueAsData(&exe_ctx, data, GetModule().get());
824 if (error.Fail()) {
825 if (m_data.GetByteSize()) {
826 data = m_data;
827 error.Clear();
828 return data.GetByteSize();
829 } else {
830 return 0;
831 }
832 }
833 data.SetAddressByteSize(m_data.GetAddressByteSize());
834 data.SetByteOrder(m_data.GetByteOrder());
835 return data.GetByteSize();
836 }
837
SetData(DataExtractor & data,Status & error)838 bool ValueObject::SetData(DataExtractor &data, Status &error) {
839 error.Clear();
840 // Make sure our value is up to date first so that our location and location
841 // type is valid.
842 if (!UpdateValueIfNeeded(false)) {
843 error.SetErrorString("unable to read value");
844 return false;
845 }
846
847 uint64_t count = 0;
848 const Encoding encoding = GetCompilerType().GetEncoding(count);
849
850 const size_t byte_size = GetByteSize().getValueOr(0);
851
852 Value::ValueType value_type = m_value.GetValueType();
853
854 switch (value_type) {
855 case Value::eValueTypeScalar: {
856 Status set_error =
857 m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
858
859 if (!set_error.Success()) {
860 error.SetErrorStringWithFormat("unable to set scalar value: %s",
861 set_error.AsCString());
862 return false;
863 }
864 } break;
865 case Value::eValueTypeLoadAddress: {
866 // If it is a load address, then the scalar value is the storage location
867 // of the data, and we have to shove this value down to that load location.
868 ExecutionContext exe_ctx(GetExecutionContextRef());
869 Process *process = exe_ctx.GetProcessPtr();
870 if (process) {
871 addr_t target_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
872 size_t bytes_written = process->WriteMemory(
873 target_addr, data.GetDataStart(), byte_size, error);
874 if (!error.Success())
875 return false;
876 if (bytes_written != byte_size) {
877 error.SetErrorString("unable to write value to memory");
878 return false;
879 }
880 }
881 } break;
882 case Value::eValueTypeHostAddress: {
883 // If it is a host address, then we stuff the scalar as a DataBuffer into
884 // the Value's data.
885 DataBufferSP buffer_sp(new DataBufferHeap(byte_size, 0));
886 m_data.SetData(buffer_sp, 0);
887 data.CopyByteOrderedData(0, byte_size,
888 const_cast<uint8_t *>(m_data.GetDataStart()),
889 byte_size, m_data.GetByteOrder());
890 m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
891 } break;
892 case Value::eValueTypeFileAddress:
893 break;
894 }
895
896 // If we have reached this point, then we have successfully changed the
897 // value.
898 SetNeedsUpdate();
899 return true;
900 }
901
CopyStringDataToBufferSP(const StreamString & source,lldb::DataBufferSP & destination)902 static bool CopyStringDataToBufferSP(const StreamString &source,
903 lldb::DataBufferSP &destination) {
904 destination = std::make_shared<DataBufferHeap>(source.GetSize() + 1, 0);
905 memcpy(destination->GetBytes(), source.GetString().data(), source.GetSize());
906 return true;
907 }
908
909 std::pair<size_t, bool>
ReadPointedString(lldb::DataBufferSP & buffer_sp,Status & error,uint32_t max_length,bool honor_array,Format item_format)910 ValueObject::ReadPointedString(lldb::DataBufferSP &buffer_sp, Status &error,
911 uint32_t max_length, bool honor_array,
912 Format item_format) {
913 bool was_capped = false;
914 StreamString s;
915 ExecutionContext exe_ctx(GetExecutionContextRef());
916 Target *target = exe_ctx.GetTargetPtr();
917
918 if (!target) {
919 s << "<no target to read from>";
920 error.SetErrorString("no target to read from");
921 CopyStringDataToBufferSP(s, buffer_sp);
922 return {0, was_capped};
923 }
924
925 if (max_length == 0)
926 max_length = target->GetMaximumSizeOfStringSummary();
927
928 size_t bytes_read = 0;
929 size_t total_bytes_read = 0;
930
931 CompilerType compiler_type = GetCompilerType();
932 CompilerType elem_or_pointee_compiler_type;
933 const Flags type_flags(GetTypeInfo(&elem_or_pointee_compiler_type));
934 if (type_flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
935 elem_or_pointee_compiler_type.IsCharType()) {
936 addr_t cstr_address = LLDB_INVALID_ADDRESS;
937 AddressType cstr_address_type = eAddressTypeInvalid;
938
939 size_t cstr_len = 0;
940 bool capped_data = false;
941 const bool is_array = type_flags.Test(eTypeIsArray);
942 if (is_array) {
943 // We have an array
944 uint64_t array_size = 0;
945 if (compiler_type.IsArrayType(nullptr, &array_size, nullptr)) {
946 cstr_len = array_size;
947 if (cstr_len > max_length) {
948 capped_data = true;
949 cstr_len = max_length;
950 }
951 }
952 cstr_address = GetAddressOf(true, &cstr_address_type);
953 } else {
954 // We have a pointer
955 cstr_address = GetPointerValue(&cstr_address_type);
956 }
957
958 if (cstr_address == 0 || cstr_address == LLDB_INVALID_ADDRESS) {
959 if (cstr_address_type == eAddressTypeHost && is_array) {
960 const char *cstr = GetDataExtractor().PeekCStr(0);
961 if (cstr == nullptr) {
962 s << "<invalid address>";
963 error.SetErrorString("invalid address");
964 CopyStringDataToBufferSP(s, buffer_sp);
965 return {0, was_capped};
966 }
967 buffer_sp = std::make_shared<DataBufferHeap>(cstr_len, 0);
968 memcpy(buffer_sp->GetBytes(), cstr, cstr_len);
969 return {cstr_len, was_capped};
970 } else {
971 s << "<invalid address>";
972 error.SetErrorString("invalid address");
973 CopyStringDataToBufferSP(s, buffer_sp);
974 return {0, was_capped};
975 }
976 }
977
978 Address cstr_so_addr(cstr_address);
979 DataExtractor data;
980 if (cstr_len > 0 && honor_array) {
981 // I am using GetPointeeData() here to abstract the fact that some
982 // ValueObjects are actually frozen pointers in the host but the pointed-
983 // to data lives in the debuggee, and GetPointeeData() automatically
984 // takes care of this
985 GetPointeeData(data, 0, cstr_len);
986
987 if ((bytes_read = data.GetByteSize()) > 0) {
988 total_bytes_read = bytes_read;
989 for (size_t offset = 0; offset < bytes_read; offset++)
990 s.Printf("%c", *data.PeekData(offset, 1));
991 if (capped_data)
992 was_capped = true;
993 }
994 } else {
995 cstr_len = max_length;
996 const size_t k_max_buf_size = 64;
997
998 size_t offset = 0;
999
1000 int cstr_len_displayed = -1;
1001 bool capped_cstr = false;
1002 // I am using GetPointeeData() here to abstract the fact that some
1003 // ValueObjects are actually frozen pointers in the host but the pointed-
1004 // to data lives in the debuggee, and GetPointeeData() automatically
1005 // takes care of this
1006 while ((bytes_read = GetPointeeData(data, offset, k_max_buf_size)) > 0) {
1007 total_bytes_read += bytes_read;
1008 const char *cstr = data.PeekCStr(0);
1009 size_t len = strnlen(cstr, k_max_buf_size);
1010 if (cstr_len_displayed < 0)
1011 cstr_len_displayed = len;
1012
1013 if (len == 0)
1014 break;
1015 cstr_len_displayed += len;
1016 if (len > bytes_read)
1017 len = bytes_read;
1018 if (len > cstr_len)
1019 len = cstr_len;
1020
1021 for (size_t offset = 0; offset < bytes_read; offset++)
1022 s.Printf("%c", *data.PeekData(offset, 1));
1023
1024 if (len < k_max_buf_size)
1025 break;
1026
1027 if (len >= cstr_len) {
1028 capped_cstr = true;
1029 break;
1030 }
1031
1032 cstr_len -= len;
1033 offset += len;
1034 }
1035
1036 if (cstr_len_displayed >= 0) {
1037 if (capped_cstr)
1038 was_capped = true;
1039 }
1040 }
1041 } else {
1042 error.SetErrorString("not a string object");
1043 s << "<not a string object>";
1044 }
1045 CopyStringDataToBufferSP(s, buffer_sp);
1046 return {total_bytes_read, was_capped};
1047 }
1048
GetObjectDescription()1049 const char *ValueObject::GetObjectDescription() {
1050 if (!UpdateValueIfNeeded(true))
1051 return nullptr;
1052
1053 // Return cached value.
1054 if (!m_object_desc_str.empty())
1055 return m_object_desc_str.c_str();
1056
1057 ExecutionContext exe_ctx(GetExecutionContextRef());
1058 Process *process = exe_ctx.GetProcessPtr();
1059 if (!process)
1060 return nullptr;
1061
1062 // Returns the object description produced by one language runtime.
1063 auto get_object_description = [&](LanguageType language) -> const char * {
1064 if (LanguageRuntime *runtime = process->GetLanguageRuntime(language)) {
1065 StreamString s;
1066 if (runtime->GetObjectDescription(s, *this)) {
1067 m_object_desc_str.append(std::string(s.GetString()));
1068 return m_object_desc_str.c_str();
1069 }
1070 }
1071 return nullptr;
1072 };
1073
1074 // Try the native language runtime first.
1075 LanguageType native_language = GetObjectRuntimeLanguage();
1076 if (const char *desc = get_object_description(native_language))
1077 return desc;
1078
1079 // Try the Objective-C language runtime. This fallback is necessary
1080 // for Objective-C++ and mixed Objective-C / C++ programs.
1081 if (Language::LanguageIsCFamily(native_language))
1082 return get_object_description(eLanguageTypeObjC);
1083 return nullptr;
1084 }
1085
GetValueAsCString(const lldb_private::TypeFormatImpl & format,std::string & destination)1086 bool ValueObject::GetValueAsCString(const lldb_private::TypeFormatImpl &format,
1087 std::string &destination) {
1088 if (UpdateValueIfNeeded(false))
1089 return format.FormatObject(this, destination);
1090 else
1091 return false;
1092 }
1093
GetValueAsCString(lldb::Format format,std::string & destination)1094 bool ValueObject::GetValueAsCString(lldb::Format format,
1095 std::string &destination) {
1096 return GetValueAsCString(TypeFormatImpl_Format(format), destination);
1097 }
1098
GetValueAsCString()1099 const char *ValueObject::GetValueAsCString() {
1100 if (UpdateValueIfNeeded(true)) {
1101 lldb::TypeFormatImplSP format_sp;
1102 lldb::Format my_format = GetFormat();
1103 if (my_format == lldb::eFormatDefault) {
1104 if (m_type_format_sp)
1105 format_sp = m_type_format_sp;
1106 else {
1107 if (m_is_bitfield_for_scalar)
1108 my_format = eFormatUnsigned;
1109 else {
1110 if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) {
1111 const RegisterInfo *reg_info = m_value.GetRegisterInfo();
1112 if (reg_info)
1113 my_format = reg_info->format;
1114 } else {
1115 my_format = GetValue().GetCompilerType().GetFormat();
1116 }
1117 }
1118 }
1119 }
1120 if (my_format != m_last_format || m_value_str.empty()) {
1121 m_last_format = my_format;
1122 if (!format_sp)
1123 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1124 if (GetValueAsCString(*format_sp.get(), m_value_str)) {
1125 if (!m_value_did_change && m_old_value_valid) {
1126 // The value was gotten successfully, so we consider the value as
1127 // changed if the value string differs
1128 SetValueDidChange(m_old_value_str != m_value_str);
1129 }
1130 }
1131 }
1132 }
1133 if (m_value_str.empty())
1134 return nullptr;
1135 return m_value_str.c_str();
1136 }
1137
1138 // if > 8bytes, 0 is returned. this method should mostly be used to read
1139 // address values out of pointers
GetValueAsUnsigned(uint64_t fail_value,bool * success)1140 uint64_t ValueObject::GetValueAsUnsigned(uint64_t fail_value, bool *success) {
1141 // If our byte size is zero this is an aggregate type that has children
1142 if (CanProvideValue()) {
1143 Scalar scalar;
1144 if (ResolveValue(scalar)) {
1145 if (success)
1146 *success = true;
1147 scalar.MakeUnsigned();
1148 return scalar.ULongLong(fail_value);
1149 }
1150 // fallthrough, otherwise...
1151 }
1152
1153 if (success)
1154 *success = false;
1155 return fail_value;
1156 }
1157
GetValueAsSigned(int64_t fail_value,bool * success)1158 int64_t ValueObject::GetValueAsSigned(int64_t fail_value, bool *success) {
1159 // If our byte size is zero this is an aggregate type that has children
1160 if (CanProvideValue()) {
1161 Scalar scalar;
1162 if (ResolveValue(scalar)) {
1163 if (success)
1164 *success = true;
1165 scalar.MakeSigned();
1166 return scalar.SLongLong(fail_value);
1167 }
1168 // fallthrough, otherwise...
1169 }
1170
1171 if (success)
1172 *success = false;
1173 return fail_value;
1174 }
1175
1176 // if any more "special cases" are added to
1177 // ValueObject::DumpPrintableRepresentation() please keep this call up to date
1178 // by returning true for your new special cases. We will eventually move to
1179 // checking this call result before trying to display special cases
HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display,Format custom_format)1180 bool ValueObject::HasSpecialPrintableRepresentation(
1181 ValueObjectRepresentationStyle val_obj_display, Format custom_format) {
1182 Flags flags(GetTypeInfo());
1183 if (flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
1184 val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) {
1185 if (IsCStringContainer(true) &&
1186 (custom_format == eFormatCString || custom_format == eFormatCharArray ||
1187 custom_format == eFormatChar || custom_format == eFormatVectorOfChar))
1188 return true;
1189
1190 if (flags.Test(eTypeIsArray)) {
1191 if ((custom_format == eFormatBytes) ||
1192 (custom_format == eFormatBytesWithASCII))
1193 return true;
1194
1195 if ((custom_format == eFormatVectorOfChar) ||
1196 (custom_format == eFormatVectorOfFloat32) ||
1197 (custom_format == eFormatVectorOfFloat64) ||
1198 (custom_format == eFormatVectorOfSInt16) ||
1199 (custom_format == eFormatVectorOfSInt32) ||
1200 (custom_format == eFormatVectorOfSInt64) ||
1201 (custom_format == eFormatVectorOfSInt8) ||
1202 (custom_format == eFormatVectorOfUInt128) ||
1203 (custom_format == eFormatVectorOfUInt16) ||
1204 (custom_format == eFormatVectorOfUInt32) ||
1205 (custom_format == eFormatVectorOfUInt64) ||
1206 (custom_format == eFormatVectorOfUInt8))
1207 return true;
1208 }
1209 }
1210 return false;
1211 }
1212
DumpPrintableRepresentation(Stream & s,ValueObjectRepresentationStyle val_obj_display,Format custom_format,PrintableRepresentationSpecialCases special,bool do_dump_error)1213 bool ValueObject::DumpPrintableRepresentation(
1214 Stream &s, ValueObjectRepresentationStyle val_obj_display,
1215 Format custom_format, PrintableRepresentationSpecialCases special,
1216 bool do_dump_error) {
1217
1218 Flags flags(GetTypeInfo());
1219
1220 bool allow_special =
1221 (special == ValueObject::PrintableRepresentationSpecialCases::eAllow);
1222 const bool only_special = false;
1223
1224 if (allow_special) {
1225 if (flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
1226 val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) {
1227 // when being asked to get a printable display an array or pointer type
1228 // directly, try to "do the right thing"
1229
1230 if (IsCStringContainer(true) &&
1231 (custom_format == eFormatCString ||
1232 custom_format == eFormatCharArray || custom_format == eFormatChar ||
1233 custom_format ==
1234 eFormatVectorOfChar)) // print char[] & char* directly
1235 {
1236 Status error;
1237 lldb::DataBufferSP buffer_sp;
1238 std::pair<size_t, bool> read_string = ReadPointedString(
1239 buffer_sp, error, 0, (custom_format == eFormatVectorOfChar) ||
1240 (custom_format == eFormatCharArray));
1241 lldb_private::formatters::StringPrinter::
1242 ReadBufferAndDumpToStreamOptions options(*this);
1243 options.SetData(DataExtractor(
1244 buffer_sp, lldb::eByteOrderInvalid,
1245 8)); // none of this matters for a string - pass some defaults
1246 options.SetStream(&s);
1247 options.SetPrefixToken(nullptr);
1248 options.SetQuote('"');
1249 options.SetSourceSize(buffer_sp->GetByteSize());
1250 options.SetIsTruncated(read_string.second);
1251 formatters::StringPrinter::ReadBufferAndDumpToStream<
1252 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1253 options);
1254 return !error.Fail();
1255 }
1256
1257 if (custom_format == eFormatEnum)
1258 return false;
1259
1260 // this only works for arrays, because I have no way to know when the
1261 // pointed memory ends, and no special \0 end of data marker
1262 if (flags.Test(eTypeIsArray)) {
1263 if ((custom_format == eFormatBytes) ||
1264 (custom_format == eFormatBytesWithASCII)) {
1265 const size_t count = GetNumChildren();
1266
1267 s << '[';
1268 for (size_t low = 0; low < count; low++) {
1269
1270 if (low)
1271 s << ',';
1272
1273 ValueObjectSP child = GetChildAtIndex(low, true);
1274 if (!child.get()) {
1275 s << "<invalid child>";
1276 continue;
1277 }
1278 child->DumpPrintableRepresentation(
1279 s, ValueObject::eValueObjectRepresentationStyleValue,
1280 custom_format);
1281 }
1282
1283 s << ']';
1284
1285 return true;
1286 }
1287
1288 if ((custom_format == eFormatVectorOfChar) ||
1289 (custom_format == eFormatVectorOfFloat32) ||
1290 (custom_format == eFormatVectorOfFloat64) ||
1291 (custom_format == eFormatVectorOfSInt16) ||
1292 (custom_format == eFormatVectorOfSInt32) ||
1293 (custom_format == eFormatVectorOfSInt64) ||
1294 (custom_format == eFormatVectorOfSInt8) ||
1295 (custom_format == eFormatVectorOfUInt128) ||
1296 (custom_format == eFormatVectorOfUInt16) ||
1297 (custom_format == eFormatVectorOfUInt32) ||
1298 (custom_format == eFormatVectorOfUInt64) ||
1299 (custom_format == eFormatVectorOfUInt8)) // arrays of bytes, bytes
1300 // with ASCII or any vector
1301 // format should be printed
1302 // directly
1303 {
1304 const size_t count = GetNumChildren();
1305
1306 Format format = FormatManager::GetSingleItemFormat(custom_format);
1307
1308 s << '[';
1309 for (size_t low = 0; low < count; low++) {
1310
1311 if (low)
1312 s << ',';
1313
1314 ValueObjectSP child = GetChildAtIndex(low, true);
1315 if (!child.get()) {
1316 s << "<invalid child>";
1317 continue;
1318 }
1319 child->DumpPrintableRepresentation(
1320 s, ValueObject::eValueObjectRepresentationStyleValue, format);
1321 }
1322
1323 s << ']';
1324
1325 return true;
1326 }
1327 }
1328
1329 if ((custom_format == eFormatBoolean) ||
1330 (custom_format == eFormatBinary) || (custom_format == eFormatChar) ||
1331 (custom_format == eFormatCharPrintable) ||
1332 (custom_format == eFormatComplexFloat) ||
1333 (custom_format == eFormatDecimal) || (custom_format == eFormatHex) ||
1334 (custom_format == eFormatHexUppercase) ||
1335 (custom_format == eFormatFloat) || (custom_format == eFormatOctal) ||
1336 (custom_format == eFormatOSType) ||
1337 (custom_format == eFormatUnicode16) ||
1338 (custom_format == eFormatUnicode32) ||
1339 (custom_format == eFormatUnsigned) ||
1340 (custom_format == eFormatPointer) ||
1341 (custom_format == eFormatComplexInteger) ||
1342 (custom_format == eFormatComplex) ||
1343 (custom_format == eFormatDefault)) // use the [] operator
1344 return false;
1345 }
1346 }
1347
1348 if (only_special)
1349 return false;
1350
1351 bool var_success = false;
1352
1353 {
1354 llvm::StringRef str;
1355
1356 // this is a local stream that we are using to ensure that the data pointed
1357 // to by cstr survives long enough for us to copy it to its destination -
1358 // it is necessary to have this temporary storage area for cases where our
1359 // desired output is not backed by some other longer-term storage
1360 StreamString strm;
1361
1362 if (custom_format != eFormatInvalid)
1363 SetFormat(custom_format);
1364
1365 switch (val_obj_display) {
1366 case eValueObjectRepresentationStyleValue:
1367 str = GetValueAsCString();
1368 break;
1369
1370 case eValueObjectRepresentationStyleSummary:
1371 str = GetSummaryAsCString();
1372 break;
1373
1374 case eValueObjectRepresentationStyleLanguageSpecific:
1375 str = GetObjectDescription();
1376 break;
1377
1378 case eValueObjectRepresentationStyleLocation:
1379 str = GetLocationAsCString();
1380 break;
1381
1382 case eValueObjectRepresentationStyleChildrenCount:
1383 strm.Printf("%" PRIu64 "", (uint64_t)GetNumChildren());
1384 str = strm.GetString();
1385 break;
1386
1387 case eValueObjectRepresentationStyleType:
1388 str = GetTypeName().GetStringRef();
1389 break;
1390
1391 case eValueObjectRepresentationStyleName:
1392 str = GetName().GetStringRef();
1393 break;
1394
1395 case eValueObjectRepresentationStyleExpressionPath:
1396 GetExpressionPath(strm);
1397 str = strm.GetString();
1398 break;
1399 }
1400
1401 if (str.empty()) {
1402 if (val_obj_display == eValueObjectRepresentationStyleValue)
1403 str = GetSummaryAsCString();
1404 else if (val_obj_display == eValueObjectRepresentationStyleSummary) {
1405 if (!CanProvideValue()) {
1406 strm.Printf("%s @ %s", GetTypeName().AsCString(),
1407 GetLocationAsCString());
1408 str = strm.GetString();
1409 } else
1410 str = GetValueAsCString();
1411 }
1412 }
1413
1414 if (!str.empty())
1415 s << str;
1416 else {
1417 if (m_error.Fail()) {
1418 if (do_dump_error)
1419 s.Printf("<%s>", m_error.AsCString());
1420 else
1421 return false;
1422 } else if (val_obj_display == eValueObjectRepresentationStyleSummary)
1423 s.PutCString("<no summary available>");
1424 else if (val_obj_display == eValueObjectRepresentationStyleValue)
1425 s.PutCString("<no value available>");
1426 else if (val_obj_display ==
1427 eValueObjectRepresentationStyleLanguageSpecific)
1428 s.PutCString("<not a valid Objective-C object>"); // edit this if we
1429 // have other runtimes
1430 // that support a
1431 // description
1432 else
1433 s.PutCString("<no printable representation>");
1434 }
1435
1436 // we should only return false here if we could not do *anything* even if
1437 // we have an error message as output, that's a success from our callers'
1438 // perspective, so return true
1439 var_success = true;
1440
1441 if (custom_format != eFormatInvalid)
1442 SetFormat(eFormatDefault);
1443 }
1444
1445 return var_success;
1446 }
1447
GetAddressOf(bool scalar_is_load_address,AddressType * address_type)1448 addr_t ValueObject::GetAddressOf(bool scalar_is_load_address,
1449 AddressType *address_type) {
1450 // Can't take address of a bitfield
1451 if (IsBitfield())
1452 return LLDB_INVALID_ADDRESS;
1453
1454 if (!UpdateValueIfNeeded(false))
1455 return LLDB_INVALID_ADDRESS;
1456
1457 switch (m_value.GetValueType()) {
1458 case Value::eValueTypeScalar:
1459 if (scalar_is_load_address) {
1460 if (address_type)
1461 *address_type = eAddressTypeLoad;
1462 return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1463 }
1464 break;
1465
1466 case Value::eValueTypeLoadAddress:
1467 case Value::eValueTypeFileAddress: {
1468 if (address_type)
1469 *address_type = m_value.GetValueAddressType();
1470 return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1471 } break;
1472 case Value::eValueTypeHostAddress: {
1473 if (address_type)
1474 *address_type = m_value.GetValueAddressType();
1475 return LLDB_INVALID_ADDRESS;
1476 } break;
1477 }
1478 if (address_type)
1479 *address_type = eAddressTypeInvalid;
1480 return LLDB_INVALID_ADDRESS;
1481 }
1482
GetPointerValue(AddressType * address_type)1483 addr_t ValueObject::GetPointerValue(AddressType *address_type) {
1484 addr_t address = LLDB_INVALID_ADDRESS;
1485 if (address_type)
1486 *address_type = eAddressTypeInvalid;
1487
1488 if (!UpdateValueIfNeeded(false))
1489 return address;
1490
1491 switch (m_value.GetValueType()) {
1492 case Value::eValueTypeScalar:
1493 address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1494 break;
1495
1496 case Value::eValueTypeHostAddress:
1497 case Value::eValueTypeLoadAddress:
1498 case Value::eValueTypeFileAddress: {
1499 lldb::offset_t data_offset = 0;
1500 address = m_data.GetAddress(&data_offset);
1501 } break;
1502 }
1503
1504 if (address_type)
1505 *address_type = GetAddressTypeOfChildren();
1506
1507 return address;
1508 }
1509
SetValueFromCString(const char * value_str,Status & error)1510 bool ValueObject::SetValueFromCString(const char *value_str, Status &error) {
1511 error.Clear();
1512 // Make sure our value is up to date first so that our location and location
1513 // type is valid.
1514 if (!UpdateValueIfNeeded(false)) {
1515 error.SetErrorString("unable to read value");
1516 return false;
1517 }
1518
1519 uint64_t count = 0;
1520 const Encoding encoding = GetCompilerType().GetEncoding(count);
1521
1522 const size_t byte_size = GetByteSize().getValueOr(0);
1523
1524 Value::ValueType value_type = m_value.GetValueType();
1525
1526 if (value_type == Value::eValueTypeScalar) {
1527 // If the value is already a scalar, then let the scalar change itself:
1528 m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
1529 } else if (byte_size <= 16) {
1530 // If the value fits in a scalar, then make a new scalar and again let the
1531 // scalar code do the conversion, then figure out where to put the new
1532 // value.
1533 Scalar new_scalar;
1534 error = new_scalar.SetValueFromCString(value_str, encoding, byte_size);
1535 if (error.Success()) {
1536 switch (value_type) {
1537 case Value::eValueTypeLoadAddress: {
1538 // If it is a load address, then the scalar value is the storage
1539 // location of the data, and we have to shove this value down to that
1540 // load location.
1541 ExecutionContext exe_ctx(GetExecutionContextRef());
1542 Process *process = exe_ctx.GetProcessPtr();
1543 if (process) {
1544 addr_t target_addr =
1545 m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1546 size_t bytes_written = process->WriteScalarToMemory(
1547 target_addr, new_scalar, byte_size, error);
1548 if (!error.Success())
1549 return false;
1550 if (bytes_written != byte_size) {
1551 error.SetErrorString("unable to write value to memory");
1552 return false;
1553 }
1554 }
1555 } break;
1556 case Value::eValueTypeHostAddress: {
1557 // If it is a host address, then we stuff the scalar as a DataBuffer
1558 // into the Value's data.
1559 DataExtractor new_data;
1560 new_data.SetByteOrder(m_data.GetByteOrder());
1561
1562 DataBufferSP buffer_sp(new DataBufferHeap(byte_size, 0));
1563 m_data.SetData(buffer_sp, 0);
1564 bool success = new_scalar.GetData(new_data);
1565 if (success) {
1566 new_data.CopyByteOrderedData(
1567 0, byte_size, const_cast<uint8_t *>(m_data.GetDataStart()),
1568 byte_size, m_data.GetByteOrder());
1569 }
1570 m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
1571
1572 } break;
1573 case Value::eValueTypeFileAddress:
1574 case Value::eValueTypeScalar:
1575 break;
1576 }
1577 } else {
1578 return false;
1579 }
1580 } else {
1581 // We don't support setting things bigger than a scalar at present.
1582 error.SetErrorString("unable to write aggregate data type");
1583 return false;
1584 }
1585
1586 // If we have reached this point, then we have successfully changed the
1587 // value.
1588 SetNeedsUpdate();
1589 return true;
1590 }
1591
GetDeclaration(Declaration & decl)1592 bool ValueObject::GetDeclaration(Declaration &decl) {
1593 decl.Clear();
1594 return false;
1595 }
1596
GetTypeName()1597 ConstString ValueObject::GetTypeName() {
1598 return GetCompilerType().GetTypeName();
1599 }
1600
GetDisplayTypeName()1601 ConstString ValueObject::GetDisplayTypeName() { return GetTypeName(); }
1602
GetQualifiedTypeName()1603 ConstString ValueObject::GetQualifiedTypeName() {
1604 return GetCompilerType().GetTypeName();
1605 }
1606
GetObjectRuntimeLanguage()1607 LanguageType ValueObject::GetObjectRuntimeLanguage() {
1608 return GetCompilerType().GetMinimumLanguage();
1609 }
1610
AddSyntheticChild(ConstString key,ValueObject * valobj)1611 void ValueObject::AddSyntheticChild(ConstString key,
1612 ValueObject *valobj) {
1613 m_synthetic_children[key] = valobj;
1614 }
1615
GetSyntheticChild(ConstString key) const1616 ValueObjectSP ValueObject::GetSyntheticChild(ConstString key) const {
1617 ValueObjectSP synthetic_child_sp;
1618 std::map<ConstString, ValueObject *>::const_iterator pos =
1619 m_synthetic_children.find(key);
1620 if (pos != m_synthetic_children.end())
1621 synthetic_child_sp = pos->second->GetSP();
1622 return synthetic_child_sp;
1623 }
1624
1625 uint32_t
GetTypeInfo(CompilerType * pointee_or_element_compiler_type)1626 ValueObject::GetTypeInfo(CompilerType *pointee_or_element_compiler_type) {
1627 return GetCompilerType().GetTypeInfo(pointee_or_element_compiler_type);
1628 }
1629
IsPointerType()1630 bool ValueObject::IsPointerType() { return GetCompilerType().IsPointerType(); }
1631
IsArrayType()1632 bool ValueObject::IsArrayType() {
1633 return GetCompilerType().IsArrayType(nullptr, nullptr, nullptr);
1634 }
1635
IsScalarType()1636 bool ValueObject::IsScalarType() { return GetCompilerType().IsScalarType(); }
1637
IsIntegerType(bool & is_signed)1638 bool ValueObject::IsIntegerType(bool &is_signed) {
1639 return GetCompilerType().IsIntegerType(is_signed);
1640 }
1641
IsPointerOrReferenceType()1642 bool ValueObject::IsPointerOrReferenceType() {
1643 return GetCompilerType().IsPointerOrReferenceType();
1644 }
1645
IsPossibleDynamicType()1646 bool ValueObject::IsPossibleDynamicType() {
1647 ExecutionContext exe_ctx(GetExecutionContextRef());
1648 Process *process = exe_ctx.GetProcessPtr();
1649 if (process)
1650 return process->IsPossibleDynamicValue(*this);
1651 else
1652 return GetCompilerType().IsPossibleDynamicType(nullptr, true, true);
1653 }
1654
IsRuntimeSupportValue()1655 bool ValueObject::IsRuntimeSupportValue() {
1656 Process *process(GetProcessSP().get());
1657 if (!process)
1658 return false;
1659
1660 // We trust the the compiler did the right thing and marked runtime support
1661 // values as artificial.
1662 if (!GetVariable() || !GetVariable()->IsArtificial())
1663 return false;
1664
1665 if (auto *runtime = process->GetLanguageRuntime(GetVariable()->GetLanguage()))
1666 if (runtime->IsAllowedRuntimeValue(GetName()))
1667 return false;
1668
1669 return true;
1670 }
1671
IsNilReference()1672 bool ValueObject::IsNilReference() {
1673 if (Language *language = Language::FindPlugin(GetObjectRuntimeLanguage())) {
1674 return language->IsNilReference(*this);
1675 }
1676 return false;
1677 }
1678
IsUninitializedReference()1679 bool ValueObject::IsUninitializedReference() {
1680 if (Language *language = Language::FindPlugin(GetObjectRuntimeLanguage())) {
1681 return language->IsUninitializedReference(*this);
1682 }
1683 return false;
1684 }
1685
1686 // This allows you to create an array member using and index that doesn't not
1687 // fall in the normal bounds of the array. Many times structure can be defined
1688 // as: struct Collection {
1689 // uint32_t item_count;
1690 // Item item_array[0];
1691 // };
1692 // The size of the "item_array" is 1, but many times in practice there are more
1693 // items in "item_array".
1694
GetSyntheticArrayMember(size_t index,bool can_create)1695 ValueObjectSP ValueObject::GetSyntheticArrayMember(size_t index,
1696 bool can_create) {
1697 ValueObjectSP synthetic_child_sp;
1698 if (IsPointerType() || IsArrayType()) {
1699 std::string index_str = llvm::formatv("[{0}]", index);
1700 ConstString index_const_str(index_str);
1701 // Check if we have already created a synthetic array member in this valid
1702 // object. If we have we will re-use it.
1703 synthetic_child_sp = GetSyntheticChild(index_const_str);
1704 if (!synthetic_child_sp) {
1705 ValueObject *synthetic_child;
1706 // We haven't made a synthetic array member for INDEX yet, so lets make
1707 // one and cache it for any future reference.
1708 synthetic_child = CreateChildAtIndex(0, true, index);
1709
1710 // Cache the value if we got one back...
1711 if (synthetic_child) {
1712 AddSyntheticChild(index_const_str, synthetic_child);
1713 synthetic_child_sp = synthetic_child->GetSP();
1714 synthetic_child_sp->SetName(ConstString(index_str));
1715 synthetic_child_sp->m_is_array_item_for_pointer = true;
1716 }
1717 }
1718 }
1719 return synthetic_child_sp;
1720 }
1721
GetSyntheticBitFieldChild(uint32_t from,uint32_t to,bool can_create)1722 ValueObjectSP ValueObject::GetSyntheticBitFieldChild(uint32_t from, uint32_t to,
1723 bool can_create) {
1724 ValueObjectSP synthetic_child_sp;
1725 if (IsScalarType()) {
1726 std::string index_str = llvm::formatv("[{0}-{1}]", from, to);
1727 ConstString index_const_str(index_str);
1728 // Check if we have already created a synthetic array member in this valid
1729 // object. If we have we will re-use it.
1730 synthetic_child_sp = GetSyntheticChild(index_const_str);
1731 if (!synthetic_child_sp) {
1732 uint32_t bit_field_size = to - from + 1;
1733 uint32_t bit_field_offset = from;
1734 if (GetDataExtractor().GetByteOrder() == eByteOrderBig)
1735 bit_field_offset =
1736 GetByteSize().getValueOr(0) * 8 - bit_field_size - bit_field_offset;
1737 // We haven't made a synthetic array member for INDEX yet, so lets make
1738 // one and cache it for any future reference.
1739 ValueObjectChild *synthetic_child = new ValueObjectChild(
1740 *this, GetCompilerType(), index_const_str,
1741 GetByteSize().getValueOr(0), 0, bit_field_size, bit_field_offset,
1742 false, false, eAddressTypeInvalid, 0);
1743
1744 // Cache the value if we got one back...
1745 if (synthetic_child) {
1746 AddSyntheticChild(index_const_str, synthetic_child);
1747 synthetic_child_sp = synthetic_child->GetSP();
1748 synthetic_child_sp->SetName(ConstString(index_str));
1749 synthetic_child_sp->m_is_bitfield_for_scalar = true;
1750 }
1751 }
1752 }
1753 return synthetic_child_sp;
1754 }
1755
GetSyntheticChildAtOffset(uint32_t offset,const CompilerType & type,bool can_create,ConstString name_const_str)1756 ValueObjectSP ValueObject::GetSyntheticChildAtOffset(
1757 uint32_t offset, const CompilerType &type, bool can_create,
1758 ConstString name_const_str) {
1759
1760 ValueObjectSP synthetic_child_sp;
1761
1762 if (name_const_str.IsEmpty()) {
1763 name_const_str.SetString("@" + std::to_string(offset));
1764 }
1765
1766 // Check if we have already created a synthetic array member in this valid
1767 // object. If we have we will re-use it.
1768 synthetic_child_sp = GetSyntheticChild(name_const_str);
1769
1770 if (synthetic_child_sp.get())
1771 return synthetic_child_sp;
1772
1773 if (!can_create)
1774 return {};
1775
1776 ExecutionContext exe_ctx(GetExecutionContextRef());
1777 llvm::Optional<uint64_t> size =
1778 type.GetByteSize(exe_ctx.GetBestExecutionContextScope());
1779 if (!size)
1780 return {};
1781 ValueObjectChild *synthetic_child =
1782 new ValueObjectChild(*this, type, name_const_str, *size, offset, 0, 0,
1783 false, false, eAddressTypeInvalid, 0);
1784 if (synthetic_child) {
1785 AddSyntheticChild(name_const_str, synthetic_child);
1786 synthetic_child_sp = synthetic_child->GetSP();
1787 synthetic_child_sp->SetName(name_const_str);
1788 synthetic_child_sp->m_is_child_at_offset = true;
1789 }
1790 return synthetic_child_sp;
1791 }
1792
GetSyntheticBase(uint32_t offset,const CompilerType & type,bool can_create,ConstString name_const_str)1793 ValueObjectSP ValueObject::GetSyntheticBase(uint32_t offset,
1794 const CompilerType &type,
1795 bool can_create,
1796 ConstString name_const_str) {
1797 ValueObjectSP synthetic_child_sp;
1798
1799 if (name_const_str.IsEmpty()) {
1800 char name_str[128];
1801 snprintf(name_str, sizeof(name_str), "base%s@%i",
1802 type.GetTypeName().AsCString("<unknown>"), offset);
1803 name_const_str.SetCString(name_str);
1804 }
1805
1806 // Check if we have already created a synthetic array member in this valid
1807 // object. If we have we will re-use it.
1808 synthetic_child_sp = GetSyntheticChild(name_const_str);
1809
1810 if (synthetic_child_sp.get())
1811 return synthetic_child_sp;
1812
1813 if (!can_create)
1814 return {};
1815
1816 const bool is_base_class = true;
1817
1818 ExecutionContext exe_ctx(GetExecutionContextRef());
1819 llvm::Optional<uint64_t> size =
1820 type.GetByteSize(exe_ctx.GetBestExecutionContextScope());
1821 if (!size)
1822 return {};
1823 ValueObjectChild *synthetic_child =
1824 new ValueObjectChild(*this, type, name_const_str, *size, offset, 0, 0,
1825 is_base_class, false, eAddressTypeInvalid, 0);
1826 if (synthetic_child) {
1827 AddSyntheticChild(name_const_str, synthetic_child);
1828 synthetic_child_sp = synthetic_child->GetSP();
1829 synthetic_child_sp->SetName(name_const_str);
1830 }
1831 return synthetic_child_sp;
1832 }
1833
1834 // your expression path needs to have a leading . or -> (unless it somehow
1835 // "looks like" an array, in which case it has a leading [ symbol). while the [
1836 // is meaningful and should be shown to the user, . and -> are just parser
1837 // design, but by no means added information for the user.. strip them off
SkipLeadingExpressionPathSeparators(const char * expression)1838 static const char *SkipLeadingExpressionPathSeparators(const char *expression) {
1839 if (!expression || !expression[0])
1840 return expression;
1841 if (expression[0] == '.')
1842 return expression + 1;
1843 if (expression[0] == '-' && expression[1] == '>')
1844 return expression + 2;
1845 return expression;
1846 }
1847
1848 ValueObjectSP
GetSyntheticExpressionPathChild(const char * expression,bool can_create)1849 ValueObject::GetSyntheticExpressionPathChild(const char *expression,
1850 bool can_create) {
1851 ValueObjectSP synthetic_child_sp;
1852 ConstString name_const_string(expression);
1853 // Check if we have already created a synthetic array member in this valid
1854 // object. If we have we will re-use it.
1855 synthetic_child_sp = GetSyntheticChild(name_const_string);
1856 if (!synthetic_child_sp) {
1857 // We haven't made a synthetic array member for expression yet, so lets
1858 // make one and cache it for any future reference.
1859 synthetic_child_sp = GetValueForExpressionPath(
1860 expression, nullptr, nullptr,
1861 GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal(
1862 GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
1863 None));
1864
1865 // Cache the value if we got one back...
1866 if (synthetic_child_sp.get()) {
1867 // FIXME: this causes a "real" child to end up with its name changed to
1868 // the contents of expression
1869 AddSyntheticChild(name_const_string, synthetic_child_sp.get());
1870 synthetic_child_sp->SetName(
1871 ConstString(SkipLeadingExpressionPathSeparators(expression)));
1872 }
1873 }
1874 return synthetic_child_sp;
1875 }
1876
CalculateSyntheticValue()1877 void ValueObject::CalculateSyntheticValue() {
1878 TargetSP target_sp(GetTargetSP());
1879 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
1880 m_synthetic_value = nullptr;
1881 return;
1882 }
1883
1884 lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp);
1885
1886 if (!UpdateFormatsIfNeeded() && m_synthetic_value)
1887 return;
1888
1889 if (m_synthetic_children_sp.get() == nullptr)
1890 return;
1891
1892 if (current_synth_sp == m_synthetic_children_sp && m_synthetic_value)
1893 return;
1894
1895 m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp);
1896 }
1897
CalculateDynamicValue(DynamicValueType use_dynamic)1898 void ValueObject::CalculateDynamicValue(DynamicValueType use_dynamic) {
1899 if (use_dynamic == eNoDynamicValues)
1900 return;
1901
1902 if (!m_dynamic_value && !IsDynamic()) {
1903 ExecutionContext exe_ctx(GetExecutionContextRef());
1904 Process *process = exe_ctx.GetProcessPtr();
1905 if (process && process->IsPossibleDynamicValue(*this)) {
1906 ClearDynamicTypeInformation();
1907 m_dynamic_value = new ValueObjectDynamicValue(*this, use_dynamic);
1908 }
1909 }
1910 }
1911
GetDynamicValue(DynamicValueType use_dynamic)1912 ValueObjectSP ValueObject::GetDynamicValue(DynamicValueType use_dynamic) {
1913 if (use_dynamic == eNoDynamicValues)
1914 return ValueObjectSP();
1915
1916 if (!IsDynamic() && m_dynamic_value == nullptr) {
1917 CalculateDynamicValue(use_dynamic);
1918 }
1919 if (m_dynamic_value)
1920 return m_dynamic_value->GetSP();
1921 else
1922 return ValueObjectSP();
1923 }
1924
GetStaticValue()1925 ValueObjectSP ValueObject::GetStaticValue() { return GetSP(); }
1926
GetNonSyntheticValue()1927 lldb::ValueObjectSP ValueObject::GetNonSyntheticValue() { return GetSP(); }
1928
GetSyntheticValue()1929 ValueObjectSP ValueObject::GetSyntheticValue() {
1930 CalculateSyntheticValue();
1931
1932 if (m_synthetic_value)
1933 return m_synthetic_value->GetSP();
1934 else
1935 return ValueObjectSP();
1936 }
1937
HasSyntheticValue()1938 bool ValueObject::HasSyntheticValue() {
1939 UpdateFormatsIfNeeded();
1940
1941 if (m_synthetic_children_sp.get() == nullptr)
1942 return false;
1943
1944 CalculateSyntheticValue();
1945
1946 return m_synthetic_value != nullptr;
1947 }
1948
GetNonBaseClassParent()1949 ValueObject *ValueObject::GetNonBaseClassParent() {
1950 if (GetParent()) {
1951 if (GetParent()->IsBaseClass())
1952 return GetParent()->GetNonBaseClassParent();
1953 else
1954 return GetParent();
1955 }
1956 return nullptr;
1957 }
1958
IsBaseClass(uint32_t & depth)1959 bool ValueObject::IsBaseClass(uint32_t &depth) {
1960 if (!IsBaseClass()) {
1961 depth = 0;
1962 return false;
1963 }
1964 if (GetParent()) {
1965 GetParent()->IsBaseClass(depth);
1966 depth = depth + 1;
1967 return true;
1968 }
1969 // TODO: a base of no parent? weird..
1970 depth = 1;
1971 return true;
1972 }
1973
GetExpressionPath(Stream & s,GetExpressionPathFormat epformat)1974 void ValueObject::GetExpressionPath(Stream &s,
1975 GetExpressionPathFormat epformat) {
1976 // synthetic children do not actually "exist" as part of the hierarchy, and
1977 // sometimes they are consed up in ways that don't make sense from an
1978 // underlying language/API standpoint. So, use a special code path here to
1979 // return something that can hopefully be used in expression
1980 if (m_is_synthetic_children_generated) {
1981 UpdateValueIfNeeded();
1982
1983 if (m_value.GetValueType() == Value::eValueTypeLoadAddress) {
1984 if (IsPointerOrReferenceType()) {
1985 s.Printf("((%s)0x%" PRIx64 ")", GetTypeName().AsCString("void"),
1986 GetValueAsUnsigned(0));
1987 return;
1988 } else {
1989 uint64_t load_addr =
1990 m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1991 if (load_addr != LLDB_INVALID_ADDRESS) {
1992 s.Printf("(*( (%s *)0x%" PRIx64 "))", GetTypeName().AsCString("void"),
1993 load_addr);
1994 return;
1995 }
1996 }
1997 }
1998
1999 if (CanProvideValue()) {
2000 s.Printf("((%s)%s)", GetTypeName().AsCString("void"),
2001 GetValueAsCString());
2002 return;
2003 }
2004
2005 return;
2006 }
2007
2008 const bool is_deref_of_parent = IsDereferenceOfParent();
2009
2010 if (is_deref_of_parent &&
2011 epformat == eGetExpressionPathFormatDereferencePointers) {
2012 // this is the original format of GetExpressionPath() producing code like
2013 // *(a_ptr).memberName, which is entirely fine, until you put this into
2014 // StackFrame::GetValueForVariableExpressionPath() which prefers to see
2015 // a_ptr->memberName. the eHonorPointers mode is meant to produce strings
2016 // in this latter format
2017 s.PutCString("*(");
2018 }
2019
2020 ValueObject *parent = GetParent();
2021
2022 if (parent)
2023 parent->GetExpressionPath(s, epformat);
2024
2025 // if we are a deref_of_parent just because we are synthetic array members
2026 // made up to allow ptr[%d] syntax to work in variable printing, then add our
2027 // name ([%d]) to the expression path
2028 if (m_is_array_item_for_pointer &&
2029 epformat == eGetExpressionPathFormatHonorPointers)
2030 s.PutCString(m_name.GetStringRef());
2031
2032 if (!IsBaseClass()) {
2033 if (!is_deref_of_parent) {
2034 ValueObject *non_base_class_parent = GetNonBaseClassParent();
2035 if (non_base_class_parent &&
2036 !non_base_class_parent->GetName().IsEmpty()) {
2037 CompilerType non_base_class_parent_compiler_type =
2038 non_base_class_parent->GetCompilerType();
2039 if (non_base_class_parent_compiler_type) {
2040 if (parent && parent->IsDereferenceOfParent() &&
2041 epformat == eGetExpressionPathFormatHonorPointers) {
2042 s.PutCString("->");
2043 } else {
2044 const uint32_t non_base_class_parent_type_info =
2045 non_base_class_parent_compiler_type.GetTypeInfo();
2046
2047 if (non_base_class_parent_type_info & eTypeIsPointer) {
2048 s.PutCString("->");
2049 } else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2050 !(non_base_class_parent_type_info & eTypeIsArray)) {
2051 s.PutChar('.');
2052 }
2053 }
2054 }
2055 }
2056
2057 const char *name = GetName().GetCString();
2058 if (name)
2059 s.PutCString(name);
2060 }
2061 }
2062
2063 if (is_deref_of_parent &&
2064 epformat == eGetExpressionPathFormatDereferencePointers) {
2065 s.PutChar(')');
2066 }
2067 }
2068
GetValueForExpressionPath(llvm::StringRef expression,ExpressionPathScanEndReason * reason_to_stop,ExpressionPathEndResultType * final_value_type,const GetValueForExpressionPathOptions & options,ExpressionPathAftermath * final_task_on_target)2069 ValueObjectSP ValueObject::GetValueForExpressionPath(
2070 llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop,
2071 ExpressionPathEndResultType *final_value_type,
2072 const GetValueForExpressionPathOptions &options,
2073 ExpressionPathAftermath *final_task_on_target) {
2074
2075 ExpressionPathScanEndReason dummy_reason_to_stop =
2076 ValueObject::eExpressionPathScanEndReasonUnknown;
2077 ExpressionPathEndResultType dummy_final_value_type =
2078 ValueObject::eExpressionPathEndResultTypeInvalid;
2079 ExpressionPathAftermath dummy_final_task_on_target =
2080 ValueObject::eExpressionPathAftermathNothing;
2081
2082 ValueObjectSP ret_val = GetValueForExpressionPath_Impl(
2083 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2084 final_value_type ? final_value_type : &dummy_final_value_type, options,
2085 final_task_on_target ? final_task_on_target
2086 : &dummy_final_task_on_target);
2087
2088 if (!final_task_on_target ||
2089 *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2090 return ret_val;
2091
2092 if (ret_val.get() &&
2093 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2094 eExpressionPathEndResultTypePlain)) // I can only deref and takeaddress
2095 // of plain objects
2096 {
2097 if ((final_task_on_target ? *final_task_on_target
2098 : dummy_final_task_on_target) ==
2099 ValueObject::eExpressionPathAftermathDereference) {
2100 Status error;
2101 ValueObjectSP final_value = ret_val->Dereference(error);
2102 if (error.Fail() || !final_value.get()) {
2103 if (reason_to_stop)
2104 *reason_to_stop =
2105 ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2106 if (final_value_type)
2107 *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2108 return ValueObjectSP();
2109 } else {
2110 if (final_task_on_target)
2111 *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2112 return final_value;
2113 }
2114 }
2115 if (*final_task_on_target ==
2116 ValueObject::eExpressionPathAftermathTakeAddress) {
2117 Status error;
2118 ValueObjectSP final_value = ret_val->AddressOf(error);
2119 if (error.Fail() || !final_value.get()) {
2120 if (reason_to_stop)
2121 *reason_to_stop =
2122 ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2123 if (final_value_type)
2124 *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2125 return ValueObjectSP();
2126 } else {
2127 if (final_task_on_target)
2128 *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2129 return final_value;
2130 }
2131 }
2132 }
2133 return ret_val; // final_task_on_target will still have its original value, so
2134 // you know I did not do it
2135 }
2136
GetValueForExpressionPath_Impl(llvm::StringRef expression,ExpressionPathScanEndReason * reason_to_stop,ExpressionPathEndResultType * final_result,const GetValueForExpressionPathOptions & options,ExpressionPathAftermath * what_next)2137 ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
2138 llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop,
2139 ExpressionPathEndResultType *final_result,
2140 const GetValueForExpressionPathOptions &options,
2141 ExpressionPathAftermath *what_next) {
2142 ValueObjectSP root = GetSP();
2143
2144 if (!root)
2145 return nullptr;
2146
2147 llvm::StringRef remainder = expression;
2148
2149 while (true) {
2150 llvm::StringRef temp_expression = remainder;
2151
2152 CompilerType root_compiler_type = root->GetCompilerType();
2153 CompilerType pointee_compiler_type;
2154 Flags pointee_compiler_type_info;
2155
2156 Flags root_compiler_type_info(
2157 root_compiler_type.GetTypeInfo(&pointee_compiler_type));
2158 if (pointee_compiler_type)
2159 pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo());
2160
2161 if (temp_expression.empty()) {
2162 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2163 return root;
2164 }
2165
2166 switch (temp_expression.front()) {
2167 case '-': {
2168 temp_expression = temp_expression.drop_front();
2169 if (options.m_check_dot_vs_arrow_syntax &&
2170 root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to
2171 // use -> on a
2172 // non-pointer and I
2173 // must catch the error
2174 {
2175 *reason_to_stop =
2176 ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot;
2177 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2178 return ValueObjectSP();
2179 }
2180 if (root_compiler_type_info.Test(eTypeIsObjC) && // if yo are trying to
2181 // extract an ObjC IVar
2182 // when this is forbidden
2183 root_compiler_type_info.Test(eTypeIsPointer) &&
2184 options.m_no_fragile_ivar) {
2185 *reason_to_stop =
2186 ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed;
2187 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2188 return ValueObjectSP();
2189 }
2190 if (!temp_expression.startswith(">")) {
2191 *reason_to_stop =
2192 ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2193 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2194 return ValueObjectSP();
2195 }
2196 }
2197 LLVM_FALLTHROUGH;
2198 case '.': // or fallthrough from ->
2199 {
2200 if (options.m_check_dot_vs_arrow_syntax &&
2201 temp_expression.front() == '.' &&
2202 root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to
2203 // use . on a pointer
2204 // and I must catch the
2205 // error
2206 {
2207 *reason_to_stop =
2208 ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow;
2209 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2210 return nullptr;
2211 }
2212 temp_expression = temp_expression.drop_front(); // skip . or >
2213
2214 size_t next_sep_pos = temp_expression.find_first_of("-.[", 1);
2215 ConstString child_name;
2216 if (next_sep_pos == llvm::StringRef::npos) // if no other separator just
2217 // expand this last layer
2218 {
2219 child_name.SetString(temp_expression);
2220 ValueObjectSP child_valobj_sp =
2221 root->GetChildMemberWithName(child_name, true);
2222
2223 if (child_valobj_sp.get()) // we know we are done, so just return
2224 {
2225 *reason_to_stop =
2226 ValueObject::eExpressionPathScanEndReasonEndOfString;
2227 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2228 return child_valobj_sp;
2229 } else {
2230 switch (options.m_synthetic_children_traversal) {
2231 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2232 None:
2233 break;
2234 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2235 FromSynthetic:
2236 if (root->IsSynthetic()) {
2237 child_valobj_sp = root->GetNonSyntheticValue();
2238 if (child_valobj_sp.get())
2239 child_valobj_sp =
2240 child_valobj_sp->GetChildMemberWithName(child_name, true);
2241 }
2242 break;
2243 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2244 ToSynthetic:
2245 if (!root->IsSynthetic()) {
2246 child_valobj_sp = root->GetSyntheticValue();
2247 if (child_valobj_sp.get())
2248 child_valobj_sp =
2249 child_valobj_sp->GetChildMemberWithName(child_name, true);
2250 }
2251 break;
2252 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2253 Both:
2254 if (root->IsSynthetic()) {
2255 child_valobj_sp = root->GetNonSyntheticValue();
2256 if (child_valobj_sp.get())
2257 child_valobj_sp =
2258 child_valobj_sp->GetChildMemberWithName(child_name, true);
2259 } else {
2260 child_valobj_sp = root->GetSyntheticValue();
2261 if (child_valobj_sp.get())
2262 child_valobj_sp =
2263 child_valobj_sp->GetChildMemberWithName(child_name, true);
2264 }
2265 break;
2266 }
2267 }
2268
2269 // if we are here and options.m_no_synthetic_children is true,
2270 // child_valobj_sp is going to be a NULL SP, so we hit the "else"
2271 // branch, and return an error
2272 if (child_valobj_sp.get()) // if it worked, just return
2273 {
2274 *reason_to_stop =
2275 ValueObject::eExpressionPathScanEndReasonEndOfString;
2276 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2277 return child_valobj_sp;
2278 } else {
2279 *reason_to_stop =
2280 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2281 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2282 return nullptr;
2283 }
2284 } else // other layers do expand
2285 {
2286 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2287
2288 child_name.SetString(temp_expression.slice(0, next_sep_pos));
2289
2290 ValueObjectSP child_valobj_sp =
2291 root->GetChildMemberWithName(child_name, true);
2292 if (child_valobj_sp.get()) // store the new root and move on
2293 {
2294 root = child_valobj_sp;
2295 remainder = next_separator;
2296 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2297 continue;
2298 } else {
2299 switch (options.m_synthetic_children_traversal) {
2300 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2301 None:
2302 break;
2303 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2304 FromSynthetic:
2305 if (root->IsSynthetic()) {
2306 child_valobj_sp = root->GetNonSyntheticValue();
2307 if (child_valobj_sp.get())
2308 child_valobj_sp =
2309 child_valobj_sp->GetChildMemberWithName(child_name, true);
2310 }
2311 break;
2312 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2313 ToSynthetic:
2314 if (!root->IsSynthetic()) {
2315 child_valobj_sp = root->GetSyntheticValue();
2316 if (child_valobj_sp.get())
2317 child_valobj_sp =
2318 child_valobj_sp->GetChildMemberWithName(child_name, true);
2319 }
2320 break;
2321 case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2322 Both:
2323 if (root->IsSynthetic()) {
2324 child_valobj_sp = root->GetNonSyntheticValue();
2325 if (child_valobj_sp.get())
2326 child_valobj_sp =
2327 child_valobj_sp->GetChildMemberWithName(child_name, true);
2328 } else {
2329 child_valobj_sp = root->GetSyntheticValue();
2330 if (child_valobj_sp.get())
2331 child_valobj_sp =
2332 child_valobj_sp->GetChildMemberWithName(child_name, true);
2333 }
2334 break;
2335 }
2336 }
2337
2338 // if we are here and options.m_no_synthetic_children is true,
2339 // child_valobj_sp is going to be a NULL SP, so we hit the "else"
2340 // branch, and return an error
2341 if (child_valobj_sp.get()) // if it worked, move on
2342 {
2343 root = child_valobj_sp;
2344 remainder = next_separator;
2345 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2346 continue;
2347 } else {
2348 *reason_to_stop =
2349 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2350 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2351 return nullptr;
2352 }
2353 }
2354 break;
2355 }
2356 case '[': {
2357 if (!root_compiler_type_info.Test(eTypeIsArray) &&
2358 !root_compiler_type_info.Test(eTypeIsPointer) &&
2359 !root_compiler_type_info.Test(
2360 eTypeIsVector)) // if this is not a T[] nor a T*
2361 {
2362 if (!root_compiler_type_info.Test(
2363 eTypeIsScalar)) // if this is not even a scalar...
2364 {
2365 if (options.m_synthetic_children_traversal ==
2366 GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2367 None) // ...only chance left is synthetic
2368 {
2369 *reason_to_stop =
2370 ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
2371 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2372 return ValueObjectSP();
2373 }
2374 } else if (!options.m_allow_bitfields_syntax) // if this is a scalar,
2375 // check that we can
2376 // expand bitfields
2377 {
2378 *reason_to_stop =
2379 ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
2380 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2381 return ValueObjectSP();
2382 }
2383 }
2384 if (temp_expression[1] ==
2385 ']') // if this is an unbounded range it only works for arrays
2386 {
2387 if (!root_compiler_type_info.Test(eTypeIsArray)) {
2388 *reason_to_stop =
2389 ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2390 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2391 return nullptr;
2392 } else // even if something follows, we cannot expand unbounded ranges,
2393 // just let the caller do it
2394 {
2395 *reason_to_stop =
2396 ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2397 *final_result =
2398 ValueObject::eExpressionPathEndResultTypeUnboundedRange;
2399 return root;
2400 }
2401 }
2402
2403 size_t close_bracket_position = temp_expression.find(']', 1);
2404 if (close_bracket_position ==
2405 llvm::StringRef::npos) // if there is no ], this is a syntax error
2406 {
2407 *reason_to_stop =
2408 ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2409 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2410 return nullptr;
2411 }
2412
2413 llvm::StringRef bracket_expr =
2414 temp_expression.slice(1, close_bracket_position);
2415
2416 // If this was an empty expression it would have been caught by the if
2417 // above.
2418 assert(!bracket_expr.empty());
2419
2420 if (!bracket_expr.contains('-')) {
2421 // if no separator, this is of the form [N]. Note that this cannot be
2422 // an unbounded range of the form [], because that case was handled
2423 // above with an unconditional return.
2424 unsigned long index = 0;
2425 if (bracket_expr.getAsInteger(0, index)) {
2426 *reason_to_stop =
2427 ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2428 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2429 return nullptr;
2430 }
2431
2432 // from here on we do have a valid index
2433 if (root_compiler_type_info.Test(eTypeIsArray)) {
2434 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
2435 if (!child_valobj_sp)
2436 child_valobj_sp = root->GetSyntheticArrayMember(index, true);
2437 if (!child_valobj_sp)
2438 if (root->HasSyntheticValue() &&
2439 root->GetSyntheticValue()->GetNumChildren() > index)
2440 child_valobj_sp =
2441 root->GetSyntheticValue()->GetChildAtIndex(index, true);
2442 if (child_valobj_sp) {
2443 root = child_valobj_sp;
2444 remainder =
2445 temp_expression.substr(close_bracket_position + 1); // skip ]
2446 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2447 continue;
2448 } else {
2449 *reason_to_stop =
2450 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2451 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2452 return nullptr;
2453 }
2454 } else if (root_compiler_type_info.Test(eTypeIsPointer)) {
2455 if (*what_next ==
2456 ValueObject::
2457 eExpressionPathAftermathDereference && // if this is a
2458 // ptr-to-scalar, I
2459 // am accessing it
2460 // by index and I
2461 // would have
2462 // deref'ed anyway,
2463 // then do it now
2464 // and use this as
2465 // a bitfield
2466 pointee_compiler_type_info.Test(eTypeIsScalar)) {
2467 Status error;
2468 root = root->Dereference(error);
2469 if (error.Fail() || !root) {
2470 *reason_to_stop =
2471 ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2472 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2473 return nullptr;
2474 } else {
2475 *what_next = eExpressionPathAftermathNothing;
2476 continue;
2477 }
2478 } else {
2479 if (root->GetCompilerType().GetMinimumLanguage() ==
2480 eLanguageTypeObjC &&
2481 pointee_compiler_type_info.AllClear(eTypeIsPointer) &&
2482 root->HasSyntheticValue() &&
2483 (options.m_synthetic_children_traversal ==
2484 GetValueForExpressionPathOptions::
2485 SyntheticChildrenTraversal::ToSynthetic ||
2486 options.m_synthetic_children_traversal ==
2487 GetValueForExpressionPathOptions::
2488 SyntheticChildrenTraversal::Both)) {
2489 root = root->GetSyntheticValue()->GetChildAtIndex(index, true);
2490 } else
2491 root = root->GetSyntheticArrayMember(index, true);
2492 if (!root) {
2493 *reason_to_stop =
2494 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2495 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2496 return nullptr;
2497 } else {
2498 remainder =
2499 temp_expression.substr(close_bracket_position + 1); // skip ]
2500 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2501 continue;
2502 }
2503 }
2504 } else if (root_compiler_type_info.Test(eTypeIsScalar)) {
2505 root = root->GetSyntheticBitFieldChild(index, index, true);
2506 if (!root) {
2507 *reason_to_stop =
2508 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2509 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2510 return nullptr;
2511 } else // we do not know how to expand members of bitfields, so we
2512 // just return and let the caller do any further processing
2513 {
2514 *reason_to_stop = ValueObject::
2515 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2516 *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
2517 return root;
2518 }
2519 } else if (root_compiler_type_info.Test(eTypeIsVector)) {
2520 root = root->GetChildAtIndex(index, true);
2521 if (!root) {
2522 *reason_to_stop =
2523 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2524 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2525 return ValueObjectSP();
2526 } else {
2527 remainder =
2528 temp_expression.substr(close_bracket_position + 1); // skip ]
2529 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2530 continue;
2531 }
2532 } else if (options.m_synthetic_children_traversal ==
2533 GetValueForExpressionPathOptions::
2534 SyntheticChildrenTraversal::ToSynthetic ||
2535 options.m_synthetic_children_traversal ==
2536 GetValueForExpressionPathOptions::
2537 SyntheticChildrenTraversal::Both) {
2538 if (root->HasSyntheticValue())
2539 root = root->GetSyntheticValue();
2540 else if (!root->IsSynthetic()) {
2541 *reason_to_stop =
2542 ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
2543 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2544 return nullptr;
2545 }
2546 // if we are here, then root itself is a synthetic VO.. should be
2547 // good to go
2548
2549 if (!root) {
2550 *reason_to_stop =
2551 ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
2552 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2553 return nullptr;
2554 }
2555 root = root->GetChildAtIndex(index, true);
2556 if (!root) {
2557 *reason_to_stop =
2558 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2559 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2560 return nullptr;
2561 } else {
2562 remainder =
2563 temp_expression.substr(close_bracket_position + 1); // skip ]
2564 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2565 continue;
2566 }
2567 } else {
2568 *reason_to_stop =
2569 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2570 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2571 return nullptr;
2572 }
2573 } else {
2574 // we have a low and a high index
2575 llvm::StringRef sleft, sright;
2576 unsigned long low_index, high_index;
2577 std::tie(sleft, sright) = bracket_expr.split('-');
2578 if (sleft.getAsInteger(0, low_index) ||
2579 sright.getAsInteger(0, high_index)) {
2580 *reason_to_stop =
2581 ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2582 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2583 return nullptr;
2584 }
2585
2586 if (low_index > high_index) // swap indices if required
2587 std::swap(low_index, high_index);
2588
2589 if (root_compiler_type_info.Test(
2590 eTypeIsScalar)) // expansion only works for scalars
2591 {
2592 root = root->GetSyntheticBitFieldChild(low_index, high_index, true);
2593 if (!root) {
2594 *reason_to_stop =
2595 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2596 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2597 return nullptr;
2598 } else {
2599 *reason_to_stop = ValueObject::
2600 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2601 *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
2602 return root;
2603 }
2604 } else if (root_compiler_type_info.Test(
2605 eTypeIsPointer) && // if this is a ptr-to-scalar, I am
2606 // accessing it by index and I would
2607 // have deref'ed anyway, then do it
2608 // now and use this as a bitfield
2609 *what_next ==
2610 ValueObject::eExpressionPathAftermathDereference &&
2611 pointee_compiler_type_info.Test(eTypeIsScalar)) {
2612 Status error;
2613 root = root->Dereference(error);
2614 if (error.Fail() || !root) {
2615 *reason_to_stop =
2616 ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2617 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2618 return nullptr;
2619 } else {
2620 *what_next = ValueObject::eExpressionPathAftermathNothing;
2621 continue;
2622 }
2623 } else {
2624 *reason_to_stop =
2625 ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2626 *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange;
2627 return root;
2628 }
2629 }
2630 break;
2631 }
2632 default: // some non-separator is in the way
2633 {
2634 *reason_to_stop =
2635 ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2636 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2637 return nullptr;
2638 }
2639 }
2640 }
2641 }
2642
LogValueObject(Log * log)2643 void ValueObject::LogValueObject(Log *log) {
2644 if (log)
2645 return LogValueObject(log, DumpValueObjectOptions(*this));
2646 }
2647
LogValueObject(Log * log,const DumpValueObjectOptions & options)2648 void ValueObject::LogValueObject(Log *log,
2649 const DumpValueObjectOptions &options) {
2650 if (log) {
2651 StreamString s;
2652 Dump(s, options);
2653 if (s.GetSize())
2654 log->PutCString(s.GetData());
2655 }
2656 }
2657
Dump(Stream & s)2658 void ValueObject::Dump(Stream &s) { Dump(s, DumpValueObjectOptions(*this)); }
2659
Dump(Stream & s,const DumpValueObjectOptions & options)2660 void ValueObject::Dump(Stream &s, const DumpValueObjectOptions &options) {
2661 ValueObjectPrinter printer(this, &s, options);
2662 printer.PrintValueObject();
2663 }
2664
CreateConstantValue(ConstString name)2665 ValueObjectSP ValueObject::CreateConstantValue(ConstString name) {
2666 ValueObjectSP valobj_sp;
2667
2668 if (UpdateValueIfNeeded(false) && m_error.Success()) {
2669 ExecutionContext exe_ctx(GetExecutionContextRef());
2670
2671 DataExtractor data;
2672 data.SetByteOrder(m_data.GetByteOrder());
2673 data.SetAddressByteSize(m_data.GetAddressByteSize());
2674
2675 if (IsBitfield()) {
2676 Value v(Scalar(GetValueAsUnsigned(UINT64_MAX)));
2677 m_error = v.GetValueAsData(&exe_ctx, data, GetModule().get());
2678 } else
2679 m_error = m_value.GetValueAsData(&exe_ctx, data, GetModule().get());
2680
2681 valobj_sp = ValueObjectConstResult::Create(
2682 exe_ctx.GetBestExecutionContextScope(), GetCompilerType(), name, data,
2683 GetAddressOf());
2684 }
2685
2686 if (!valobj_sp) {
2687 ExecutionContext exe_ctx(GetExecutionContextRef());
2688 valobj_sp = ValueObjectConstResult::Create(
2689 exe_ctx.GetBestExecutionContextScope(), m_error);
2690 }
2691 return valobj_sp;
2692 }
2693
GetQualifiedRepresentationIfAvailable(lldb::DynamicValueType dynValue,bool synthValue)2694 ValueObjectSP ValueObject::GetQualifiedRepresentationIfAvailable(
2695 lldb::DynamicValueType dynValue, bool synthValue) {
2696 ValueObjectSP result_sp(GetSP());
2697
2698 switch (dynValue) {
2699 case lldb::eDynamicCanRunTarget:
2700 case lldb::eDynamicDontRunTarget: {
2701 if (!result_sp->IsDynamic()) {
2702 if (result_sp->GetDynamicValue(dynValue))
2703 result_sp = result_sp->GetDynamicValue(dynValue);
2704 }
2705 } break;
2706 case lldb::eNoDynamicValues: {
2707 if (result_sp->IsDynamic()) {
2708 if (result_sp->GetStaticValue())
2709 result_sp = result_sp->GetStaticValue();
2710 }
2711 } break;
2712 }
2713
2714 if (synthValue) {
2715 if (!result_sp->IsSynthetic()) {
2716 if (result_sp->GetSyntheticValue())
2717 result_sp = result_sp->GetSyntheticValue();
2718 }
2719 } else {
2720 if (result_sp->IsSynthetic()) {
2721 if (result_sp->GetNonSyntheticValue())
2722 result_sp = result_sp->GetNonSyntheticValue();
2723 }
2724 }
2725
2726 return result_sp;
2727 }
2728
Dereference(Status & error)2729 ValueObjectSP ValueObject::Dereference(Status &error) {
2730 if (m_deref_valobj)
2731 return m_deref_valobj->GetSP();
2732
2733 const bool is_pointer_or_reference_type = IsPointerOrReferenceType();
2734 if (is_pointer_or_reference_type) {
2735 bool omit_empty_base_classes = true;
2736 bool ignore_array_bounds = false;
2737
2738 std::string child_name_str;
2739 uint32_t child_byte_size = 0;
2740 int32_t child_byte_offset = 0;
2741 uint32_t child_bitfield_bit_size = 0;
2742 uint32_t child_bitfield_bit_offset = 0;
2743 bool child_is_base_class = false;
2744 bool child_is_deref_of_parent = false;
2745 const bool transparent_pointers = false;
2746 CompilerType compiler_type = GetCompilerType();
2747 CompilerType child_compiler_type;
2748 uint64_t language_flags = 0;
2749
2750 ExecutionContext exe_ctx(GetExecutionContextRef());
2751
2752 child_compiler_type = compiler_type.GetChildCompilerTypeAtIndex(
2753 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
2754 ignore_array_bounds, child_name_str, child_byte_size, child_byte_offset,
2755 child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
2756 child_is_deref_of_parent, this, language_flags);
2757 if (child_compiler_type && child_byte_size) {
2758 ConstString child_name;
2759 if (!child_name_str.empty())
2760 child_name.SetCString(child_name_str.c_str());
2761
2762 m_deref_valobj = new ValueObjectChild(
2763 *this, child_compiler_type, child_name, child_byte_size,
2764 child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset,
2765 child_is_base_class, child_is_deref_of_parent, eAddressTypeInvalid,
2766 language_flags);
2767 }
2768
2769 // In case of incomplete child compiler type, use the pointee type and try
2770 // to recreate a new ValueObjectChild using it.
2771 if (!m_deref_valobj) {
2772 if (HasSyntheticValue()) {
2773 child_compiler_type = compiler_type.GetPointeeType();
2774
2775 if (child_compiler_type) {
2776 ConstString child_name;
2777 if (!child_name_str.empty())
2778 child_name.SetCString(child_name_str.c_str());
2779
2780 m_deref_valobj = new ValueObjectChild(
2781 *this, child_compiler_type, child_name, child_byte_size,
2782 child_byte_offset, child_bitfield_bit_size,
2783 child_bitfield_bit_offset, child_is_base_class,
2784 child_is_deref_of_parent, eAddressTypeInvalid, language_flags);
2785 }
2786 }
2787 }
2788
2789 } else if (HasSyntheticValue()) {
2790 m_deref_valobj =
2791 GetSyntheticValue()
2792 ->GetChildMemberWithName(ConstString("$$dereference$$"), true)
2793 .get();
2794 } else if (IsSynthetic()) {
2795 m_deref_valobj =
2796 GetChildMemberWithName(ConstString("$$dereference$$"), true).get();
2797 }
2798
2799 if (m_deref_valobj) {
2800 error.Clear();
2801 return m_deref_valobj->GetSP();
2802 } else {
2803 StreamString strm;
2804 GetExpressionPath(strm);
2805
2806 if (is_pointer_or_reference_type)
2807 error.SetErrorStringWithFormat("dereference failed: (%s) %s",
2808 GetTypeName().AsCString("<invalid type>"),
2809 strm.GetData());
2810 else
2811 error.SetErrorStringWithFormat("not a pointer or reference type: (%s) %s",
2812 GetTypeName().AsCString("<invalid type>"),
2813 strm.GetData());
2814 return ValueObjectSP();
2815 }
2816 }
2817
AddressOf(Status & error)2818 ValueObjectSP ValueObject::AddressOf(Status &error) {
2819 if (m_addr_of_valobj_sp)
2820 return m_addr_of_valobj_sp;
2821
2822 AddressType address_type = eAddressTypeInvalid;
2823 const bool scalar_is_load_address = false;
2824 addr_t addr = GetAddressOf(scalar_is_load_address, &address_type);
2825 error.Clear();
2826 if (addr != LLDB_INVALID_ADDRESS && address_type != eAddressTypeHost) {
2827 switch (address_type) {
2828 case eAddressTypeInvalid: {
2829 StreamString expr_path_strm;
2830 GetExpressionPath(expr_path_strm);
2831 error.SetErrorStringWithFormat("'%s' is not in memory",
2832 expr_path_strm.GetData());
2833 } break;
2834
2835 case eAddressTypeFile:
2836 case eAddressTypeLoad: {
2837 CompilerType compiler_type = GetCompilerType();
2838 if (compiler_type) {
2839 std::string name(1, '&');
2840 name.append(m_name.AsCString(""));
2841 ExecutionContext exe_ctx(GetExecutionContextRef());
2842 m_addr_of_valobj_sp = ValueObjectConstResult::Create(
2843 exe_ctx.GetBestExecutionContextScope(),
2844 compiler_type.GetPointerType(), ConstString(name.c_str()), addr,
2845 eAddressTypeInvalid, m_data.GetAddressByteSize());
2846 }
2847 } break;
2848 default:
2849 break;
2850 }
2851 } else {
2852 StreamString expr_path_strm;
2853 GetExpressionPath(expr_path_strm);
2854 error.SetErrorStringWithFormat("'%s' doesn't have a valid address",
2855 expr_path_strm.GetData());
2856 }
2857
2858 return m_addr_of_valobj_sp;
2859 }
2860
Cast(const CompilerType & compiler_type)2861 ValueObjectSP ValueObject::Cast(const CompilerType &compiler_type) {
2862 return ValueObjectCast::Create(*this, GetName(), compiler_type);
2863 }
2864
Clone(ConstString new_name)2865 lldb::ValueObjectSP ValueObject::Clone(ConstString new_name) {
2866 return ValueObjectCast::Create(*this, new_name, GetCompilerType());
2867 }
2868
CastPointerType(const char * name,CompilerType & compiler_type)2869 ValueObjectSP ValueObject::CastPointerType(const char *name,
2870 CompilerType &compiler_type) {
2871 ValueObjectSP valobj_sp;
2872 AddressType address_type;
2873 addr_t ptr_value = GetPointerValue(&address_type);
2874
2875 if (ptr_value != LLDB_INVALID_ADDRESS) {
2876 Address ptr_addr(ptr_value);
2877 ExecutionContext exe_ctx(GetExecutionContextRef());
2878 valobj_sp = ValueObjectMemory::Create(
2879 exe_ctx.GetBestExecutionContextScope(), name, ptr_addr, compiler_type);
2880 }
2881 return valobj_sp;
2882 }
2883
CastPointerType(const char * name,TypeSP & type_sp)2884 ValueObjectSP ValueObject::CastPointerType(const char *name, TypeSP &type_sp) {
2885 ValueObjectSP valobj_sp;
2886 AddressType address_type;
2887 addr_t ptr_value = GetPointerValue(&address_type);
2888
2889 if (ptr_value != LLDB_INVALID_ADDRESS) {
2890 Address ptr_addr(ptr_value);
2891 ExecutionContext exe_ctx(GetExecutionContextRef());
2892 valobj_sp = ValueObjectMemory::Create(
2893 exe_ctx.GetBestExecutionContextScope(), name, ptr_addr, type_sp);
2894 }
2895 return valobj_sp;
2896 }
2897
EvaluationPoint()2898 ValueObject::EvaluationPoint::EvaluationPoint()
2899 : m_mod_id(), m_exe_ctx_ref(), m_needs_update(true) {}
2900
EvaluationPoint(ExecutionContextScope * exe_scope,bool use_selected)2901 ValueObject::EvaluationPoint::EvaluationPoint(ExecutionContextScope *exe_scope,
2902 bool use_selected)
2903 : m_mod_id(), m_exe_ctx_ref(), m_needs_update(true) {
2904 ExecutionContext exe_ctx(exe_scope);
2905 TargetSP target_sp(exe_ctx.GetTargetSP());
2906 if (target_sp) {
2907 m_exe_ctx_ref.SetTargetSP(target_sp);
2908 ProcessSP process_sp(exe_ctx.GetProcessSP());
2909 if (!process_sp)
2910 process_sp = target_sp->GetProcessSP();
2911
2912 if (process_sp) {
2913 m_mod_id = process_sp->GetModID();
2914 m_exe_ctx_ref.SetProcessSP(process_sp);
2915
2916 ThreadSP thread_sp(exe_ctx.GetThreadSP());
2917
2918 if (!thread_sp) {
2919 if (use_selected)
2920 thread_sp = process_sp->GetThreadList().GetSelectedThread();
2921 }
2922
2923 if (thread_sp) {
2924 m_exe_ctx_ref.SetThreadSP(thread_sp);
2925
2926 StackFrameSP frame_sp(exe_ctx.GetFrameSP());
2927 if (!frame_sp) {
2928 if (use_selected)
2929 frame_sp = thread_sp->GetSelectedFrame();
2930 }
2931 if (frame_sp)
2932 m_exe_ctx_ref.SetFrameSP(frame_sp);
2933 }
2934 }
2935 }
2936 }
2937
EvaluationPoint(const ValueObject::EvaluationPoint & rhs)2938 ValueObject::EvaluationPoint::EvaluationPoint(
2939 const ValueObject::EvaluationPoint &rhs)
2940 : m_mod_id(), m_exe_ctx_ref(rhs.m_exe_ctx_ref), m_needs_update(true) {}
2941
~EvaluationPoint()2942 ValueObject::EvaluationPoint::~EvaluationPoint() {}
2943
2944 // This function checks the EvaluationPoint against the current process state.
2945 // If the current state matches the evaluation point, or the evaluation point
2946 // is already invalid, then we return false, meaning "no change". If the
2947 // current state is different, we update our state, and return true meaning
2948 // "yes, change". If we did see a change, we also set m_needs_update to true,
2949 // so future calls to NeedsUpdate will return true. exe_scope will be set to
2950 // the current execution context scope.
2951
SyncWithProcessState(bool accept_invalid_exe_ctx)2952 bool ValueObject::EvaluationPoint::SyncWithProcessState(
2953 bool accept_invalid_exe_ctx) {
2954 // Start with the target, if it is NULL, then we're obviously not going to
2955 // get any further:
2956 const bool thread_and_frame_only_if_stopped = true;
2957 ExecutionContext exe_ctx(
2958 m_exe_ctx_ref.Lock(thread_and_frame_only_if_stopped));
2959
2960 if (exe_ctx.GetTargetPtr() == nullptr)
2961 return false;
2962
2963 // If we don't have a process nothing can change.
2964 Process *process = exe_ctx.GetProcessPtr();
2965 if (process == nullptr)
2966 return false;
2967
2968 // If our stop id is the current stop ID, nothing has changed:
2969 ProcessModID current_mod_id = process->GetModID();
2970
2971 // If the current stop id is 0, either we haven't run yet, or the process
2972 // state has been cleared. In either case, we aren't going to be able to sync
2973 // with the process state.
2974 if (current_mod_id.GetStopID() == 0)
2975 return false;
2976
2977 bool changed = false;
2978 const bool was_valid = m_mod_id.IsValid();
2979 if (was_valid) {
2980 if (m_mod_id == current_mod_id) {
2981 // Everything is already up to date in this object, no need to update the
2982 // execution context scope.
2983 changed = false;
2984 } else {
2985 m_mod_id = current_mod_id;
2986 m_needs_update = true;
2987 changed = true;
2988 }
2989 }
2990
2991 // Now re-look up the thread and frame in case the underlying objects have
2992 // gone away & been recreated. That way we'll be sure to return a valid
2993 // exe_scope. If we used to have a thread or a frame but can't find it
2994 // anymore, then mark ourselves as invalid.
2995
2996 if (!accept_invalid_exe_ctx) {
2997 if (m_exe_ctx_ref.HasThreadRef()) {
2998 ThreadSP thread_sp(m_exe_ctx_ref.GetThreadSP());
2999 if (thread_sp) {
3000 if (m_exe_ctx_ref.HasFrameRef()) {
3001 StackFrameSP frame_sp(m_exe_ctx_ref.GetFrameSP());
3002 if (!frame_sp) {
3003 // We used to have a frame, but now it is gone
3004 SetInvalid();
3005 changed = was_valid;
3006 }
3007 }
3008 } else {
3009 // We used to have a thread, but now it is gone
3010 SetInvalid();
3011 changed = was_valid;
3012 }
3013 }
3014 }
3015
3016 return changed;
3017 }
3018
SetUpdated()3019 void ValueObject::EvaluationPoint::SetUpdated() {
3020 ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
3021 if (process_sp)
3022 m_mod_id = process_sp->GetModID();
3023 m_needs_update = false;
3024 }
3025
ClearUserVisibleData(uint32_t clear_mask)3026 void ValueObject::ClearUserVisibleData(uint32_t clear_mask) {
3027 if ((clear_mask & eClearUserVisibleDataItemsValue) ==
3028 eClearUserVisibleDataItemsValue)
3029 m_value_str.clear();
3030
3031 if ((clear_mask & eClearUserVisibleDataItemsLocation) ==
3032 eClearUserVisibleDataItemsLocation)
3033 m_location_str.clear();
3034
3035 if ((clear_mask & eClearUserVisibleDataItemsSummary) ==
3036 eClearUserVisibleDataItemsSummary)
3037 m_summary_str.clear();
3038
3039 if ((clear_mask & eClearUserVisibleDataItemsDescription) ==
3040 eClearUserVisibleDataItemsDescription)
3041 m_object_desc_str.clear();
3042
3043 if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) ==
3044 eClearUserVisibleDataItemsSyntheticChildren) {
3045 if (m_synthetic_value)
3046 m_synthetic_value = nullptr;
3047 }
3048 }
3049
GetSymbolContextScope()3050 SymbolContextScope *ValueObject::GetSymbolContextScope() {
3051 if (m_parent) {
3052 if (!m_parent->IsPointerOrReferenceType())
3053 return m_parent->GetSymbolContextScope();
3054 }
3055 return nullptr;
3056 }
3057
3058 lldb::ValueObjectSP
CreateValueObjectFromExpression(llvm::StringRef name,llvm::StringRef expression,const ExecutionContext & exe_ctx)3059 ValueObject::CreateValueObjectFromExpression(llvm::StringRef name,
3060 llvm::StringRef expression,
3061 const ExecutionContext &exe_ctx) {
3062 return CreateValueObjectFromExpression(name, expression, exe_ctx,
3063 EvaluateExpressionOptions());
3064 }
3065
CreateValueObjectFromExpression(llvm::StringRef name,llvm::StringRef expression,const ExecutionContext & exe_ctx,const EvaluateExpressionOptions & options)3066 lldb::ValueObjectSP ValueObject::CreateValueObjectFromExpression(
3067 llvm::StringRef name, llvm::StringRef expression,
3068 const ExecutionContext &exe_ctx, const EvaluateExpressionOptions &options) {
3069 lldb::ValueObjectSP retval_sp;
3070 lldb::TargetSP target_sp(exe_ctx.GetTargetSP());
3071 if (!target_sp)
3072 return retval_sp;
3073 if (expression.empty())
3074 return retval_sp;
3075 target_sp->EvaluateExpression(expression, exe_ctx.GetFrameSP().get(),
3076 retval_sp, options);
3077 if (retval_sp && !name.empty())
3078 retval_sp->SetName(ConstString(name));
3079 return retval_sp;
3080 }
3081
CreateValueObjectFromAddress(llvm::StringRef name,uint64_t address,const ExecutionContext & exe_ctx,CompilerType type)3082 lldb::ValueObjectSP ValueObject::CreateValueObjectFromAddress(
3083 llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx,
3084 CompilerType type) {
3085 if (type) {
3086 CompilerType pointer_type(type.GetPointerType());
3087 if (pointer_type) {
3088 lldb::DataBufferSP buffer(
3089 new lldb_private::DataBufferHeap(&address, sizeof(lldb::addr_t)));
3090 lldb::ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create(
3091 exe_ctx.GetBestExecutionContextScope(), pointer_type,
3092 ConstString(name), buffer, exe_ctx.GetByteOrder(),
3093 exe_ctx.GetAddressByteSize()));
3094 if (ptr_result_valobj_sp) {
3095 ptr_result_valobj_sp->GetValue().SetValueType(
3096 Value::eValueTypeLoadAddress);
3097 Status err;
3098 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3099 if (ptr_result_valobj_sp && !name.empty())
3100 ptr_result_valobj_sp->SetName(ConstString(name));
3101 }
3102 return ptr_result_valobj_sp;
3103 }
3104 }
3105 return lldb::ValueObjectSP();
3106 }
3107
CreateValueObjectFromData(llvm::StringRef name,const DataExtractor & data,const ExecutionContext & exe_ctx,CompilerType type)3108 lldb::ValueObjectSP ValueObject::CreateValueObjectFromData(
3109 llvm::StringRef name, const DataExtractor &data,
3110 const ExecutionContext &exe_ctx, CompilerType type) {
3111 lldb::ValueObjectSP new_value_sp;
3112 new_value_sp = ValueObjectConstResult::Create(
3113 exe_ctx.GetBestExecutionContextScope(), type, ConstString(name), data,
3114 LLDB_INVALID_ADDRESS);
3115 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
3116 if (new_value_sp && !name.empty())
3117 new_value_sp->SetName(ConstString(name));
3118 return new_value_sp;
3119 }
3120
GetModule()3121 ModuleSP ValueObject::GetModule() {
3122 ValueObject *root(GetRoot());
3123 if (root != this)
3124 return root->GetModule();
3125 return lldb::ModuleSP();
3126 }
3127
GetRoot()3128 ValueObject *ValueObject::GetRoot() {
3129 if (m_root)
3130 return m_root;
3131 return (m_root = FollowParentChain([](ValueObject *vo) -> bool {
3132 return (vo->m_parent != nullptr);
3133 }));
3134 }
3135
3136 ValueObject *
FollowParentChain(std::function<bool (ValueObject *)> f)3137 ValueObject::FollowParentChain(std::function<bool(ValueObject *)> f) {
3138 ValueObject *vo = this;
3139 while (vo) {
3140 if (!f(vo))
3141 break;
3142 vo = vo->m_parent;
3143 }
3144 return vo;
3145 }
3146
GetAddressTypeOfChildren()3147 AddressType ValueObject::GetAddressTypeOfChildren() {
3148 if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid) {
3149 ValueObject *root(GetRoot());
3150 if (root != this)
3151 return root->GetAddressTypeOfChildren();
3152 }
3153 return m_address_type_of_ptr_or_ref_children;
3154 }
3155
GetDynamicValueType()3156 lldb::DynamicValueType ValueObject::GetDynamicValueType() {
3157 ValueObject *with_dv_info = this;
3158 while (with_dv_info) {
3159 if (with_dv_info->HasDynamicValueTypeInfo())
3160 return with_dv_info->GetDynamicValueTypeImpl();
3161 with_dv_info = with_dv_info->m_parent;
3162 }
3163 return lldb::eNoDynamicValues;
3164 }
3165
GetFormat() const3166 lldb::Format ValueObject::GetFormat() const {
3167 const ValueObject *with_fmt_info = this;
3168 while (with_fmt_info) {
3169 if (with_fmt_info->m_format != lldb::eFormatDefault)
3170 return with_fmt_info->m_format;
3171 with_fmt_info = with_fmt_info->m_parent;
3172 }
3173 return m_format;
3174 }
3175
GetPreferredDisplayLanguage()3176 lldb::LanguageType ValueObject::GetPreferredDisplayLanguage() {
3177 lldb::LanguageType type = m_preferred_display_language;
3178 if (m_preferred_display_language == lldb::eLanguageTypeUnknown) {
3179 if (GetRoot()) {
3180 if (GetRoot() == this) {
3181 if (StackFrameSP frame_sp = GetFrameSP()) {
3182 const SymbolContext &sc(
3183 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3184 if (CompileUnit *cu = sc.comp_unit)
3185 type = cu->GetLanguage();
3186 }
3187 } else {
3188 type = GetRoot()->GetPreferredDisplayLanguage();
3189 }
3190 }
3191 }
3192 return (m_preferred_display_language = type); // only compute it once
3193 }
3194
SetPreferredDisplayLanguage(lldb::LanguageType lt)3195 void ValueObject::SetPreferredDisplayLanguage(lldb::LanguageType lt) {
3196 m_preferred_display_language = lt;
3197 }
3198
SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType lt)3199 void ValueObject::SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType lt) {
3200 if (m_preferred_display_language == lldb::eLanguageTypeUnknown)
3201 SetPreferredDisplayLanguage(lt);
3202 }
3203
CanProvideValue()3204 bool ValueObject::CanProvideValue() {
3205 // we need to support invalid types as providers of values because some bare-
3206 // board debugging scenarios have no notion of types, but still manage to
3207 // have raw numeric values for things like registers. sigh.
3208 const CompilerType &type(GetCompilerType());
3209 return (!type.IsValid()) || (0 != (type.GetTypeInfo() & eTypeHasValue));
3210 }
3211
IsChecksumEmpty()3212 bool ValueObject::IsChecksumEmpty() { return m_value_checksum.empty(); }
3213
Persist()3214 ValueObjectSP ValueObject::Persist() {
3215 if (!UpdateValueIfNeeded())
3216 return nullptr;
3217
3218 TargetSP target_sp(GetTargetSP());
3219 if (!target_sp)
3220 return nullptr;
3221
3222 PersistentExpressionState *persistent_state =
3223 target_sp->GetPersistentExpressionStateForLanguage(
3224 GetPreferredDisplayLanguage());
3225
3226 if (!persistent_state)
3227 return nullptr;
3228
3229 ConstString name = persistent_state->GetNextPersistentVariableName();
3230
3231 ValueObjectSP const_result_sp =
3232 ValueObjectConstResult::Create(target_sp.get(), GetValue(), name);
3233
3234 ExpressionVariableSP persistent_var_sp =
3235 persistent_state->CreatePersistentVariable(const_result_sp);
3236 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3237 persistent_var_sp->m_flags |= ExpressionVariable::EVIsProgramReference;
3238
3239 return persistent_var_sp->GetValueObject();
3240 }
3241
IsSyntheticChildrenGenerated()3242 bool ValueObject::IsSyntheticChildrenGenerated() {
3243 return m_is_synthetic_children_generated;
3244 }
3245
SetSyntheticChildrenGenerated(bool b)3246 void ValueObject::SetSyntheticChildrenGenerated(bool b) {
3247 m_is_synthetic_children_generated = b;
3248 }
3249
GetLanguageFlags()3250 uint64_t ValueObject::GetLanguageFlags() { return m_language_flags; }
3251
SetLanguageFlags(uint64_t flags)3252 void ValueObject::SetLanguageFlags(uint64_t flags) { m_language_flags = flags; }
3253
ValueObjectManager(lldb::ValueObjectSP in_valobj_sp,lldb::DynamicValueType use_dynamic,bool use_synthetic)3254 ValueObjectManager::ValueObjectManager(lldb::ValueObjectSP in_valobj_sp,
3255 lldb::DynamicValueType use_dynamic,
3256 bool use_synthetic) : m_root_valobj_sp(),
3257 m_user_valobj_sp(), m_use_dynamic(use_dynamic), m_stop_id(UINT32_MAX),
3258 m_use_synthetic(use_synthetic) {
3259 if (!in_valobj_sp)
3260 return;
3261 // If the user passes in a value object that is dynamic or synthetic, then
3262 // water it down to the static type.
3263 m_root_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(lldb::eNoDynamicValues, false);
3264 }
3265
IsValid() const3266 bool ValueObjectManager::IsValid() const {
3267 if (!m_root_valobj_sp)
3268 return false;
3269 lldb::TargetSP target_sp = GetTargetSP();
3270 if (target_sp)
3271 return target_sp->IsValid();
3272 return false;
3273 }
3274
GetSP()3275 lldb::ValueObjectSP ValueObjectManager::GetSP() {
3276 lldb::ProcessSP process_sp = GetProcessSP();
3277 if (!process_sp)
3278 return lldb::ValueObjectSP();
3279
3280 const uint32_t current_stop_id = process_sp->GetLastNaturalStopID();
3281 if (current_stop_id == m_stop_id)
3282 return m_user_valobj_sp;
3283
3284 m_stop_id = current_stop_id;
3285
3286 if (!m_root_valobj_sp) {
3287 m_user_valobj_sp.reset();
3288 return m_root_valobj_sp;
3289 }
3290
3291 m_user_valobj_sp = m_root_valobj_sp;
3292
3293 if (m_use_dynamic != lldb::eNoDynamicValues) {
3294 lldb::ValueObjectSP dynamic_sp = m_user_valobj_sp->GetDynamicValue(m_use_dynamic);
3295 if (dynamic_sp)
3296 m_user_valobj_sp = dynamic_sp;
3297 }
3298
3299 if (m_use_synthetic) {
3300 lldb::ValueObjectSP synthetic_sp = m_user_valobj_sp->GetSyntheticValue();
3301 if (synthetic_sp)
3302 m_user_valobj_sp = synthetic_sp;
3303 }
3304
3305 return m_user_valobj_sp;
3306 }
3307
SetUseDynamic(lldb::DynamicValueType use_dynamic)3308 void ValueObjectManager::SetUseDynamic(lldb::DynamicValueType use_dynamic) {
3309 if (use_dynamic != m_use_dynamic) {
3310 m_use_dynamic = use_dynamic;
3311 m_user_valobj_sp.reset();
3312 m_stop_id = UINT32_MAX;
3313 }
3314 }
3315
SetUseSynthetic(bool use_synthetic)3316 void ValueObjectManager::SetUseSynthetic(bool use_synthetic) {
3317 if (m_use_synthetic != use_synthetic) {
3318 m_use_synthetic = use_synthetic;
3319 m_user_valobj_sp.reset();
3320 m_stop_id = UINT32_MAX;
3321 }
3322 }
3323
GetTargetSP() const3324 lldb::TargetSP ValueObjectManager::GetTargetSP() const {
3325 if (!m_root_valobj_sp)
3326 return m_root_valobj_sp->GetTargetSP();
3327 return lldb::TargetSP();
3328 }
3329
GetProcessSP() const3330 lldb::ProcessSP ValueObjectManager::GetProcessSP() const {
3331 if (m_root_valobj_sp)
3332 return m_root_valobj_sp->GetProcessSP();
3333 return lldb::ProcessSP();
3334 }
3335
GetThreadSP() const3336 lldb::ThreadSP ValueObjectManager::GetThreadSP() const {
3337 if (m_root_valobj_sp)
3338 return m_root_valobj_sp->GetThreadSP();
3339 return lldb::ThreadSP();
3340 }
3341
GetFrameSP() const3342 lldb::StackFrameSP ValueObjectManager::GetFrameSP() const {
3343 if (m_root_valobj_sp)
3344 return m_root_valobj_sp->GetFrameSP();
3345 return lldb::StackFrameSP();
3346 }
3347