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