1 //===-- ValueObjectChild.cpp ------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Core/ValueObjectChild.h"
12 #include "lldb/Core/Module.h"
13 #include "lldb/Core/ValueObjectList.h"
15 #include "lldb/Symbol/ClangASTType.h"
16 #include "lldb/Symbol/ObjectFile.h"
17 #include "lldb/Symbol/SymbolContext.h"
18 #include "lldb/Symbol/Type.h"
19 #include "lldb/Symbol/Variable.h"
21 #include "lldb/Target/ExecutionContext.h"
22 #include "lldb/Target/Process.h"
23 #include "lldb/Target/Target.h"
25 using namespace lldb_private;
27 ValueObjectChild::ValueObjectChild
30 const ClangASTType &clang_type,
31 const ConstString &name,
34 uint32_t bitfield_bit_size,
35 uint32_t bitfield_bit_offset,
37 bool is_deref_of_parent,
38 AddressType child_ptr_or_ref_addr_type
41 m_clang_type (clang_type),
42 m_byte_size (byte_size),
43 m_byte_offset (byte_offset),
44 m_bitfield_bit_size (bitfield_bit_size),
45 m_bitfield_bit_offset (bitfield_bit_offset),
46 m_is_base_class (is_base_class),
47 m_is_deref_of_parent (is_deref_of_parent)
50 SetAddressTypeOfChildren(child_ptr_or_ref_addr_type);
53 ValueObjectChild::~ValueObjectChild()
58 ValueObjectChild::GetValueType() const
60 return m_parent->GetValueType();
64 ValueObjectChild::CalculateNumChildren()
66 return GetClangType().GetNumChildren (true);
70 ValueObjectChild::GetTypeName()
72 if (m_type_name.IsEmpty())
74 m_type_name = GetClangType().GetConstTypeName ();
77 if (m_bitfield_bit_size > 0)
79 const char *clang_type_name = m_type_name.AsCString();
82 std::vector<char> bitfield_type_name (strlen(clang_type_name) + 32, 0);
83 ::snprintf (&bitfield_type_name.front(), bitfield_type_name.size(), "%s:%u", clang_type_name, m_bitfield_bit_size);
84 m_type_name.SetCString(&bitfield_type_name.front());
93 ValueObjectChild::GetQualifiedTypeName()
95 ConstString qualified_name = GetClangType().GetConstTypeName();
98 if (m_bitfield_bit_size > 0)
100 const char *clang_type_name = qualified_name.AsCString();
103 std::vector<char> bitfield_type_name (strlen(clang_type_name) + 32, 0);
104 ::snprintf (&bitfield_type_name.front(), bitfield_type_name.size(), "%s:%u", clang_type_name, m_bitfield_bit_size);
105 qualified_name.SetCString(&bitfield_type_name.front());
109 return qualified_name;
113 ValueObjectChild::UpdateValue ()
116 SetValueIsValid (false);
117 ValueObject* parent = m_parent;
120 if (parent->UpdateValueIfNeeded(false))
122 m_value.SetClangType(GetClangType());
124 // Copy the parent scalar value and the scalar value type
125 m_value.GetScalar() = parent->GetValue().GetScalar();
126 Value::ValueType value_type = parent->GetValue().GetValueType();
127 m_value.SetValueType (value_type);
129 if (parent->GetClangType().IsPointerOrReferenceType ())
131 lldb::addr_t addr = parent->GetPointerValue ();
132 m_value.GetScalar() = addr;
134 if (addr == LLDB_INVALID_ADDRESS)
136 m_error.SetErrorString ("parent address is invalid.");
140 m_error.SetErrorString ("parent is NULL");
144 m_value.GetScalar() += m_byte_offset;
145 AddressType addr_type = parent->GetAddressTypeOfChildren();
149 case eAddressTypeFile:
151 lldb::ProcessSP process_sp (GetProcessSP());
152 if (process_sp && process_sp->IsAlive() == true)
153 m_value.SetValueType (Value::eValueTypeLoadAddress);
155 m_value.SetValueType(Value::eValueTypeFileAddress);
158 case eAddressTypeLoad:
159 m_value.SetValueType (Value::eValueTypeLoadAddress);
161 case eAddressTypeHost:
162 m_value.SetValueType(Value::eValueTypeHostAddress);
164 case eAddressTypeInvalid:
165 // TODO: does this make sense?
166 m_value.SetValueType(Value::eValueTypeScalar);
175 case Value::eValueTypeLoadAddress:
176 case Value::eValueTypeFileAddress:
177 case Value::eValueTypeHostAddress:
179 lldb::addr_t addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
180 if (addr == LLDB_INVALID_ADDRESS)
182 m_error.SetErrorString ("parent address is invalid.");
186 m_error.SetErrorString ("parent is NULL");
190 // Set this object's scalar value to the address of its
191 // value by adding its byte offset to the parent address
192 m_value.GetScalar() += GetByteOffset();
197 case Value::eValueTypeScalar:
198 // TODO: What if this is a register value? Do we try and
199 // extract the child value from within the parent data?
202 m_error.SetErrorString ("parent has invalid value.");
207 if (m_error.Success())
209 const bool thread_and_frame_only_if_stopped = true;
210 ExecutionContext exe_ctx (GetExecutionContextRef().Lock(thread_and_frame_only_if_stopped));
211 if (GetClangType().GetTypeInfo() & ClangASTType::eTypeHasValue)
212 m_error = m_value.GetValueAsData (&exe_ctx, m_data, 0, GetModule().get());
214 m_error.Clear(); // No value so nothing to read...
219 m_error.SetErrorStringWithFormat("parent failed to evaluate: %s", parent->GetError().AsCString());
224 m_error.SetErrorString("ValueObjectChild has a NULL parent ValueObject.");
227 return m_error.Success();
232 ValueObjectChild::IsInScope ()
234 ValueObject* root(GetRoot());
236 return root->IsInScope ();