60 const char *name =
nullptr)
64 if ((
m_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(
100 return target_sp && target_sp->IsValid();
107 std::unique_lock<std::recursive_mutex> &lock,
110 error.SetErrorString(
"invalid value object");
116 Target *target = value_sp->GetTargetSP().get();
118 if (value_sp->GetError().Fail())
122 return ValueObjectSP();
124 lock = std::unique_lock<std::recursive_mutex>(target->
GetAPIMutex());
126 ProcessSP process_sp(value_sp->GetProcessSP());
127 if (process_sp && !stop_locker.
TryLock(&process_sp->GetRunLock())) {
131 error.SetErrorString(
"process must be stopped.");
132 return ValueObjectSP();
136 ValueObjectSP dynamic_sp = value_sp->GetDynamicValue(
m_use_dynamic);
138 value_sp = dynamic_sp;
142 ValueObjectSP synthetic_sp = value_sp->GetSyntheticValue();
144 value_sp = synthetic_sp;
148 error.SetErrorString(
"invalid value object");
150 value_sp->SetName(
m_name);
194 return StackFrameSP();
216 std::unique_lock<std::recursive_mutex>
m_lock;
247 return this->
operator bool();
249SBValue::operator bool()
const {
255 return m_opaque_sp.get() !=
nullptr && m_opaque_sp->IsValid() &&
256 m_opaque_sp->GetRootSP().get() !=
nullptr;
271 lldb::ValueObjectSP value_sp(
GetSP(locker));
273 sb_error.
SetError(value_sp->GetError());
275 sb_error.SetErrorStringWithFormat(
"error: %s",
285 lldb::ValueObjectSP value_sp(
GetSP(locker));
287 return value_sp->GetID();
295 lldb::ValueObjectSP value_sp(
GetSP(locker));
299 return value_sp->GetName().GetCString();
306 lldb::ValueObjectSP value_sp(
GetSP(locker));
310 return value_sp->GetQualifiedTypeName().GetCString();
317 lldb::ValueObjectSP value_sp(
GetSP(locker));
321 return value_sp->GetDisplayTypeName().GetCString();
330 lldb::ValueObjectSP value_sp(
GetSP(locker));
332 result = value_sp->GetByteSize().value_or(0);
344 lldb::ValueObjectSP value_sp(
GetSP(locker));
346 result = value_sp->IsInScope();
356 lldb::ValueObjectSP value_sp(
GetSP(locker));
367 lldb::ValueObjectSP value_sp(
GetSP(locker));
369 result = value_sp->GetValueType();
378 lldb::ValueObjectSP value_sp(
GetSP(locker));
390 lldb::ValueObjectSP value_sp(
GetSP(locker));
393 type_sp = std::make_shared<TypeImpl>(value_sp->GetTypeImpl());
394 sb_type.
SetSP(type_sp);
405 lldb::ValueObjectSP value_sp(
GetSP(locker));
407 if (value_sp->UpdateValueIfNeeded(
false))
408 result = value_sp->GetValueDidChange();
418 lldb::ValueObjectSP value_sp(
GetSP(locker));
430 lldb::ValueObjectSP value_sp(
GetSP(locker));
433 if (value_sp->GetSummaryAsCString(buffer, options.
ref()) && !buffer.empty())
434 stream.Printf(
"%s", buffer.c_str());
443 lldb::ValueObjectSP value_sp(
GetSP(locker));
461 bool success =
false;
463 lldb::ValueObjectSP value_sp(
GetSP(locker));
465 success = value_sp->SetValueFromCString(value_str,
error.ref());
467 error.SetErrorStringWithFormat(
"Could not get value: %s",
478 lldb::ValueObjectSP value_sp(
GetSP(locker));
480 if (value_sp->UpdateValueIfNeeded(
true)) {
481 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
483 format.
SetSP(format_sp);
494 lldb::ValueObjectSP value_sp(
GetSP(locker));
496 if (value_sp->UpdateValueIfNeeded(
true)) {
497 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
499 summary.
SetSP(summary_sp);
510 lldb::ValueObjectSP value_sp(
GetSP(locker));
512 if (value_sp->UpdateValueIfNeeded(
true)) {
513 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
515 if (synthetic_sp && !synthetic_sp->IsScripted()) {
516 TypeFilterImplSP filter_sp =
517 std::static_pointer_cast<TypeFilterImpl>(synthetic_sp);
518 filter.
SetSP(filter_sp);
530 lldb::ValueObjectSP value_sp(
GetSP(locker));
532 if (value_sp->UpdateValueIfNeeded(
true)) {
533 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
535 if (children_sp && children_sp->IsScripted()) {
536 ScriptedSyntheticChildrenSP synth_sp =
537 std::static_pointer_cast<ScriptedSyntheticChildren>(children_sp);
538 synthetic.
SetSP(synth_sp);
551 lldb::ValueObjectSP value_sp(
GetSP(locker));
552 lldb::ValueObjectSP new_value_sp;
554 TypeImplSP type_sp(type.
GetSP());
556 sb_value.
SetSP(value_sp->GetSyntheticChildAtOffset(
557 offset, type_sp->GetCompilerType(
false),
true),
569 lldb::ValueObjectSP value_sp(
GetSP(locker));
570 TypeImplSP type_sp(type.
GetSP());
571 if (value_sp && type_sp)
572 sb_value.
SetSP(value_sp->Cast(type_sp->GetCompilerType(
false)),
578 const char *expression) {
587 const char *expression,
593 lldb::ValueObjectSP value_sp(
GetSP(locker));
594 lldb::ValueObjectSP new_value_sp;
598 name, expression, exe_ctx, options.
ref());
602 sb_value.
SetSP(new_value_sp);
613 lldb::ValueObjectSP value_sp(
GetSP(locker));
614 lldb::ValueObjectSP new_value_sp;
615 lldb::TypeImplSP type_impl_sp(sb_type.
GetSP());
616 if (value_sp && type_impl_sp) {
617 CompilerType ast_type(type_impl_sp->GetCompilerType(
true));
622 sb_value.
SetSP(new_value_sp);
631 lldb::ValueObjectSP new_value_sp;
633 lldb::ValueObjectSP value_sp(
GetSP(locker));
634 lldb::TypeImplSP type_impl_sp(sb_type.
GetSP());
635 if (value_sp && type_impl_sp) {
638 name, **data, exe_ctx, type_impl_sp->GetCompilerType(
true));
641 sb_value.
SetSP(new_value_sp);
648 const bool can_create_synthetic =
false;
655 use_dynamic = target_sp->GetPreferDynamicValue();
662 bool can_create_synthetic) {
665 lldb::ValueObjectSP child_sp;
668 lldb::ValueObjectSP value_sp(
GetSP(locker));
670 const bool can_create =
true;
671 child_sp = value_sp->GetChildAtIndex(idx, can_create);
672 if (can_create_synthetic && !child_sp) {
673 child_sp = value_sp->GetSyntheticArrayMember(idx, can_create);
688 lldb::ValueObjectSP value_sp(
GetSP(locker));
690 idx = value_sp->GetIndexOfChildWithName(name);
704 use_dynamic_value = target_sp->GetPreferDynamicValue();
713 lldb::ValueObjectSP child_sp;
716 lldb::ValueObjectSP value_sp(
GetSP(locker));
718 child_sp = value_sp->GetChildMemberWithName(name,
true);
734 value_sb.
SetSP(proxy_sp);
747 value_sb.
SetSP(proxy_sp);
759 value_sb.
SetSP(proxy_sp);
791 return m_opaque_sp->SetUseSynthetic(use_synthetic);
798 lldb::ValueObjectSP value_sp(
GetSP(locker));
800 return value_sp->IsDynamic();
808 lldb::ValueObjectSP value_sp(
GetSP(locker));
810 return value_sp->IsSynthetic();
818 lldb::ValueObjectSP value_sp(
GetSP(locker));
820 return value_sp->IsSyntheticChildrenGenerated();
828 lldb::ValueObjectSP value_sp(
GetSP(locker));
830 return value_sp->SetSyntheticChildrenGenerated(is);
836 lldb::ValueObjectSP child_sp;
838 lldb::ValueObjectSP value_sp(
GetSP(locker));
841 child_sp = value_sp->GetValueForExpressionPath(expr_path);
855 lldb::ValueObjectSP value_sp(
GetSP(locker));
858 uint64_t ret_val = fail_value;
859 ret_val = value_sp->GetValueAsSigned(fail_value, &success);
861 error.SetErrorString(
"could not resolve value");
864 error.SetErrorStringWithFormat(
"could not get SBValue: %s",
875 lldb::ValueObjectSP value_sp(
GetSP(locker));
878 uint64_t ret_val = fail_value;
879 ret_val = value_sp->GetValueAsUnsigned(fail_value, &success);
881 error.SetErrorString(
"could not resolve value");
884 error.SetErrorStringWithFormat(
"could not get SBValue: %s",
894 lldb::ValueObjectSP value_sp(
GetSP(locker));
896 return value_sp->GetValueAsSigned(fail_value);
905 lldb::ValueObjectSP value_sp(
GetSP(locker));
907 return value_sp->GetValueAsUnsigned(fail_value);
915 bool has_children =
false;
917 lldb::ValueObjectSP value_sp(
GetSP(locker));
919 has_children = value_sp->MightHaveChildren();
927 bool is_support =
false;
929 lldb::ValueObjectSP value_sp(
GetSP(locker));
931 is_support = value_sp->IsRuntimeSupportValue();
948 lldb::ValueObjectSP value_sp(
GetSP(locker));
950 num_children = value_sp->GetNumChildren(max);
960 lldb::ValueObjectSP value_sp(
GetSP(locker));
980 lldb::ValueObjectSP value_sp(
GetSP(locker));
982 return value_sp->GetCompilerType().GetOpaqueQualType();
993 sb_target.
SetSP(target_sp);
1003 ProcessSP process_sp;
1006 sb_process.
SetSP(process_sp);
1029 StackFrameSP frame_sp;
1044 && !
m_opaque_sp->GetRootSP()->GetError().Fail()))) {
1046 return ValueObjectSP();
1055 return GetSP(locker);
1062 lldb::TargetSP target_sp(
sp->GetTargetSP());
1065 bool use_synthetic =
1066 target_sp->TargetProperties::GetEnableSyntheticValue();
1077 lldb::TargetSP target_sp(
sp->GetTargetSP());
1079 bool use_synthetic =
1080 target_sp->TargetProperties::GetEnableSyntheticValue();
1081 SetSP(
sp, use_dynamic, use_synthetic);
1085 SetSP(
sp, use_dynamic,
false);
1090 lldb::TargetSP target_sp(
sp->GetTargetSP());
1093 SetSP(
sp, use_dynamic, use_synthetic);
1116 lldb::ValueObjectSP value_sp(
GetSP(locker));
1118 value_sp->GetExpressionPath(description.
ref());
1125 bool qualify_cxx_base_classes) {
1129 lldb::ValueObjectSP value_sp(
GetSP(locker));
1131 value_sp->GetExpressionPath(description.
ref());
1141 lldb::ValueObjectSP value_sp(
GetSP(locker));
1145 lldb::TargetSP target_sp = value_sp->GetTargetSP();
1167 const char *name)
const {
1170 if (!expr || expr[0] ==
'\0') {
1176 lldb::ValueObjectSP value_sp(
GetSP(locker));
1181 lldb::TargetSP target_sp = value_sp->GetTargetSP();
1186 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1194 ValueObjectSP res_val_sp;
1195 target_sp->EvaluateExpression(expr, frame, res_val_sp, options.
ref(),
nullptr,
1212 lldb::ValueObjectSP value_sp(
GetSP(locker));
1214 value_sp->Dump(strm);
1225 lldb::ValueObjectSP value_sp(
GetSP(locker));
1227 return value_sp->GetFormat();
1235 lldb::ValueObjectSP value_sp(
GetSP(locker));
1237 value_sp->SetFormat(format);
1245 lldb::ValueObjectSP value_sp(
GetSP(locker));
1260 lldb::ValueObjectSP value_sp(
GetSP(locker));
1262 TargetSP target_sp(value_sp->GetTargetSP());
1264 const bool scalar_is_load_address =
true;
1266 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
1268 ModuleSP module_sp(value_sp->GetModule());
1273 module_sp->ResolveFileAddress(value, addr);
1290 lldb::ValueObjectSP value_sp(
GetSP(locker));
1292 TargetSP target_sp(value_sp->GetTargetSP());
1295 const bool scalar_is_load_address =
true;
1297 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
1299 ModuleSP module_sp(value_sp->GetModule());
1301 module_sp->ResolveFileAddress(value, addr);
1319 lldb::ValueObjectSP value_sp(
GetSP(locker));
1321 TargetSP target_sp(value_sp->GetTargetSP());
1324 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
1325 if (data_sp->GetByteSize() > 0)
1338 lldb::ValueObjectSP value_sp(
GetSP(locker));
1342 value_sp->GetData(*data_sp,
error);
1343 if (
error.Success())
1354 lldb::ValueObjectSP value_sp(
GetSP(locker));
1360 if (!data_extractor) {
1361 error.SetErrorString(
"No data to set");
1366 value_sp->SetData(*data_extractor, set_error);
1369 error.SetErrorStringWithFormat(
"Couldn't set data: %s",
1375 error.SetErrorStringWithFormat(
1376 "Couldn't set data: could not get SBValue: %s",
1388 lldb::ValueObjectSP value_sp(
GetSP(locker));
1400 lldb::ValueObjectSP value_sp(
GetSP(locker));
1404 if (value_sp->GetDeclaration(decl))
1418 lldb::ValueObjectSP value_sp(
GetSP(locker));
1420 if (value_sp && target_sp) {
1422 if (!read && !write)
1423 return sb_watchpoint;
1427 return sb_watchpoint;
1431 return sb_watchpoint;
1434 return sb_watchpoint;
1444 WatchpointSP watchpoint_sp =
1445 target_sp->CreateWatchpoint(addr, byte_size, &type, watch_type, rc);
1448 if (watchpoint_sp) {
1449 sb_watchpoint.
SetSP(watchpoint_sp);
1451 if (value_sp->GetDeclaration(decl)) {
1456 watchpoint_sp->SetDeclInfo(std::string(ss.
GetString()));
1460 }
else if (target_sp) {
1461 error.SetErrorStringWithFormat(
"could not get SBValue: %s",
1464 error.SetErrorString(
"could not set watchpoint, a target is required");
1467 return sb_watchpoint;
1478 return Watch(resolve_location, read, write,
error);
1488 return sb_watchpoint;
1495 lldb::ValueObjectSP value_sp(
GetSP(locker));
1498 persisted_sb.
SetSP(value_sp->Persist());
1500 return persisted_sb;
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_INSTRUMENT_VA(...)
StackFrameSP GetFrameSP()
lldb::DynamicValueType m_use_dynamic
lldb::ValueObjectSP GetRootSP()
void SetUseSynthetic(bool use_synthetic)
ValueImpl(const ValueImpl &rhs)=default
ValueImpl(lldb::ValueObjectSP in_valobj_sp, lldb::DynamicValueType use_dynamic, bool use_synthetic, const char *name=nullptr)
lldb::ValueObjectSP GetSP(Process::StopLocker &stop_locker, std::unique_lock< std::recursive_mutex > &lock, Status &error)
ValueImpl & operator=(const ValueImpl &rhs)
lldb::DynamicValueType GetUseDynamic()
void SetUseDynamic(lldb::DynamicValueType use_dynamic)
lldb::ValueObjectSP m_valobj_sp
ValueObjectSP GetLockedSP(ValueImpl &in_value)
Process::StopLocker m_stop_locker
std::unique_lock< std::recursive_mutex > m_lock
lldb_private::DataExtractor * get() const
void SetDeclaration(const lldb_private::Declaration &lldb_object_ref)
void SetError(uint32_t err, lldb::ErrorType type)
void SetFetchDynamicValue(lldb::DynamicValueType dynamic=lldb::eDynamicCanRunTarget)
lldb_private::EvaluateExpressionOptions & ref() const
void SetIgnoreBreakpoints(bool ignore=true)
void SetUnwindOnError(bool unwind=true)
lldb::DynamicValueType GetFetchDynamicValue() const
void SetFrameSP(const lldb::StackFrameSP &lldb_object_sp)
void SetSP(const lldb::ProcessSP &process_sp)
lldb_private::Stream & ref()
void SetSP(const lldb::TargetSP &target_sp)
void SetThread(const lldb::ThreadSP &lldb_object_sp)
void SetSP(const lldb::TypeFilterImplSP &typefilter_impl_sp)
lldb_private::TypeSummaryOptions & ref()
void SetSP(const lldb::TypeSummaryImplSP &typefilter_impl_sp)
void SetSP(const lldb::ScriptedSyntheticChildrenSP &typefilter_impl_sp)
void SetSP(const lldb::TypeImplSP &type_impl_sp)
bool SetData(lldb::SBData &data, lldb::SBError &error)
bool GetDescription(lldb::SBStream &description)
lldb::SBValue EvaluateExpression(const char *expr) const
lldb::SBValue GetChildAtIndex(uint32_t idx)
lldb::SBTypeFilter GetTypeFilter()
lldb::SBAddress GetAddress()
lldb::SBData GetPointeeData(uint32_t item_idx=0, uint32_t item_count=1)
Get an SBData wrapping what this SBValue points to.
const char * GetTypeName()
bool GetExpressionPath(lldb::SBStream &description)
lldb::SBValue CreateValueFromData(const char *name, lldb::SBData data, lldb::SBType type)
void SetSP(const lldb::ValueObjectSP &sp)
lldb::SBValue CreateValueFromAddress(const char *name, lldb::addr_t address, lldb::SBType type)
const char * GetDisplayTypeName()
lldb::SBValue CreateValueFromExpression(const char *name, const char *expression)
lldb::SBData GetData()
Get an SBData wrapping the contents of this SBValue.
lldb::SBValue Clone(const char *new_name)
Creates a copy of the SBValue with a new name and setting the current SBValue as its parent.
void SetSyntheticChildrenGenerated(bool)
lldb::SBProcess GetProcess()
const char * GetLocation()
lldb::SBValue & operator=(const lldb::SBValue &rhs)
int64_t GetValueAsSigned(lldb::SBError &error, int64_t fail_value=0)
lldb::SBWatchpoint WatchPointee(bool resolve_location, bool read, bool write, SBError &error)
Watch this value that this value points to in memory.
lldb::SBWatchpoint Watch(bool resolve_location, bool read, bool write, SBError &error)
Watch this value if it resides in memory.
lldb::SBTypeFormat GetTypeFormat()
bool MightHaveChildren()
Find out if a SBValue might have children.
lldb::SBTypeSummary GetTypeSummary()
lldb::SBValue GetDynamicValue(lldb::DynamicValueType use_dynamic)
bool IsSyntheticChildrenGenerated()
lldb::SBValue CreateChildAtOffset(const char *name, uint32_t offset, lldb::SBType type)
lldb::SBValue Dereference()
std::shared_ptr< ValueImpl > ValueImplSP
lldb::SBValue GetStaticValue()
lldb::SBValue Cast(lldb::SBType type)
lldb::SBValue GetNonSyntheticValue()
bool GetPreferSyntheticValue()
uint32_t GetIndexOfChildWithName(const char *name)
const char * GetObjectDescription()
const char * GetSummary()
lldb::ValueObjectSP GetSP() const
Same as the protected version of GetSP that takes a locker, except that we make the locker locally in...
lldb::SBTypeSynthetic GetTypeSynthetic()
void SetFormat(lldb::Format format)
lldb::SBValue AddressOf()
lldb::DynamicValueType GetPreferDynamicValue()
lldb::SBThread GetThread()
lldb::SBValue GetChildMemberWithName(const char *name)
lldb::SBTarget GetTarget()
uint64_t GetValueAsUnsigned(lldb::SBError &error, uint64_t fail_value=0)
uint32_t GetNumChildren()
void SetPreferDynamicValue(lldb::DynamicValueType use_dynamic)
lldb::SBValue GetValueForExpressionPath(const char *expr_path)
lldb::addr_t GetLoadAddress()
bool SetValueFromCString(const char *value_str)
void SetPreferSyntheticValue(bool use_synthetic)
lldb::SBDeclaration GetDeclaration()
bool IsRuntimeSupportValue()
void SetSP(const lldb::WatchpointSP &sp)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
Generic representation of a type in a programming language.
A uniqued constant string class.
bool IsEmpty() const
Test for empty string.
const char * GetCString() const
Get the string value as a C string.
A class that describes the declaration location of a lldb object.
bool DumpStopContext(Stream *s, bool show_fullpaths) const
FileSpec & GetFile()
Get accessor for file specification.
void SetKeepInMemory(bool keep=true)
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
StackFrame * GetFramePtr() const
Returns a pointer to the frame object.
bool TryLock(ProcessRunLock *lock)
This base class provides an interface to stack frames.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
void SetErrorString(llvm::StringRef err_str)
Set the current error string to err_str.
bool Success() const
Test for success condition.
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
std::recursive_mutex & GetAPIMutex()
static lldb::ValueObjectSP CreateValueObjectFromExpression(llvm::StringRef name, llvm::StringRef expression, const ExecutionContext &exe_ctx)
static lldb::ValueObjectSP CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data, const ExecutionContext &exe_ctx, CompilerType type)
static lldb::ValueObjectSP CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx, CompilerType type)
#define LLDB_WATCH_TYPE_WRITE
#define LLDB_WATCH_TYPE_READ
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
@ eAddressTypeFile
Address is an address as found in an object or symbol file.
@ eAddressTypeLoad
Address is an address as in the current target inferior process.
@ eAddressTypeHost
Address is an address in the process that is running this code.
Format
Display format definitions.