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