ValueObjectDynamicValue.cpp revision fe6dc6e241c52822710380cec0931351a1d7b2d3
1e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham//===-- ValueObjectDynamicValue.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/ValueObjectDynamicValue.h"
12e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
13e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// C Includes
14e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// C++ Includes
15e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// Other libraries and framework includes
16e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham// Project includes
177b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata#include "lldb/Core/Log.h"
18e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/Module.h"
19e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectList.h"
20e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/Value.h"
21e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObject.h"
22e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2389fda00f52b06b1cfe994c0320a04562b8cc1144Enrico Granata#include "lldb/Symbol/ClangASTType.h"
24e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/ObjectFile.h"
25e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/SymbolContext.h"
26e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/Type.h"
27e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Symbol/Variable.h"
28e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
29e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/ExecutionContext.h"
30e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/LanguageRuntime.h"
31e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/Process.h"
32e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/RegisterContext.h"
33e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/Target.h"
34e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Target/Thread.h"
35e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
36e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamusing namespace lldb_private;
37e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
3810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObjectDynamicValue::ValueObjectDynamicValue (ValueObject &parent, lldb::DynamicValueType use_dynamic) :
39e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    ValueObject(parent),
40e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_address (),
411a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    m_dynamic_type_info(),
4210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    m_use_dynamic (use_dynamic)
43e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
44979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    SetName (parent.GetName());
45e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
46e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
47e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectDynamicValue::~ValueObjectDynamicValue()
48e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
49e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_owning_valobj_sp.reset();
50e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
51e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
52e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::clang_type_t
53931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectDynamicValue::GetClangTypeImpl ()
54e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
551a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (m_dynamic_type_info.HasTypeSP())
56e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_value.GetClangType();
57e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    else
58e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_parent->GetClangType();
59e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
60e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
61e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamConstString
62e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectDynamicValue::GetTypeName()
63e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
64afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    const bool success = UpdateValueIfNeeded(false);
651a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (success)
661a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    {
671a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        if (m_dynamic_type_info.HasTypeSP())
681a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            return ClangASTType::GetConstTypeName (GetClangAST(), GetClangType());
691a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        if (m_dynamic_type_info.HasName())
701a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            return m_dynamic_type_info.GetName();
711a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    }
721a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    return m_parent->GetTypeName();
731a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata}
741a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
751a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico GranataConstString
761a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico GranataValueObjectDynamicValue::GetQualifiedTypeName()
771a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata{
781a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    const bool success = UpdateValueIfNeeded(false);
791a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (success)
801a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    {
811a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        if (m_dynamic_type_info.HasTypeSP())
821a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            return ClangASTType::GetConstQualifiedTypeName (GetClangAST(), GetClangType());
831a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        if (m_dynamic_type_info.HasName())
841a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            return m_dynamic_type_info.GetName();
851a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    }
861a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    return m_parent->GetTypeName();
87e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
88e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
8936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
90e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectDynamicValue::CalculateNumChildren()
91e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
92afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    const bool success = UpdateValueIfNeeded(false);
931a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (success && m_dynamic_type_info.HasTypeSP())
94e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return ClangASTContext::GetNumChildren (GetClangAST (), GetClangType(), true);
95e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    else
96e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_parent->GetNumChildren();
97e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
98e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
99e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamclang::ASTContext *
100931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectDynamicValue::GetClangASTImpl ()
101e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
102886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    const bool success = UpdateValueIfNeeded(false);
1031a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (success && m_dynamic_type_info.HasTypeSP())
1041a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        return m_dynamic_type_info.GetTypeSP()->GetClangAST();
105e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    else
106e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_parent->GetClangAST ();
107e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
108e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
109fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
110e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectDynamicValue::GetByteSize()
111e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
112afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    const bool success = UpdateValueIfNeeded(false);
1131a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (success && m_dynamic_type_info.HasTypeSP())
114e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_value.GetValueByteSize(GetClangAST(), NULL);
115e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    else
116e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_parent->GetByteSize();
117e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
118e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
119e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueType
120e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectDynamicValue::GetValueType() const
121e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
122e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_parent->GetValueType();
123e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
124e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
125e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghambool
126e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectDynamicValue::UpdateValue ()
127e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
128e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    SetValueIsValid (false);
129e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_error.Clear();
130e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
131afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!m_parent->UpdateValueIfNeeded(false))
132e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
13382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        // The dynamic value failed to get an error, pass the error along
13482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (m_error.Success() && m_parent->GetError().Fail())
13582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            m_error = m_parent->GetError();
136e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return false;
137e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
138e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
13910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    // Setting our type_sp to NULL will route everything back through our
14010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    // parent which is equivalent to not using dynamic values.
14110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (m_use_dynamic == lldb::eNoDynamicValues)
14210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    {
1431a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        m_dynamic_type_info.Clear();
14410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return true;
14510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    }
14610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
147b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    ExecutionContext exe_ctx (GetExecutionContextRef());
148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
150e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_data.SetByteOrder(target->GetArchitecture().GetByteOrder());
152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
153e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
154e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
155e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // First make sure our Type and/or Address haven't changed:
156b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    Process *process = exe_ctx.GetProcessPtr();
157e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (!process)
158e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return false;
159e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
160ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName class_type_or_name;
161e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    Address dynamic_address;
162e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    bool found_dynamic_type = false;
163e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
164e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    lldb::LanguageType known_type = m_parent->GetObjectRuntimeLanguage();
165e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC)
166e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
167e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        LanguageRuntime *runtime = process->GetLanguageRuntime (known_type);
168e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (runtime)
16910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            found_dynamic_type = runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address);
170e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
171e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    else
172e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
173e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus);
174e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (cpp_runtime)
17510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            found_dynamic_type = cpp_runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address);
176e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
177e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (!found_dynamic_type)
178e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
179e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC);
180e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (objc_runtime)
181441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                found_dynamic_type = objc_runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address);
182e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
183e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
184e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
185ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    // Getting the dynamic value may have run the program a bit, and so marked us as needing updating, but we really
186ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    // don't...
187ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
188ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_update_point.SetUpdated();
189ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
190e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // If we don't have a dynamic type, then make ourselves just a echo of our parent.
191e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // Or we could return false, and make ourselves an echo of our parent?
192e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (!found_dynamic_type)
193e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
1941a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        if (m_dynamic_type_info)
195c62ef466210da83678b668c7585b8d67fa63379bEnrico Granata            SetValueDidChange(true);
196341c311a62f23f9810f1f6ee2a41d348df5d1d95Enrico Granata        ClearDynamicTypeInformation();
1971a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        m_dynamic_type_info.Clear();
198e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        m_value = m_parent->GetValue();
1993508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        m_error = m_value.GetValueAsData (&exe_ctx, GetClangAST(), m_data, 0, GetModule().get());
200e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_error.Success();
201e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
202e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
203e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    Value old_value(m_value);
204e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2057b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
2067b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata
2073d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata    bool has_changed_type = false;
2083d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata
2091a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (!m_dynamic_type_info)
210e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
2111a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        m_dynamic_type_info = class_type_or_name;
2123d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata        has_changed_type = true;
213e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
2141a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    else if (class_type_or_name != m_dynamic_type_info)
215e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
216e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // We are another type, we need to tear down our children...
2171a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        m_dynamic_type_info = class_type_or_name;
218e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        SetValueDidChange (true);
2193d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata        has_changed_type = true;
220e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
221e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2223d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata    if (has_changed_type)
2233d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata        ClearDynamicTypeInformation ();
2243d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata
225e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (!m_address.IsValid() || m_address != dynamic_address)
226e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
227e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (m_address.IsValid())
228e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            SetValueDidChange (true);
229e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
230e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // We've moved, so we should be fine...
231e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        m_address = dynamic_address;
232b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        lldb::TargetSP target_sp (GetTargetSP());
233b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        lldb::addr_t load_address = m_address.GetLoadAddress(target_sp.get());
234e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        m_value.GetScalar() = load_address;
235e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
236e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2371a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    lldb::clang_type_t corrected_type;
2381a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (m_dynamic_type_info.HasTypeSP())
2391a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    {
2401a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        // The type will always be the type of the dynamic object.  If our parent's type was a pointer,
2411a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        // then our type should be a pointer to the type of the dynamic object.  If a reference, then the original type
2421a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        // should be okay...
2431a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        lldb::clang_type_t orig_type;
2441a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        clang::ASTContext* ast;
2451a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        orig_type = m_dynamic_type_info.GetTypeSP()->GetClangForwardType();
2461a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        ast = m_dynamic_type_info.GetTypeSP()->GetClangAST();
2471a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        corrected_type = orig_type;
2481a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        if (m_parent->IsPointerType())
2491a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            corrected_type = ClangASTContext::CreatePointerType (ast, orig_type);
2501a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        else if (m_parent->IsPointerOrReferenceType())
2511a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            corrected_type = ClangASTContext::CreateLValueReferenceType (ast, orig_type);
2521a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    }
2531a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    else /*if (m_dynamic_type_info.HasName())*/
2541a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    {
2551a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        // If we are here we need to adjust our dynamic type name to include the correct & or * symbol
2561a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        std::string type_name_buf (m_dynamic_type_info.GetName().GetCString());
2571a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        if (m_parent->IsPointerType())
2581a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            type_name_buf.append(" *");
2591a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        else if (m_parent->IsPointerOrReferenceType())
2601a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata            type_name_buf.append(" &");
2611a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        corrected_type = m_parent->GetClangType();
2621a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        m_dynamic_type_info.SetName(type_name_buf.c_str());
2631a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    }
2641a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
265e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_value.SetContext (Value::eContextTypeClangType, corrected_type);
266e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
267e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // Our address is the location of the dynamic type stored in memory.  It isn't a load address,
268e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // because we aren't pointing to the LOCATION that stores the pointer to us, we're pointing to us...
269e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_value.SetValueType(Value::eValueTypeScalar);
270e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2713d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata    if (has_changed_type && log)
2723d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata        log->Printf("[%s %p] has a new dynamic type %s",
2733d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata                    GetName().GetCString(),
2743d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata                    this,
2753d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata                    GetTypeName().GetCString());
2763d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata
2771a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    if (m_address.IsValid() && m_dynamic_type_info)
278e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
279e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // The variable value is in the Scalar value inside the m_value.
280e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // We can point our m_data right to it.
2813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        m_error = m_value.GetValueAsData (&exe_ctx, GetClangAST(), m_data, 0, GetModule().get());
282e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (m_error.Success())
283e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
284e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (ClangASTContext::IsAggregateType (GetClangType()))
285e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
286e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // this value object represents an aggregate type whose
287e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // children have values, but this object does not. So we
288e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                // say we are changed if our location has changed.
289e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                SetValueDidChange (m_value.GetValueType() != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar());
290e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
291e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
292e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            SetValueIsValid (true);
293e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return true;
294e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
295e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
296e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
297e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // We get here if we've failed above...
298e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    SetValueIsValid (false);
299e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return false;
300e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
301e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
302e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
303e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
304e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghambool
305e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim InghamValueObjectDynamicValue::IsInScope ()
306e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
307e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_parent->IsInScope();
308e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
309e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
310651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granatabool
311651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico GranataValueObjectDynamicValue::SetValueFromCString (const char *value_str, Error& error)
312651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata{
313651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    if (!UpdateValueIfNeeded(false))
314651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    {
315651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        error.SetErrorString("unable to read value");
316651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        return false;
317651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    }
318651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata
319651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
320651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
321651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata
322651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    if (my_value == UINT64_MAX || parent_value == UINT64_MAX)
323651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    {
324651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        error.SetErrorString("unable to read value");
325651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        return false;
326651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    }
327651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata
328651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    // if we are at an offset from our parent, in order to set ourselves correctly we would need
329651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    // to change the new value so that it refers to the correct dynamic type. we choose not to deal
330651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    // with that - if anything more than a value overwrite is required, you should be using the
331651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    // expression parser instead of the value editing facility
332651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    if (my_value != parent_value)
333651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    {
334651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        // but NULL'ing out a value should always be allowed
335651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        if (strcmp(value_str,"0"))
336651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        {
337651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata            error.SetErrorString("unable to modify dynamic value, use 'expression' command");
338651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata            return false;
339651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata        }
340651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    }
341651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata
342651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    bool ret_val = m_parent->SetValueFromCString(value_str,error);
343651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    SetNeedsUpdate();
344651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    return ret_val;
345651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata}
346