1*2f3df613SZachary Turner //===-- ValueObjectConstResultImpl.cpp ---------------------------*- C++-*-===// 29128ee2fSEnrico Granata // 39128ee2fSEnrico Granata // The LLVM Compiler Infrastructure 49128ee2fSEnrico Granata // 59128ee2fSEnrico Granata // This file is distributed under the University of Illinois Open Source 69128ee2fSEnrico Granata // License. See LICENSE.TXT for details. 79128ee2fSEnrico Granata // 89128ee2fSEnrico Granata //===----------------------------------------------------------------------===// 99128ee2fSEnrico Granata 109128ee2fSEnrico Granata #include "lldb/Core/ValueObjectConstResultImpl.h" 119128ee2fSEnrico Granata 12*2f3df613SZachary Turner #include "lldb/Core/Scalar.h" // for Scalar 13*2f3df613SZachary Turner #include "lldb/Core/Value.h" // for Value, Value::Val... 14*2f3df613SZachary Turner #include "lldb/Core/ValueObject.h" // for ValueObject 159128ee2fSEnrico Granata #include "lldb/Core/ValueObjectConstResult.h" 16f8877efcSSiva Chandra #include "lldb/Core/ValueObjectConstResultCast.h" 179128ee2fSEnrico Granata #include "lldb/Core/ValueObjectConstResultChild.h" 18a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h" 199128ee2fSEnrico Granata #include "lldb/Target/ExecutionContext.h" 20*2f3df613SZachary Turner #include "lldb/Utility/DataBufferHeap.h" // for DataBufferHeap 21*2f3df613SZachary Turner #include "lldb/Utility/Endian.h" // for InlHostByteOrder 22*2f3df613SZachary Turner #include "lldb/Utility/SharingPtr.h" // for SharingPtr 23*2f3df613SZachary Turner 24*2f3df613SZachary Turner #include <string> // for string 25*2f3df613SZachary Turner 26*2f3df613SZachary Turner namespace lldb_private { 27*2f3df613SZachary Turner class DataExtractor; 28*2f3df613SZachary Turner } 29*2f3df613SZachary Turner namespace lldb_private { 30*2f3df613SZachary Turner class Error; 31*2f3df613SZachary Turner } 329128ee2fSEnrico Granata 339128ee2fSEnrico Granata using namespace lldb; 349128ee2fSEnrico Granata using namespace lldb_private; 359128ee2fSEnrico Granata 36b9c1b51eSKate Stone ValueObjectConstResultImpl::ValueObjectConstResultImpl( 37b9c1b51eSKate Stone ValueObject *valobj, lldb::addr_t live_address) 38b9c1b51eSKate Stone : m_impl_backend(valobj), m_live_address(live_address), 39b9c1b51eSKate Stone m_live_address_type(eAddressTypeLoad), m_load_addr_backend(), 40b9c1b51eSKate Stone m_address_of_backend() {} 419128ee2fSEnrico Granata 42b9c1b51eSKate Stone lldb::ValueObjectSP ValueObjectConstResultImpl::Dereference(Error &error) { 439128ee2fSEnrico Granata if (m_impl_backend == NULL) 449128ee2fSEnrico Granata return lldb::ValueObjectSP(); 459128ee2fSEnrico Granata 469128ee2fSEnrico Granata return m_impl_backend->ValueObject::Dereference(error); 479128ee2fSEnrico Granata } 489128ee2fSEnrico Granata 49b9c1b51eSKate Stone ValueObject *ValueObjectConstResultImpl::CreateChildAtIndex( 50b9c1b51eSKate Stone size_t idx, bool synthetic_array_member, int32_t synthetic_index) { 519128ee2fSEnrico Granata if (m_impl_backend == NULL) 529128ee2fSEnrico Granata return NULL; 539128ee2fSEnrico Granata 549128ee2fSEnrico Granata m_impl_backend->UpdateValueIfNeeded(false); 559128ee2fSEnrico Granata 569128ee2fSEnrico Granata ValueObjectConstResultChild *valobj = NULL; 579128ee2fSEnrico Granata 589128ee2fSEnrico Granata bool omit_empty_base_classes = true; 599128ee2fSEnrico Granata bool ignore_array_bounds = synthetic_array_member; 609128ee2fSEnrico Granata std::string child_name_str; 619128ee2fSEnrico Granata uint32_t child_byte_size = 0; 629128ee2fSEnrico Granata int32_t child_byte_offset = 0; 639128ee2fSEnrico Granata uint32_t child_bitfield_bit_size = 0; 649128ee2fSEnrico Granata uint32_t child_bitfield_bit_offset = 0; 659128ee2fSEnrico Granata bool child_is_base_class = false; 669128ee2fSEnrico Granata bool child_is_deref_of_parent = false; 67dc62ffd3SEnrico Granata uint64_t language_flags; 689128ee2fSEnrico Granata 699128ee2fSEnrico Granata const bool transparent_pointers = synthetic_array_member == false; 703ad353f3SBruce Mitchener CompilerType compiler_type = m_impl_backend->GetCompilerType(); 714ad83340SBruce Mitchener CompilerType child_compiler_type; 729128ee2fSEnrico Granata 73cc4d0146SGreg Clayton ExecutionContext exe_ctx(m_impl_backend->GetExecutionContextRef()); 749128ee2fSEnrico Granata 75b9c1b51eSKate Stone child_compiler_type = compiler_type.GetChildCompilerTypeAtIndex( 76b9c1b51eSKate Stone &exe_ctx, idx, transparent_pointers, omit_empty_base_classes, 77b9c1b51eSKate Stone ignore_array_bounds, child_name_str, child_byte_size, child_byte_offset, 78b9c1b51eSKate Stone child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class, 79b9c1b51eSKate Stone child_is_deref_of_parent, m_impl_backend, language_flags); 80b9c1b51eSKate Stone if (child_compiler_type && child_byte_size) { 819128ee2fSEnrico Granata if (synthetic_index) 829128ee2fSEnrico Granata child_byte_offset += child_byte_size * synthetic_index; 839128ee2fSEnrico Granata 849128ee2fSEnrico Granata ConstString child_name; 859128ee2fSEnrico Granata if (!child_name_str.empty()) 869128ee2fSEnrico Granata child_name.SetCString(child_name_str.c_str()); 879128ee2fSEnrico Granata 88b9c1b51eSKate Stone valobj = new ValueObjectConstResultChild( 89b9c1b51eSKate Stone *m_impl_backend, child_compiler_type, child_name, child_byte_size, 90b9c1b51eSKate Stone child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset, 91b9c1b51eSKate Stone child_is_base_class, child_is_deref_of_parent, 92b9c1b51eSKate Stone m_live_address == LLDB_INVALID_ADDRESS 93b9c1b51eSKate Stone ? m_live_address 94b9c1b51eSKate Stone : m_live_address + child_byte_offset, 95dc62ffd3SEnrico Granata language_flags); 969128ee2fSEnrico Granata } 979128ee2fSEnrico Granata 989128ee2fSEnrico Granata return valobj; 999128ee2fSEnrico Granata } 1009128ee2fSEnrico Granata 101b9c1b51eSKate Stone lldb::ValueObjectSP ValueObjectConstResultImpl::GetSyntheticChildAtOffset( 102b9c1b51eSKate Stone uint32_t offset, const CompilerType &type, bool can_create, 103b9c1b51eSKate Stone ConstString name_const_str) { 1049128ee2fSEnrico Granata if (m_impl_backend == NULL) 1059128ee2fSEnrico Granata return lldb::ValueObjectSP(); 1069128ee2fSEnrico Granata 107b9c1b51eSKate Stone return m_impl_backend->ValueObject::GetSyntheticChildAtOffset( 108b9c1b51eSKate Stone offset, type, can_create, name_const_str); 1099128ee2fSEnrico Granata } 1109128ee2fSEnrico Granata 111b9c1b51eSKate Stone lldb::ValueObjectSP ValueObjectConstResultImpl::AddressOf(Error &error) { 1129128ee2fSEnrico Granata if (m_address_of_backend.get() != NULL) 1139128ee2fSEnrico Granata return m_address_of_backend; 1149128ee2fSEnrico Granata 1159128ee2fSEnrico Granata if (m_impl_backend == NULL) 1169128ee2fSEnrico Granata return lldb::ValueObjectSP(); 117b9c1b51eSKate Stone if (m_live_address != LLDB_INVALID_ADDRESS) { 1183ad353f3SBruce Mitchener CompilerType compiler_type(m_impl_backend->GetCompilerType()); 1199128ee2fSEnrico Granata 120b9c1b51eSKate Stone lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap( 121b9c1b51eSKate Stone &m_live_address, sizeof(lldb::addr_t))); 1229128ee2fSEnrico Granata 1239128ee2fSEnrico Granata std::string new_name("&"); 1249128ee2fSEnrico Granata new_name.append(m_impl_backend->GetName().AsCString("")); 125cc4d0146SGreg Clayton ExecutionContext exe_ctx(m_impl_backend->GetExecutionContextRef()); 126b9c1b51eSKate Stone m_address_of_backend = ValueObjectConstResult::Create( 127b9c1b51eSKate Stone exe_ctx.GetBestExecutionContextScope(), compiler_type.GetPointerType(), 128b9c1b51eSKate Stone ConstString(new_name.c_str()), buffer, endian::InlHostByteOrder(), 129cc4d0146SGreg Clayton exe_ctx.GetAddressByteSize()); 1309128ee2fSEnrico Granata 1319128ee2fSEnrico Granata m_address_of_backend->GetValue().SetValueType(Value::eValueTypeScalar); 1329128ee2fSEnrico Granata m_address_of_backend->GetValue().GetScalar() = m_live_address; 1339128ee2fSEnrico Granata 1349128ee2fSEnrico Granata return m_address_of_backend; 135b9c1b51eSKate Stone } else 136987ed3ceSEnrico Granata return m_impl_backend->ValueObject::AddressOf(error); 1379128ee2fSEnrico Granata } 1389128ee2fSEnrico Granata 139f8877efcSSiva Chandra lldb::ValueObjectSP 140b9c1b51eSKate Stone ValueObjectConstResultImpl::Cast(const CompilerType &compiler_type) { 141f8877efcSSiva Chandra if (m_impl_backend == NULL) 142f8877efcSSiva Chandra return lldb::ValueObjectSP(); 143f8877efcSSiva Chandra 144b9c1b51eSKate Stone ValueObjectConstResultCast *result_cast = 145b9c1b51eSKate Stone new ValueObjectConstResultCast(*m_impl_backend, m_impl_backend->GetName(), 146b9c1b51eSKate Stone compiler_type, m_live_address); 147f8877efcSSiva Chandra return result_cast->GetSP(); 148f8877efcSSiva Chandra } 149f8877efcSSiva Chandra 150b456b792SJohnny Chen lldb::addr_t 151b456b792SJohnny Chen ValueObjectConstResultImpl::GetAddressOf(bool scalar_is_load_address, 152b9c1b51eSKate Stone AddressType *address_type) { 153b456b792SJohnny Chen 154b456b792SJohnny Chen if (m_impl_backend == NULL) 155b456b792SJohnny Chen return 0; 156b456b792SJohnny Chen 157b9c1b51eSKate Stone if (m_live_address == LLDB_INVALID_ADDRESS) { 158b456b792SJohnny Chen return m_impl_backend->ValueObject::GetAddressOf(scalar_is_load_address, 159b456b792SJohnny Chen address_type); 160b456b792SJohnny Chen } 161b456b792SJohnny Chen 162b456b792SJohnny Chen if (address_type) 163b456b792SJohnny Chen *address_type = m_live_address_type; 164b456b792SJohnny Chen 165b456b792SJohnny Chen return m_live_address; 166b456b792SJohnny Chen } 167b456b792SJohnny Chen 168b9c1b51eSKate Stone size_t ValueObjectConstResultImpl::GetPointeeData(DataExtractor &data, 1699128ee2fSEnrico Granata uint32_t item_idx, 170b9c1b51eSKate Stone uint32_t item_count) { 1719128ee2fSEnrico Granata if (m_impl_backend == NULL) 1729128ee2fSEnrico Granata return 0; 173b9c1b51eSKate Stone return m_impl_backend->ValueObject::GetPointeeData(data, item_idx, 174b9c1b51eSKate Stone item_count); 1759128ee2fSEnrico Granata } 176