diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Core/ValueObjectConstResult.cpp | 7 | ||||
-rw-r--r-- | lldb/source/Core/ValueObjectConstResultImpl.cpp | 23 | ||||
-rw-r--r-- | lldb/source/Expression/ClangExpressionDeclMap.cpp | 14 |
3 files changed, 41 insertions, 3 deletions
diff --git a/lldb/source/Core/ValueObjectConstResult.cpp b/lldb/source/Core/ValueObjectConstResult.cpp index 9a23ca82a1b..fa1503f3217 100644 --- a/lldb/source/Core/ValueObjectConstResult.cpp +++ b/lldb/source/Core/ValueObjectConstResult.cpp @@ -324,6 +324,13 @@ ValueObjectConstResult::AddressOf (Error &error) return m_impl.AddressOf(error); } +lldb::addr_t +ValueObjectConstResult::GetAddressOf (bool scalar_is_load_address, + AddressType *address_type) +{ + return m_impl.GetAddressOf(scalar_is_load_address, address_type); +} + ValueObject * ValueObjectConstResult::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index) { diff --git a/lldb/source/Core/ValueObjectConstResultImpl.cpp b/lldb/source/Core/ValueObjectConstResultImpl.cpp index 119ba015590..afe050291b0 100644 --- a/lldb/source/Core/ValueObjectConstResultImpl.cpp +++ b/lldb/source/Core/ValueObjectConstResultImpl.cpp @@ -40,7 +40,8 @@ using namespace lldb_private; ValueObjectConstResultImpl::ValueObjectConstResultImpl (ValueObject* valobj, lldb::addr_t live_address) : m_impl_backend(valobj), - m_live_address(live_address), + m_live_address(live_address), + m_live_address_type(eAddressTypeLoad), m_load_addr_backend(), m_address_of_backend() { @@ -201,6 +202,26 @@ ValueObjectConstResultImpl::AddressOf (Error &error) return lldb::ValueObjectSP(); } +lldb::addr_t +ValueObjectConstResultImpl::GetAddressOf (bool scalar_is_load_address, + AddressType *address_type) +{ + + if (m_impl_backend == NULL) + return 0; + + if (m_live_address == LLDB_INVALID_ADDRESS) + { + return m_impl_backend->ValueObject::GetAddressOf (scalar_is_load_address, + address_type); + } + + if (address_type) + *address_type = m_live_address_type; + + return m_live_address; +} + size_t ValueObjectConstResultImpl::GetPointeeData (DataExtractor& data, uint32_t item_idx, diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index e019334a5f7..e115054549a 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -396,13 +396,23 @@ ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP { // The reference comes from the program. We need to set up a live SP for it. + unsigned long long address = value.GetScalar().ULongLong(); + AddressType address_type = value.GetValueAddressType(); + pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), pvar_sp->GetTypeFromUser().GetASTContext(), pvar_sp->GetTypeFromUser().GetOpaqueQualType(), pvar_sp->GetName(), - value.GetScalar().ULongLong(), - value.GetValueAddressType(), + address, + address_type, pvar_sp->GetByteSize()); + + // if the frozen object does not yet have a valid live address we replicate the live_sp address + // to it. this solves the issue where synthetic children providers are unable to access + // the address-of result for objects obtained by casting the result of pointer arithmetic + // performed by the expression parser, as in: print *((ClassType*)(value-1)) + if (pvar_sp->m_frozen_sp->GetLiveAddress() == LLDB_INVALID_ADDRESS) + pvar_sp->m_frozen_sp->SetLiveAddress(address); } if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry) |