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