1*696bd635SAlexander Shaposhnikov //===-- ValueObjectCast.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 #include "lldb/Core/ValueObjectCast.h" 1121fd13f9SEnrico Granata 1221fd13f9SEnrico Granata // C Includes 1321fd13f9SEnrico Granata // C++ Includes 1421fd13f9SEnrico Granata // Other libraries and framework includes 1521fd13f9SEnrico Granata // Project includes 1621fd13f9SEnrico Granata #include "lldb/Core/Log.h" 1721fd13f9SEnrico Granata #include "lldb/Core/Module.h" 1821fd13f9SEnrico Granata #include "lldb/Core/Value.h" 1921fd13f9SEnrico Granata #include "lldb/Core/ValueObject.h" 20b9c1b51eSKate Stone #include "lldb/Core/ValueObjectList.h" 2121fd13f9SEnrico Granata 22a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h" 2321fd13f9SEnrico Granata #include "lldb/Symbol/ObjectFile.h" 2421fd13f9SEnrico Granata #include "lldb/Symbol/SymbolContext.h" 2521fd13f9SEnrico Granata #include "lldb/Symbol/Type.h" 2621fd13f9SEnrico Granata #include "lldb/Symbol/Variable.h" 2721fd13f9SEnrico Granata 2821fd13f9SEnrico Granata #include "lldb/Target/ExecutionContext.h" 2921fd13f9SEnrico Granata #include "lldb/Target/Process.h" 3021fd13f9SEnrico Granata #include "lldb/Target/RegisterContext.h" 3121fd13f9SEnrico Granata #include "lldb/Target/Target.h" 3221fd13f9SEnrico Granata #include "lldb/Target/Thread.h" 3321fd13f9SEnrico Granata 3421fd13f9SEnrico Granata using namespace lldb_private; 3521fd13f9SEnrico Granata 36b9c1b51eSKate Stone lldb::ValueObjectSP ValueObjectCast::Create(ValueObject &parent, 3721fd13f9SEnrico Granata const ConstString &name, 38b9c1b51eSKate Stone const CompilerType &cast_type) { 39b9c1b51eSKate Stone ValueObjectCast *cast_valobj_ptr = 40b9c1b51eSKate Stone new ValueObjectCast(parent, name, cast_type); 4121fd13f9SEnrico Granata return cast_valobj_ptr->GetSP(); 4221fd13f9SEnrico Granata } 4321fd13f9SEnrico Granata 44b9c1b51eSKate Stone ValueObjectCast::ValueObjectCast(ValueObject &parent, const ConstString &name, 45b9c1b51eSKate Stone const CompilerType &cast_type) 46b9c1b51eSKate Stone : ValueObject(parent), m_cast_type(cast_type) { 4721fd13f9SEnrico Granata SetName(name); 48b9c1b51eSKate Stone // m_value.SetContext (Value::eContextTypeClangType, 49b9c1b51eSKate Stone // cast_type.GetOpaqueQualType()); 5099558cc4SGreg Clayton m_value.SetCompilerType(cast_type); 5121fd13f9SEnrico Granata } 5221fd13f9SEnrico Granata 53b9c1b51eSKate Stone ValueObjectCast::~ValueObjectCast() {} 5421fd13f9SEnrico Granata 55b9c1b51eSKate Stone CompilerType ValueObjectCast::GetCompilerTypeImpl() { return m_cast_type; } 5621fd13f9SEnrico Granata 57b9c1b51eSKate Stone size_t ValueObjectCast::CalculateNumChildren(uint32_t max) { 589ac7a6c5SSiva Chandra auto children_count = GetCompilerType().GetNumChildren(true); 599ac7a6c5SSiva Chandra return children_count <= max ? children_count : max; 6021fd13f9SEnrico Granata } 6121fd13f9SEnrico Granata 62b9c1b51eSKate Stone uint64_t ValueObjectCast::GetByteSize() { 6395438038SEnrico Granata ExecutionContext exe_ctx(GetExecutionContextRef()); 6495438038SEnrico Granata return m_value.GetValueByteSize(nullptr, &exe_ctx); 6521fd13f9SEnrico Granata } 6621fd13f9SEnrico Granata 67b9c1b51eSKate Stone lldb::ValueType ValueObjectCast::GetValueType() const { 6821fd13f9SEnrico Granata // Let our parent answer global, local, argument, etc... 6921fd13f9SEnrico Granata return m_parent->GetValueType(); 7021fd13f9SEnrico Granata } 7121fd13f9SEnrico Granata 72b9c1b51eSKate Stone bool ValueObjectCast::UpdateValue() { 7321fd13f9SEnrico Granata SetValueIsValid(false); 7421fd13f9SEnrico Granata m_error.Clear(); 7521fd13f9SEnrico Granata 76b9c1b51eSKate Stone if (m_parent->UpdateValueIfNeeded(false)) { 7721fd13f9SEnrico Granata Value old_value(m_value); 7821fd13f9SEnrico Granata m_update_point.SetUpdated(); 7921fd13f9SEnrico Granata m_value = m_parent->GetValue(); 803ad353f3SBruce Mitchener CompilerType compiler_type(GetCompilerType()); 813ad353f3SBruce Mitchener // m_value.SetContext (Value::eContextTypeClangType, compiler_type); 823ad353f3SBruce Mitchener m_value.SetCompilerType(compiler_type); 8321fd13f9SEnrico Granata SetAddressTypeOfChildren(m_parent->GetAddressTypeOfChildren()); 84b9c1b51eSKate Stone if (!CanProvideValue()) { 8521fd13f9SEnrico Granata // this value object represents an aggregate type whose 8621fd13f9SEnrico Granata // children have values, but this object does not. So we 8721fd13f9SEnrico Granata // say we are changed if our location has changed. 88b9c1b51eSKate Stone SetValueDidChange(m_value.GetValueType() != old_value.GetValueType() || 89b9c1b51eSKate Stone m_value.GetScalar() != old_value.GetScalar()); 9021fd13f9SEnrico Granata } 9121fd13f9SEnrico Granata ExecutionContext exe_ctx(GetExecutionContextRef()); 9257ee3067SGreg Clayton m_error = m_value.GetValueAsData(&exe_ctx, m_data, 0, GetModule().get()); 9321fd13f9SEnrico Granata SetValueDidChange(m_parent->GetValueDidChange()); 9421fd13f9SEnrico Granata return true; 9521fd13f9SEnrico Granata } 9621fd13f9SEnrico Granata 9721fd13f9SEnrico Granata // The dynamic value failed to get an error, pass the error along 9821fd13f9SEnrico Granata if (m_error.Success() && m_parent->GetError().Fail()) 9921fd13f9SEnrico Granata m_error = m_parent->GetError(); 10021fd13f9SEnrico Granata SetValueIsValid(false); 10121fd13f9SEnrico Granata return false; 10221fd13f9SEnrico Granata } 10321fd13f9SEnrico Granata 104b9c1b51eSKate Stone bool ValueObjectCast::IsInScope() { return m_parent->IsInScope(); } 105