1254721Semaste//===-- ValueObjectConstResult.cpp ------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Core/ValueObjectConstResult.h"
11254721Semaste
12254721Semaste#include "lldb/Core/ValueObjectChild.h"
13254721Semaste#include "lldb/Core/ValueObjectConstResultChild.h"
14254721Semaste#include "lldb/Core/DataExtractor.h"
15254721Semaste#include "lldb/Core/Module.h"
16254721Semaste#include "lldb/Core/ValueObjectDynamicValue.h"
17254721Semaste#include "lldb/Core/ValueObjectList.h"
18254721Semaste
19254721Semaste#include "lldb/Symbol/ClangASTType.h"
20254721Semaste#include "lldb/Symbol/ObjectFile.h"
21254721Semaste#include "lldb/Symbol/SymbolContext.h"
22254721Semaste#include "lldb/Symbol/Type.h"
23254721Semaste#include "lldb/Symbol/Variable.h"
24254721Semaste
25254721Semaste#include "lldb/Target/ExecutionContext.h"
26254721Semaste#include "lldb/Target/Process.h"
27254721Semaste#include "lldb/Target/Target.h"
28254721Semaste
29254721Semasteusing namespace lldb;
30254721Semasteusing namespace lldb_private;
31254721Semaste
32254721SemasteValueObjectSP
33254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope,
34254721Semaste                                ByteOrder byte_order,
35254721Semaste                                uint32_t addr_byte_size,
36254721Semaste                                lldb::addr_t address)
37254721Semaste{
38254721Semaste    return (new ValueObjectConstResult (exe_scope,
39254721Semaste                                        byte_order,
40254721Semaste                                        addr_byte_size,
41254721Semaste                                        address))->GetSP();
42254721Semaste}
43254721Semaste
44254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope,
45254721Semaste                                                ByteOrder byte_order,
46254721Semaste                                                uint32_t addr_byte_size,
47254721Semaste                                                lldb::addr_t address) :
48254721Semaste    ValueObject (exe_scope),
49254721Semaste    m_type_name (),
50254721Semaste    m_byte_size (0),
51254721Semaste    m_impl(this, address)
52254721Semaste{
53254721Semaste    SetIsConstant ();
54254721Semaste    SetValueIsValid(true);
55254721Semaste    m_data.SetByteOrder(byte_order);
56254721Semaste    m_data.SetAddressByteSize(addr_byte_size);
57254721Semaste    SetAddressTypeOfChildren(eAddressTypeLoad);
58254721Semaste}
59254721Semaste
60254721SemasteValueObjectSP
61254721SemasteValueObjectConstResult::Create
62254721Semaste(
63254721Semaste    ExecutionContextScope *exe_scope,
64254721Semaste    const ClangASTType &clang_type,
65254721Semaste    const ConstString &name,
66254721Semaste    const DataExtractor &data,
67254721Semaste    lldb::addr_t address
68254721Semaste)
69254721Semaste{
70254721Semaste    return (new ValueObjectConstResult (exe_scope,
71254721Semaste                                        clang_type,
72254721Semaste                                        name,
73254721Semaste                                        data,
74254721Semaste                                        address))->GetSP();
75254721Semaste}
76254721Semaste
77254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope,
78254721Semaste                                                const ClangASTType &clang_type,
79254721Semaste                                                const ConstString &name,
80254721Semaste                                                const DataExtractor &data,
81254721Semaste                                                lldb::addr_t address) :
82254721Semaste    ValueObject (exe_scope),
83254721Semaste    m_type_name (),
84254721Semaste    m_byte_size (0),
85254721Semaste    m_impl(this, address)
86254721Semaste{
87254721Semaste    m_data = data;
88254721Semaste
89254721Semaste    if (!m_data.GetSharedDataBuffer())
90254721Semaste    {
91254721Semaste        DataBufferSP shared_data_buffer(new DataBufferHeap(data.GetDataStart(), data.GetByteSize()));
92254721Semaste        m_data.SetData(shared_data_buffer);
93254721Semaste    }
94254721Semaste
95254721Semaste    m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
96254721Semaste    m_value.SetValueType(Value::eValueTypeHostAddress);
97254721Semaste    m_value.SetClangType(clang_type);
98254721Semaste    m_name = name;
99254721Semaste    SetIsConstant ();
100254721Semaste    SetValueIsValid(true);
101254721Semaste    SetAddressTypeOfChildren(eAddressTypeLoad);
102254721Semaste}
103254721Semaste
104254721SemasteValueObjectSP
105254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope,
106254721Semaste                                const ClangASTType &clang_type,
107254721Semaste                                const ConstString &name,
108254721Semaste                                const lldb::DataBufferSP &data_sp,
109254721Semaste                                lldb::ByteOrder data_byte_order,
110254721Semaste                                uint32_t data_addr_size,
111254721Semaste                                lldb::addr_t address)
112254721Semaste{
113254721Semaste    return (new ValueObjectConstResult (exe_scope,
114254721Semaste                                        clang_type,
115254721Semaste                                        name,
116254721Semaste                                        data_sp,
117254721Semaste                                        data_byte_order,
118254721Semaste                                        data_addr_size,
119254721Semaste                                        address))->GetSP();
120254721Semaste}
121254721Semaste
122254721SemasteValueObjectSP
123254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope,
124254721Semaste                                Value &value,
125254721Semaste                                const ConstString &name)
126254721Semaste{
127254721Semaste    return (new ValueObjectConstResult (exe_scope, value, name))->GetSP();
128254721Semaste}
129254721Semaste
130254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope,
131254721Semaste                                                const ClangASTType &clang_type,
132254721Semaste                                                const ConstString &name,
133254721Semaste                                                const lldb::DataBufferSP &data_sp,
134254721Semaste                                                lldb::ByteOrder data_byte_order,
135254721Semaste                                                uint32_t data_addr_size,
136254721Semaste                                                lldb::addr_t address) :
137254721Semaste    ValueObject (exe_scope),
138254721Semaste    m_type_name (),
139254721Semaste    m_byte_size (0),
140254721Semaste    m_impl(this, address)
141254721Semaste{
142254721Semaste    m_data.SetByteOrder(data_byte_order);
143254721Semaste    m_data.SetAddressByteSize(data_addr_size);
144254721Semaste    m_data.SetData(data_sp);
145254721Semaste    m_value.GetScalar() = (uintptr_t)data_sp->GetBytes();
146254721Semaste    m_value.SetValueType(Value::eValueTypeHostAddress);
147254721Semaste    //m_value.SetContext(Value::eContextTypeClangType, clang_type);
148254721Semaste    m_value.SetClangType (clang_type);
149254721Semaste    m_name = name;
150254721Semaste    SetIsConstant ();
151254721Semaste    SetValueIsValid(true);
152254721Semaste    SetAddressTypeOfChildren(eAddressTypeLoad);
153254721Semaste}
154254721Semaste
155254721SemasteValueObjectSP
156254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope,
157254721Semaste                                const ClangASTType &clang_type,
158254721Semaste                                const ConstString &name,
159254721Semaste                                lldb::addr_t address,
160254721Semaste                                AddressType address_type,
161254721Semaste                                uint32_t addr_byte_size)
162254721Semaste{
163254721Semaste    return (new ValueObjectConstResult (exe_scope,
164254721Semaste                                        clang_type,
165254721Semaste                                        name,
166254721Semaste                                        address,
167254721Semaste                                        address_type,
168254721Semaste                                        addr_byte_size))->GetSP();
169254721Semaste}
170254721Semaste
171254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope,
172254721Semaste                                                const ClangASTType &clang_type,
173254721Semaste                                                const ConstString &name,
174254721Semaste                                                lldb::addr_t address,
175254721Semaste                                                AddressType address_type,
176254721Semaste                                                uint32_t addr_byte_size) :
177254721Semaste    ValueObject (exe_scope),
178254721Semaste    m_type_name (),
179254721Semaste    m_byte_size (0),
180254721Semaste    m_impl(this, address)
181254721Semaste{
182254721Semaste    m_value.GetScalar() = address;
183254721Semaste    m_data.SetAddressByteSize(addr_byte_size);
184254721Semaste    m_value.GetScalar().GetData (m_data, addr_byte_size);
185254721Semaste    //m_value.SetValueType(Value::eValueTypeHostAddress);
186254721Semaste    switch (address_type)
187254721Semaste    {
188254721Semaste    case eAddressTypeInvalid:   m_value.SetValueType(Value::eValueTypeScalar);      break;
189254721Semaste    case eAddressTypeFile:      m_value.SetValueType(Value::eValueTypeFileAddress); break;
190254721Semaste    case eAddressTypeLoad:      m_value.SetValueType(Value::eValueTypeLoadAddress); break;
191254721Semaste    case eAddressTypeHost:      m_value.SetValueType(Value::eValueTypeHostAddress); break;
192254721Semaste    }
193254721Semaste//    m_value.SetContext(Value::eContextTypeClangType, clang_type);
194254721Semaste    m_value.SetClangType (clang_type);
195254721Semaste    m_name = name;
196254721Semaste    SetIsConstant ();
197254721Semaste    SetValueIsValid(true);
198254721Semaste    SetAddressTypeOfChildren(eAddressTypeLoad);
199254721Semaste}
200254721Semaste
201254721SemasteValueObjectSP
202254721SemasteValueObjectConstResult::Create
203254721Semaste(
204254721Semaste    ExecutionContextScope *exe_scope,
205254721Semaste    const Error& error
206254721Semaste)
207254721Semaste{
208254721Semaste    return (new ValueObjectConstResult (exe_scope,
209254721Semaste                                        error))->GetSP();
210254721Semaste}
211254721Semaste
212254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope,
213254721Semaste                                                const Error& error) :
214254721Semaste    ValueObject (exe_scope),
215254721Semaste    m_type_name (),
216254721Semaste    m_byte_size (0),
217254721Semaste    m_impl(this)
218254721Semaste{
219254721Semaste    m_error = error;
220254721Semaste    SetIsConstant ();
221254721Semaste}
222254721Semaste
223254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope,
224254721Semaste                                                const Value &value,
225254721Semaste                                                const ConstString &name) :
226254721Semaste    ValueObject (exe_scope),
227254721Semaste    m_type_name (),
228254721Semaste    m_byte_size (0),
229254721Semaste    m_impl(this)
230254721Semaste{
231254721Semaste    m_value = value;
232254721Semaste    m_value.GetData(m_data);
233254721Semaste}
234254721Semaste
235254721SemasteValueObjectConstResult::~ValueObjectConstResult()
236254721Semaste{
237254721Semaste}
238254721Semaste
239254721SemasteClangASTType
240254721SemasteValueObjectConstResult::GetClangTypeImpl()
241254721Semaste{
242254721Semaste    return m_value.GetClangType();
243254721Semaste}
244254721Semaste
245254721Semastelldb::ValueType
246254721SemasteValueObjectConstResult::GetValueType() const
247254721Semaste{
248254721Semaste    return eValueTypeConstResult;
249254721Semaste}
250254721Semaste
251254721Semasteuint64_t
252254721SemasteValueObjectConstResult::GetByteSize()
253254721Semaste{
254254721Semaste    if (m_byte_size == 0)
255254721Semaste        m_byte_size = GetClangType().GetByteSize();
256254721Semaste    return m_byte_size;
257254721Semaste}
258254721Semaste
259254721Semastevoid
260254721SemasteValueObjectConstResult::SetByteSize (size_t size)
261254721Semaste{
262254721Semaste    m_byte_size = size;
263254721Semaste}
264254721Semaste
265254721Semastesize_t
266254721SemasteValueObjectConstResult::CalculateNumChildren()
267254721Semaste{
268254721Semaste    return GetClangType().GetNumChildren (true);
269254721Semaste}
270254721Semaste
271254721SemasteConstString
272254721SemasteValueObjectConstResult::GetTypeName()
273254721Semaste{
274254721Semaste    if (m_type_name.IsEmpty())
275254721Semaste        m_type_name = GetClangType().GetConstTypeName ();
276254721Semaste    return m_type_name;
277254721Semaste}
278254721Semaste
279254721Semastebool
280254721SemasteValueObjectConstResult::UpdateValue ()
281254721Semaste{
282254721Semaste    // Const value is always valid
283254721Semaste    SetValueIsValid (true);
284254721Semaste    return true;
285254721Semaste}
286254721Semaste
287254721Semaste
288254721Semastebool
289254721SemasteValueObjectConstResult::IsInScope ()
290254721Semaste{
291254721Semaste    // A const result value is always in scope since it serializes all
292254721Semaste    // information needed to contain the constant value.
293254721Semaste    return true;
294254721Semaste}
295254721Semaste
296254721Semastelldb::ValueObjectSP
297254721SemasteValueObjectConstResult::Dereference (Error &error)
298254721Semaste{
299254721Semaste    return m_impl.Dereference(error);
300254721Semaste}
301254721Semaste
302254721Semastelldb::ValueObjectSP
303254721SemasteValueObjectConstResult::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create)
304254721Semaste{
305254721Semaste    return m_impl.GetSyntheticChildAtOffset(offset, type, can_create);
306254721Semaste}
307254721Semaste
308254721Semastelldb::ValueObjectSP
309254721SemasteValueObjectConstResult::AddressOf (Error &error)
310254721Semaste{
311254721Semaste    return m_impl.AddressOf(error);
312254721Semaste}
313254721Semaste
314254721Semastelldb::addr_t
315254721SemasteValueObjectConstResult::GetAddressOf (bool scalar_is_load_address,
316254721Semaste                                      AddressType *address_type)
317254721Semaste{
318254721Semaste    return m_impl.GetAddressOf(scalar_is_load_address, address_type);
319254721Semaste}
320254721Semaste
321254721SemasteValueObject *
322254721SemasteValueObjectConstResult::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index)
323254721Semaste{
324254721Semaste    return m_impl.CreateChildAtIndex(idx, synthetic_array_member, synthetic_index);
325254721Semaste}
326254721Semaste
327254721Semastesize_t
328254721SemasteValueObjectConstResult::GetPointeeData (DataExtractor& data,
329254721Semaste                                        uint32_t item_idx,
330254721Semaste                                        uint32_t item_count)
331254721Semaste{
332254721Semaste    return m_impl.GetPointeeData(data, item_idx, item_count);
333254721Semaste}
334254721Semaste
335254721Semastelldb::ValueObjectSP
336254721SemasteValueObjectConstResult::GetDynamicValue (lldb::DynamicValueType use_dynamic)
337254721Semaste{
338254721Semaste    // Always recalculate dynamic values for const results as the memory that
339254721Semaste    // they might point to might have changed at any time.
340254721Semaste    if (use_dynamic != eNoDynamicValues)
341254721Semaste    {
342254721Semaste        if (!IsDynamic())
343254721Semaste        {
344254721Semaste            ExecutionContext exe_ctx (GetExecutionContextRef());
345254721Semaste            Process *process = exe_ctx.GetProcessPtr();
346254721Semaste            if (process && process->IsPossibleDynamicValue(*this))
347254721Semaste                m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
348254721Semaste        }
349254721Semaste        if (m_dynamic_value)
350254721Semaste            return m_dynamic_value->GetSP();
351254721Semaste    }
352254721Semaste    return ValueObjectSP();
353254721Semaste}
354254721Semaste
355