121fd13f9SEnrico Granata //===-- ValueObjectDynamicValue.cpp ---------------------------------*- C++ -*-===// 221fd13f9SEnrico Granata // 321fd13f9SEnrico Granata // The LLVM Compiler Infrastructure 421fd13f9SEnrico Granata // 521fd13f9SEnrico Granata // This file is distributed under the University of Illinois Open Source 621fd13f9SEnrico Granata // License. See LICENSE.TXT for details. 721fd13f9SEnrico Granata // 821fd13f9SEnrico Granata //===----------------------------------------------------------------------===// 921fd13f9SEnrico Granata 1021fd13f9SEnrico Granata 1121fd13f9SEnrico Granata #include "lldb/Core/ValueObjectCast.h" 1221fd13f9SEnrico Granata 1321fd13f9SEnrico Granata // C Includes 1421fd13f9SEnrico Granata // C++ Includes 1521fd13f9SEnrico Granata // Other libraries and framework includes 1621fd13f9SEnrico Granata // Project includes 1721fd13f9SEnrico Granata #include "lldb/Core/Log.h" 1821fd13f9SEnrico Granata #include "lldb/Core/Module.h" 1921fd13f9SEnrico Granata #include "lldb/Core/ValueObjectList.h" 2021fd13f9SEnrico Granata #include "lldb/Core/Value.h" 2121fd13f9SEnrico Granata #include "lldb/Core/ValueObject.h" 2221fd13f9SEnrico Granata 2321fd13f9SEnrico Granata #include "lldb/Symbol/ClangASTType.h" 2421fd13f9SEnrico Granata #include "lldb/Symbol/ObjectFile.h" 2521fd13f9SEnrico Granata #include "lldb/Symbol/SymbolContext.h" 2621fd13f9SEnrico Granata #include "lldb/Symbol/Type.h" 2721fd13f9SEnrico Granata #include "lldb/Symbol/Variable.h" 2821fd13f9SEnrico Granata 2921fd13f9SEnrico Granata #include "lldb/Target/ExecutionContext.h" 3021fd13f9SEnrico Granata #include "lldb/Target/LanguageRuntime.h" 3121fd13f9SEnrico Granata #include "lldb/Target/Process.h" 3221fd13f9SEnrico Granata #include "lldb/Target/RegisterContext.h" 3321fd13f9SEnrico Granata #include "lldb/Target/Target.h" 3421fd13f9SEnrico Granata #include "lldb/Target/Thread.h" 3521fd13f9SEnrico Granata 3621fd13f9SEnrico Granata using namespace lldb_private; 3721fd13f9SEnrico Granata 3821fd13f9SEnrico Granata lldb::ValueObjectSP 3921fd13f9SEnrico Granata ValueObjectCast::Create (ValueObject &parent, 4021fd13f9SEnrico Granata const ConstString &name, 4121fd13f9SEnrico Granata const ClangASTType &cast_type) 4221fd13f9SEnrico Granata { 4321fd13f9SEnrico Granata ValueObjectCast *cast_valobj_ptr = new ValueObjectCast (parent, name, cast_type); 4421fd13f9SEnrico Granata return cast_valobj_ptr->GetSP(); 4521fd13f9SEnrico Granata } 4621fd13f9SEnrico Granata 4721fd13f9SEnrico Granata ValueObjectCast::ValueObjectCast 4821fd13f9SEnrico Granata ( 4921fd13f9SEnrico Granata ValueObject &parent, 5021fd13f9SEnrico Granata const ConstString &name, 5121fd13f9SEnrico Granata const ClangASTType &cast_type 5221fd13f9SEnrico Granata ) : 5321fd13f9SEnrico Granata ValueObject(parent), 5421fd13f9SEnrico Granata m_cast_type (cast_type) 5521fd13f9SEnrico Granata { 5621fd13f9SEnrico Granata SetName (name); 5757ee3067SGreg Clayton //m_value.SetContext (Value::eContextTypeClangType, cast_type.GetOpaqueQualType()); 5857ee3067SGreg Clayton m_value.SetClangType (cast_type); 5921fd13f9SEnrico Granata } 6021fd13f9SEnrico Granata 6121fd13f9SEnrico Granata ValueObjectCast::~ValueObjectCast() 6221fd13f9SEnrico Granata { 6321fd13f9SEnrico Granata } 6421fd13f9SEnrico Granata 6557ee3067SGreg Clayton ClangASTType 6621fd13f9SEnrico Granata ValueObjectCast::GetClangTypeImpl () 6721fd13f9SEnrico Granata { 6857ee3067SGreg Clayton return m_cast_type; 6921fd13f9SEnrico Granata } 7021fd13f9SEnrico Granata 71c7bece56SGreg Clayton size_t 7221fd13f9SEnrico Granata ValueObjectCast::CalculateNumChildren() 7321fd13f9SEnrico Granata { 7457ee3067SGreg Clayton return GetClangType().GetNumChildren (true); 7521fd13f9SEnrico Granata } 7621fd13f9SEnrico Granata 77faac1118SGreg Clayton uint64_t 7821fd13f9SEnrico Granata ValueObjectCast::GetByteSize() 7921fd13f9SEnrico Granata { 8057ee3067SGreg Clayton return m_value.GetValueByteSize(NULL); 8121fd13f9SEnrico Granata } 8221fd13f9SEnrico Granata 8321fd13f9SEnrico Granata lldb::ValueType 8421fd13f9SEnrico Granata ValueObjectCast::GetValueType() const 8521fd13f9SEnrico Granata { 8621fd13f9SEnrico Granata // Let our parent answer global, local, argument, etc... 8721fd13f9SEnrico Granata return m_parent->GetValueType(); 8821fd13f9SEnrico Granata } 8921fd13f9SEnrico Granata 9021fd13f9SEnrico Granata bool 9121fd13f9SEnrico Granata ValueObjectCast::UpdateValue () 9221fd13f9SEnrico Granata { 9321fd13f9SEnrico Granata SetValueIsValid (false); 9421fd13f9SEnrico Granata m_error.Clear(); 9521fd13f9SEnrico Granata 9621fd13f9SEnrico Granata if (m_parent->UpdateValueIfNeeded(false)) 9721fd13f9SEnrico Granata { 9821fd13f9SEnrico Granata Value old_value(m_value); 9921fd13f9SEnrico Granata m_update_point.SetUpdated(); 10021fd13f9SEnrico Granata m_value = m_parent->GetValue(); 10157ee3067SGreg Clayton ClangASTType clang_type (GetClangType()); 10257ee3067SGreg Clayton //m_value.SetContext (Value::eContextTypeClangType, clang_type); 10357ee3067SGreg Clayton m_value.SetClangType (clang_type); 10421fd13f9SEnrico Granata SetAddressTypeOfChildren(m_parent->GetAddressTypeOfChildren()); 105*d07cfd3aSEnrico Granata if (!CanProvideValue()) 10621fd13f9SEnrico Granata { 10721fd13f9SEnrico Granata // this value object represents an aggregate type whose 10821fd13f9SEnrico Granata // children have values, but this object does not. So we 10921fd13f9SEnrico Granata // say we are changed if our location has changed. 11021fd13f9SEnrico Granata SetValueDidChange (m_value.GetValueType() != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar()); 11121fd13f9SEnrico Granata } 11221fd13f9SEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 11357ee3067SGreg Clayton m_error = m_value.GetValueAsData(&exe_ctx, m_data, 0, GetModule().get()); 11421fd13f9SEnrico Granata SetValueDidChange (m_parent->GetValueDidChange()); 11521fd13f9SEnrico Granata return true; 11621fd13f9SEnrico Granata } 11721fd13f9SEnrico Granata 11821fd13f9SEnrico Granata // The dynamic value failed to get an error, pass the error along 11921fd13f9SEnrico Granata if (m_error.Success() && m_parent->GetError().Fail()) 12021fd13f9SEnrico Granata m_error = m_parent->GetError(); 12121fd13f9SEnrico Granata SetValueIsValid (false); 12221fd13f9SEnrico Granata return false; 12321fd13f9SEnrico Granata } 12421fd13f9SEnrico Granata 12521fd13f9SEnrico Granata bool 12621fd13f9SEnrico Granata ValueObjectCast::IsInScope () 12721fd13f9SEnrico Granata { 12821fd13f9SEnrico Granata return m_parent->IsInScope(); 12921fd13f9SEnrico Granata } 130