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