1e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham//===-- ValueObjectMemory.cpp ---------------------------------*- C++ -*-===//
2e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham//
3e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham//                     The LLVM Compiler Infrastructure
4e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham//
5e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// This file is distributed under the University of Illinois Open Source
6e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// License. See LICENSE.TXT for details.
7e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham//
8e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham//===----------------------------------------------------------------------===//
9e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
10e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
11e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectMemory.h"
12e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
13e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// C Includes
14e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// C++ Includes
15e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// Other libraries and framework includes
16e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// Project includes
17e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/Module.h"
18e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectList.h"
19e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/Value.h"
20e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObject.h"
21e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
22e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/ObjectFile.h"
23e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/SymbolContext.h"
24e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/Type.h"
25e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/Variable.h"
26e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
27e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/ExecutionContext.h"
28e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/Process.h"
29e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/RegisterContext.h"
30e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/Target.h"
31e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/Thread.h"
32e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
3347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Inghamusing namespace lldb;
34e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamusing namespace lldb_private;
35e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
3647da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
3747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectMemory::Create (ExecutionContextScope *exe_scope,
3847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                           const char *name,
3947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                           const Address &address,
4047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                           lldb::TypeSP &type_sp)
4147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{
4247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return (new ValueObjectMemory (exe_scope, name, address, type_sp))->GetSP();
4347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham}
4447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
4557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonValueObjectSP
4657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonValueObjectMemory::Create (ExecutionContextScope *exe_scope,
4757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                           const char *name,
4857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                           const Address &address,
4957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                           const ClangASTType &ast_type)
5057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
5157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    return (new ValueObjectMemory (exe_scope, name, address, ast_type))->GetSP();
5257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}
5357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
54e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::ValueObjectMemory (ExecutionContextScope *exe_scope,
55e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                      const char *name,
56e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                      const Address &address,
57e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                      lldb::TypeSP &type_sp) :
58e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    ValueObject(exe_scope),
59e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_address (address),
6057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    m_type_sp(type_sp),
6157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    m_clang_type()
62e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
63e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // Do not attempt to construct one of these objects with no variable!
64e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    assert (m_type_sp.get() != NULL);
65979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    SetName (ConstString(name));
66e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_value.SetContext(Value::eContextTypeLLDBType, m_type_sp.get());
67b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    TargetSP target_sp (GetTargetSP());
68b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    lldb::addr_t load_address = m_address.GetLoadAddress(target_sp.get());
69e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (load_address != LLDB_INVALID_ADDRESS)
70e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
71e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        m_value.SetValueType(Value::eValueTypeLoadAddress);
72e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        m_value.GetScalar() = load_address;
73e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
74e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    else
75e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
76e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        lldb::addr_t file_address = m_address.GetFileAddress();
77e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (file_address != LLDB_INVALID_ADDRESS)
78e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
79e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            m_value.SetValueType(Value::eValueTypeFileAddress);
80e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            m_value.GetScalar() = file_address;
81e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
82e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        else
83e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
84e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            m_value.GetScalar() = m_address.GetOffset();
85e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            m_value.SetValueType (Value::eValueTypeScalar);
86e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
87e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
88e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
89e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
9057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonValueObjectMemory::ValueObjectMemory (ExecutionContextScope *exe_scope,
9157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                                      const char *name,
9257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                                      const Address &address,
9357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                                      const ClangASTType &ast_type) :
9457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    ValueObject(exe_scope),
9557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    m_address (address),
9657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    m_type_sp(),
9757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    m_clang_type(ast_type)
9857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
9957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    // Do not attempt to construct one of these objects with no variable!
10057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    assert (m_clang_type.GetASTContext());
10157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    assert (m_clang_type.GetOpaqueQualType());
10257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
103b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    TargetSP target_sp (GetTargetSP());
104b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton
105979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    SetName (ConstString(name));
10652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    m_value.SetContext(Value::eContextTypeClangType, m_clang_type.GetOpaqueQualType());
10752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value.SetClangType(m_clang_type);
108b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    lldb::addr_t load_address = m_address.GetLoadAddress (target_sp.get());
10957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    if (load_address != LLDB_INVALID_ADDRESS)
11057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    {
11157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        m_value.SetValueType(Value::eValueTypeLoadAddress);
11257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        m_value.GetScalar() = load_address;
11357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    }
11457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    else
11557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    {
11657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        lldb::addr_t file_address = m_address.GetFileAddress();
11757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        if (file_address != LLDB_INVALID_ADDRESS)
11857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        {
11957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            m_value.SetValueType(Value::eValueTypeFileAddress);
12057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            m_value.GetScalar() = file_address;
12157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        }
12257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        else
12357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        {
12457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            m_value.GetScalar() = m_address.GetOffset();
12557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            m_value.SetValueType (Value::eValueTypeScalar);
12657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        }
12757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    }
12857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}
12957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
130e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::~ValueObjectMemory()
131e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
132e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
133e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
13452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
135931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectMemory::GetClangTypeImpl ()
136e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
13757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    if (m_type_sp)
13857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        return m_type_sp->GetClangForwardType();
13952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return m_clang_type;
140e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
141e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
142e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamConstString
143e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::GetTypeName()
144e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
14557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    if (m_type_sp)
14657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        return m_type_sp->GetName();
14752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return m_clang_type.GetConstTypeName();
148e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
149e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
15036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
151e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::CalculateNumChildren()
152e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
15357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    if (m_type_sp)
15457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        return m_type_sp->GetNumChildren(true);
15557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    const bool omit_empty_base_classes = true;
15652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return m_clang_type.GetNumChildren (omit_empty_base_classes);
157e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
158e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
159fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
160e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::GetByteSize()
161e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
16257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    if (m_type_sp)
16357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        return m_type_sp->GetByteSize();
16452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return m_clang_type.GetByteSize ();
165e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
166e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
167e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueType
168e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::GetValueType() const
169e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
170e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // RETHINK: Should this be inherited from somewhere?
171e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return lldb::eValueTypeVariableGlobal;
172e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
173e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
174e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghambool
175e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::UpdateValue ()
176e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
177e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    SetValueIsValid (false);
178e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_error.Clear();
179e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
180b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    ExecutionContext exe_ctx (GetExecutionContextRef());
181e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
182567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
183567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
184e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
185567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_data.SetByteOrder(target->GetArchitecture().GetByteOrder());
186567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
187e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
188e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
189e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    Value old_value(m_value);
190e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_address.IsValid())
191e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
192e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        Value::ValueType value_type = m_value.GetValueType();
193e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
194e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        switch (value_type)
195e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
196e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        default:
197e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            assert(!"Unhandled expression result value kind...");
198e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            break;
199e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
200e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        case Value::eValueTypeScalar:
201e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // The variable value is in the Scalar value inside the m_value.
202e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // We can point our m_data right to it.
20352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            m_error = m_value.GetValueAsData (&exe_ctx, m_data, 0, GetModule().get());
204e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            break;
205e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
206e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        case Value::eValueTypeFileAddress:
207e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        case Value::eValueTypeLoadAddress:
208e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        case Value::eValueTypeHostAddress:
209e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // The DWARF expression result was an address in the inferior
210e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // process. If this variable is an aggregate type, we just need
211e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // the address as the main value as all child variable objects
212e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // will rely upon this location and add an offset and then read
213e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // their own values as needed. If this variable is a simple
214e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // type, we read all data for it into m_data.
215e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // Make sure this type has a value before we try and read it
216e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
217e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            // If we have a file address, convert it to a load address if we can.
218567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (value_type == Value::eValueTypeFileAddress && exe_ctx.GetProcessPtr())
219e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
220567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = m_address.GetLoadAddress(target);
221e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                if (load_addr != LLDB_INVALID_ADDRESS)
222e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                {
223e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                    m_value.SetValueType(Value::eValueTypeLoadAddress);
224e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                    m_value.GetScalar() = load_addr;
225e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                }
226e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
227e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
22852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetClangType().IsAggregateType())
229e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
230e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // this value object represents an aggregate type whose
231e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // children have values, but this object does not. So we
232e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // say we are changed if our location has changed.
233e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                SetValueDidChange (value_type != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar());
234e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
235e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            else
236e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
237e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // Copy the Value and set the context to use our Variable
238e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // so it can extract read its value into m_data appropriately
239e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                Value value(m_value);
24057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                if (m_type_sp)
24157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                    value.SetContext(Value::eContextTypeLLDBType, m_type_sp.get());
24257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                else
24352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
24452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    //value.SetContext(Value::eContextTypeClangType, m_clang_type.GetOpaqueQualType());
24552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    value.SetClangType(m_clang_type);
24652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
24757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
24852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_error = value.GetValueAsData(&exe_ctx, m_data, 0, GetModule().get());
249e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
250e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            break;
251e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
252e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
253e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        SetValueIsValid (m_error.Success());
254e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
255e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_error.Success();
256e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
257e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
258e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
259e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
260e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghambool
261e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectMemory::IsInScope ()
262e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
263e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // FIXME: Maybe try to read the memory address, and if that works, then
264e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // we are in scope?
265e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return true;
266e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
267e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
268801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
2693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonlldb::ModuleSP
270801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonValueObjectMemory::GetModule()
271801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
2723508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    return m_address.GetModule();
273801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
274801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
275801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
276