diff options
author | Enrico Granata <granata.enrico@gmail.com> | 2011-07-29 19:53:35 +0000 |
---|---|---|
committer | Enrico Granata <granata.enrico@gmail.com> | 2011-07-29 19:53:35 +0000 |
commit | 6f3533fb1d742620328b4fcc79410d3e09d6eb8d (patch) | |
tree | 4ed75acf7c94fefcab457f17a568827d5b0e3c22 /lldb/source/API/SBValue.cpp | |
parent | ce0ceebb1c5f896e992e1cac36fad732daf55cb0 (diff) | |
download | bcm5719-llvm-6f3533fb1d742620328b4fcc79410d3e09d6eb8d.tar.gz bcm5719-llvm-6f3533fb1d742620328b4fcc79410d3e09d6eb8d.zip |
Public API changes:
- Completely new implementation of SBType
- Various enhancements in several other classes
Python synthetic children providers for std::vector<T>, std::list<T> and std::map<K,V>:
- these return the actual elements into the container as the children of the container
- basic template name parsing that works (hopefully) on both Clang and GCC
- find them in examples/synthetic and in the test suite in functionalities/data-formatter/data-formatter-python-synth
New summary string token ${svar :
- the syntax is just the same as in ${var but this new token lets you read the values
coming from the synthetic children provider instead of the actual children
- Python providers above provide a synthetic child len that returns the number of elements
into the container
Full bug fix for the issue in which getting byte size for a non-complete type would crash LLDB
Several other fixes, including:
- inverted the order of arguments in the ClangASTType constructor
- EvaluationPoint now only returns SharedPointer's to Target and Process
- the help text for several type subcommands now correctly indicates argument-less options as such
llvm-svn: 136504
Diffstat (limited to 'lldb/source/API/SBValue.cpp')
-rw-r--r-- | lldb/source/API/SBValue.cpp | 285 |
1 files changed, 253 insertions, 32 deletions
diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp index 2528f4c361f..229eba5f5d6 100644 --- a/lldb/source/API/SBValue.cpp +++ b/lldb/source/API/SBValue.cpp @@ -17,6 +17,7 @@ #include "lldb/Core/StreamFile.h" #include "lldb/Core/Value.h" #include "lldb/Core/ValueObject.h" +#include "lldb/Core/ValueObjectConstResult.h" #include "lldb/Symbol/Block.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/Variable.h" @@ -156,9 +157,9 @@ SBValue::IsInScope () if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); result = m_opaque_sp->IsInScope (); } } @@ -182,9 +183,9 @@ SBValue::GetValue () const char *cstr = NULL; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); cstr = m_opaque_sp->GetValueAsCString (); } } @@ -237,9 +238,9 @@ SBValue::GetObjectDescription () const char *cstr = NULL; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); cstr = m_opaque_sp->GetObjectDescription (); } } @@ -260,15 +261,39 @@ SBValue::GetValueDidChange (const SBFrame &sb_frame) return GetValueDidChange (); } +SBType +SBValue::GetType() +{ + SBType result; + if (m_opaque_sp) + { + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) + { + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); + result = SBType(m_opaque_sp->GetClangAST(), + m_opaque_sp->GetClangType()); + } + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.IsValid()) + log->Printf ("SBValue(%p)::GetType => %p", m_opaque_sp.get(), &result); + else + log->Printf ("SBValue(%p)::GetType => NULL", m_opaque_sp.get()); + } + return result; +} + bool SBValue::GetValueDidChange () { bool result = false; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); result = m_opaque_sp->GetValueDidChange (); } } @@ -291,9 +316,9 @@ SBValue::GetSummary () const char *cstr = NULL; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); cstr = m_opaque_sp->GetSummaryAsCString(); } } @@ -320,9 +345,9 @@ SBValue::GetLocation () const char *cstr = NULL; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); cstr = m_opaque_sp->GetLocationAsCString(); } } @@ -349,22 +374,109 @@ SBValue::SetValueFromCString (const char *value_str) bool success = false; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); success = m_opaque_sp->SetValueFromCString (value_str); } } return success; } +lldb::SBValue +SBValue::CreateChildAtOffset (const char *name, uint32_t offset, const SBType& type) +{ + lldb::SBValue result; + if (m_opaque_sp) + { + if (type.IsValid()) + { + result = SBValue(m_opaque_sp->GetSyntheticChildAtOffset(offset, *type.m_opaque_ap->GetClangASTType(), true)); + result.m_opaque_sp->SetName(ConstString(name)); + } + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.IsValid()) + log->Printf ("SBValue(%p)::GetChildAtOffset => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp.get()); + else + log->Printf ("SBValue(%p)::GetChildAtOffset => NULL", m_opaque_sp.get()); + } + return result; +} + +lldb::SBValue +SBValue::Cast(const SBType& type) +{ + return CreateChildAtOffset(m_opaque_sp->GetName().GetCString(), 0, type); +} + +lldb::SBValue +SBValue::CreateValueFromExpression (const char *name, const char* expression) +{ + lldb::SBValue result; + if (m_opaque_sp) + { + ValueObjectSP result_valobj_sp; + m_opaque_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression(expression, + m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame(), + true, true, eNoDynamicValues, + result_valobj_sp); + result_valobj_sp->SetName(ConstString(name)); + result = SBValue(result_valobj_sp); + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.IsValid()) + log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp.get()); + else + log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", m_opaque_sp.get()); + } + return result; +} + +lldb::SBValue +SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, const SBType& type) +{ + lldb::SBValue result; + if (m_opaque_sp) + { + + SBType real_type(type.GetPointerType()); + + lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); + + ValueObjectSP result_valobj_sp(ValueObjectConstResult::Create(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope(), + real_type.m_opaque_ap->GetASTContext(), + real_type.m_opaque_ap->GetOpaqueQualType(), + ConstString(name), + buffer, + lldb::endian::InlHostByteOrder(), + GetTarget().GetProcess().GetAddressByteSize())); + + result_valobj_sp->SetName(ConstString(name)); + result = SBValue(result_valobj_sp); + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.IsValid()) + log->Printf ("SBValue(%p)::GetChildFromAddress => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp.get()); + else + log->Printf ("SBValue(%p)::GetChildFromAddress => NULL", m_opaque_sp.get()); + } + return result; +} + SBValue SBValue::GetChildAtIndex (uint32_t idx) { const bool can_create_synthetic = false; lldb::DynamicValueType use_dynamic = eNoDynamicValues; if (m_opaque_sp) - use_dynamic = m_opaque_sp->GetUpdatePoint().GetTarget()->GetPreferDynamicValue(); + use_dynamic = m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue(); return GetChildAtIndex (idx, use_dynamic, can_create_synthetic); } @@ -375,9 +487,9 @@ SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); const bool can_create = true; child_sp = m_opaque_sp->GetChildAtIndex (idx, can_create); if (can_create_synthetic && !child_sp) @@ -418,9 +530,9 @@ SBValue::GetIndexOfChildWithName (const char *name) uint32_t idx = UINT32_MAX; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); idx = m_opaque_sp->GetIndexOfChildWithName (ConstString(name)); } @@ -441,7 +553,7 @@ SBValue::GetChildMemberWithName (const char *name) { if (m_opaque_sp) { - lldb::DynamicValueType use_dynamic_value = m_opaque_sp->GetUpdatePoint().GetTarget()->GetPreferDynamicValue(); + lldb::DynamicValueType use_dynamic_value = m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue(); return GetChildMemberWithName (name, use_dynamic_value); } else @@ -457,9 +569,9 @@ SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dy if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); child_sp = m_opaque_sp->GetChildMemberWithName (str_name, true); if (use_dynamic_value != lldb::eNoDynamicValues) { @@ -488,9 +600,9 @@ SBValue::GetValueForExpressionPath(const char* expr_path) lldb::ValueObjectSP child_sp; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); // using default values for all the fancy options, just do it if you can child_sp = m_opaque_sp->GetValueForExpressionPath(expr_path); } @@ -512,9 +624,9 @@ SBValue::GetNumChildren () if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); num_children = m_opaque_sp->GetNumChildren(); } @@ -534,9 +646,9 @@ SBValue::Dereference () SBValue sb_value; if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); Error error; sb_value = m_opaque_sp->Dereference (error); @@ -556,9 +668,9 @@ SBValue::TypeIsPointerType () if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); is_ptr_type = m_opaque_sp->IsPointerType(); } @@ -577,9 +689,9 @@ SBValue::GetOpaqueType() { if (m_opaque_sp) { - if (m_opaque_sp->GetUpdatePoint().GetTarget()) + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) { - Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex()); + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); return m_opaque_sp->GetClangType(); } @@ -587,6 +699,95 @@ SBValue::GetOpaqueType() return NULL; } +lldb::SBTarget +SBValue::GetTarget() +{ + SBTarget result; + if (m_opaque_sp) + { + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) + { + result = SBTarget(lldb::TargetSP(m_opaque_sp->GetUpdatePoint().GetTargetSP())); + } + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.get() == NULL) + log->Printf ("SBValue(%p)::GetTarget () => NULL", m_opaque_sp.get()); + else + log->Printf ("SBValue(%p)::GetTarget () => %p", m_opaque_sp.get(), result.get()); + } + return result; +} + +lldb::SBProcess +SBValue::GetProcess() +{ + SBProcess result; + if (m_opaque_sp) + { + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) + { + result = SBProcess(lldb::ProcessSP(m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetProcessSP())); + } + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.get() == NULL) + log->Printf ("SBValue(%p)::GetProcess () => NULL", m_opaque_sp.get()); + else + log->Printf ("SBValue(%p)::GetProcess () => %p", m_opaque_sp.get(), result.get()); + } + return result; +} + +lldb::SBThread +SBValue::GetThread() +{ + SBThread result; + if (m_opaque_sp) + { + if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()) + { + result = SBThread(lldb::ThreadSP(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateThread())); + } + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.get() == NULL) + log->Printf ("SBValue(%p)::GetThread () => NULL", m_opaque_sp.get()); + else + log->Printf ("SBValue(%p)::GetThread () => %p", m_opaque_sp.get(), result.get()); + } + return result; +} + +lldb::SBFrame +SBValue::GetFrame() +{ + SBFrame result; + if (m_opaque_sp) + { + if (m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()) + { + result = SBFrame(lldb::StackFrameSP(m_opaque_sp->GetUpdatePoint().GetExecutionContextScope()->CalculateStackFrame())); + } + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + { + if (result.get() == NULL) + log->Printf ("SBValue(%p)::GetFrame () => NULL", m_opaque_sp.get()); + else + log->Printf ("SBValue(%p)::GetFrame () => %p", m_opaque_sp.get(), result.get()); + } + return result; +} + + // Mimic shared pointer... lldb_private::ValueObject * SBValue::get() const @@ -685,3 +886,23 @@ SBValue::SetFormat (lldb::Format format) m_opaque_sp->SetFormat(format); } +lldb::SBValue +SBValue::AddressOf() +{ + SBValue sb_value; + if (m_opaque_sp) + { + if (m_opaque_sp->GetUpdatePoint().GetTargetSP()) + { + Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); + + Error error; + sb_value = m_opaque_sp->AddressOf (error); + } + } + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + log->Printf ("SBValue(%p)::GetPointerToObject () => SBValue(%p)", m_opaque_sp.get(), sb_value.get()); + + return sb_value; +}
\ No newline at end of file |