1254721Semaste//===-- ValueObjectConstResult.cpp ------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Core/ValueObjectConstResult.h" 11254721Semaste 12254721Semaste#include "lldb/Core/ValueObjectChild.h" 13254721Semaste#include "lldb/Core/ValueObjectConstResultChild.h" 14254721Semaste#include "lldb/Core/DataExtractor.h" 15254721Semaste#include "lldb/Core/Module.h" 16254721Semaste#include "lldb/Core/ValueObjectDynamicValue.h" 17254721Semaste#include "lldb/Core/ValueObjectList.h" 18254721Semaste 19254721Semaste#include "lldb/Symbol/ClangASTType.h" 20254721Semaste#include "lldb/Symbol/ObjectFile.h" 21254721Semaste#include "lldb/Symbol/SymbolContext.h" 22254721Semaste#include "lldb/Symbol/Type.h" 23254721Semaste#include "lldb/Symbol/Variable.h" 24254721Semaste 25254721Semaste#include "lldb/Target/ExecutionContext.h" 26254721Semaste#include "lldb/Target/Process.h" 27254721Semaste#include "lldb/Target/Target.h" 28254721Semaste 29254721Semasteusing namespace lldb; 30254721Semasteusing namespace lldb_private; 31254721Semaste 32254721SemasteValueObjectSP 33254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope, 34254721Semaste ByteOrder byte_order, 35254721Semaste uint32_t addr_byte_size, 36254721Semaste lldb::addr_t address) 37254721Semaste{ 38254721Semaste return (new ValueObjectConstResult (exe_scope, 39254721Semaste byte_order, 40254721Semaste addr_byte_size, 41254721Semaste address))->GetSP(); 42254721Semaste} 43254721Semaste 44254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope, 45254721Semaste ByteOrder byte_order, 46254721Semaste uint32_t addr_byte_size, 47254721Semaste lldb::addr_t address) : 48254721Semaste ValueObject (exe_scope), 49254721Semaste m_type_name (), 50254721Semaste m_byte_size (0), 51254721Semaste m_impl(this, address) 52254721Semaste{ 53254721Semaste SetIsConstant (); 54254721Semaste SetValueIsValid(true); 55254721Semaste m_data.SetByteOrder(byte_order); 56254721Semaste m_data.SetAddressByteSize(addr_byte_size); 57254721Semaste SetAddressTypeOfChildren(eAddressTypeLoad); 58254721Semaste} 59254721Semaste 60254721SemasteValueObjectSP 61254721SemasteValueObjectConstResult::Create 62254721Semaste( 63254721Semaste ExecutionContextScope *exe_scope, 64254721Semaste const ClangASTType &clang_type, 65254721Semaste const ConstString &name, 66254721Semaste const DataExtractor &data, 67254721Semaste lldb::addr_t address 68254721Semaste) 69254721Semaste{ 70254721Semaste return (new ValueObjectConstResult (exe_scope, 71254721Semaste clang_type, 72254721Semaste name, 73254721Semaste data, 74254721Semaste address))->GetSP(); 75254721Semaste} 76254721Semaste 77254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope, 78254721Semaste const ClangASTType &clang_type, 79254721Semaste const ConstString &name, 80254721Semaste const DataExtractor &data, 81254721Semaste lldb::addr_t address) : 82254721Semaste ValueObject (exe_scope), 83254721Semaste m_type_name (), 84254721Semaste m_byte_size (0), 85254721Semaste m_impl(this, address) 86254721Semaste{ 87254721Semaste m_data = data; 88254721Semaste 89254721Semaste if (!m_data.GetSharedDataBuffer()) 90254721Semaste { 91254721Semaste DataBufferSP shared_data_buffer(new DataBufferHeap(data.GetDataStart(), data.GetByteSize())); 92254721Semaste m_data.SetData(shared_data_buffer); 93254721Semaste } 94254721Semaste 95254721Semaste m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); 96254721Semaste m_value.SetValueType(Value::eValueTypeHostAddress); 97254721Semaste m_value.SetClangType(clang_type); 98254721Semaste m_name = name; 99254721Semaste SetIsConstant (); 100254721Semaste SetValueIsValid(true); 101254721Semaste SetAddressTypeOfChildren(eAddressTypeLoad); 102254721Semaste} 103254721Semaste 104254721SemasteValueObjectSP 105254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope, 106254721Semaste const ClangASTType &clang_type, 107254721Semaste const ConstString &name, 108254721Semaste const lldb::DataBufferSP &data_sp, 109254721Semaste lldb::ByteOrder data_byte_order, 110254721Semaste uint32_t data_addr_size, 111254721Semaste lldb::addr_t address) 112254721Semaste{ 113254721Semaste return (new ValueObjectConstResult (exe_scope, 114254721Semaste clang_type, 115254721Semaste name, 116254721Semaste data_sp, 117254721Semaste data_byte_order, 118254721Semaste data_addr_size, 119254721Semaste address))->GetSP(); 120254721Semaste} 121254721Semaste 122254721SemasteValueObjectSP 123254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope, 124254721Semaste Value &value, 125254721Semaste const ConstString &name) 126254721Semaste{ 127254721Semaste return (new ValueObjectConstResult (exe_scope, value, name))->GetSP(); 128254721Semaste} 129254721Semaste 130254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope, 131254721Semaste const ClangASTType &clang_type, 132254721Semaste const ConstString &name, 133254721Semaste const lldb::DataBufferSP &data_sp, 134254721Semaste lldb::ByteOrder data_byte_order, 135254721Semaste uint32_t data_addr_size, 136254721Semaste lldb::addr_t address) : 137254721Semaste ValueObject (exe_scope), 138254721Semaste m_type_name (), 139254721Semaste m_byte_size (0), 140254721Semaste m_impl(this, address) 141254721Semaste{ 142254721Semaste m_data.SetByteOrder(data_byte_order); 143254721Semaste m_data.SetAddressByteSize(data_addr_size); 144254721Semaste m_data.SetData(data_sp); 145254721Semaste m_value.GetScalar() = (uintptr_t)data_sp->GetBytes(); 146254721Semaste m_value.SetValueType(Value::eValueTypeHostAddress); 147254721Semaste //m_value.SetContext(Value::eContextTypeClangType, clang_type); 148254721Semaste m_value.SetClangType (clang_type); 149254721Semaste m_name = name; 150254721Semaste SetIsConstant (); 151254721Semaste SetValueIsValid(true); 152254721Semaste SetAddressTypeOfChildren(eAddressTypeLoad); 153254721Semaste} 154254721Semaste 155254721SemasteValueObjectSP 156254721SemasteValueObjectConstResult::Create (ExecutionContextScope *exe_scope, 157254721Semaste const ClangASTType &clang_type, 158254721Semaste const ConstString &name, 159254721Semaste lldb::addr_t address, 160254721Semaste AddressType address_type, 161254721Semaste uint32_t addr_byte_size) 162254721Semaste{ 163254721Semaste return (new ValueObjectConstResult (exe_scope, 164254721Semaste clang_type, 165254721Semaste name, 166254721Semaste address, 167254721Semaste address_type, 168254721Semaste addr_byte_size))->GetSP(); 169254721Semaste} 170254721Semaste 171254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope, 172254721Semaste const ClangASTType &clang_type, 173254721Semaste const ConstString &name, 174254721Semaste lldb::addr_t address, 175254721Semaste AddressType address_type, 176254721Semaste uint32_t addr_byte_size) : 177254721Semaste ValueObject (exe_scope), 178254721Semaste m_type_name (), 179254721Semaste m_byte_size (0), 180254721Semaste m_impl(this, address) 181254721Semaste{ 182254721Semaste m_value.GetScalar() = address; 183254721Semaste m_data.SetAddressByteSize(addr_byte_size); 184254721Semaste m_value.GetScalar().GetData (m_data, addr_byte_size); 185254721Semaste //m_value.SetValueType(Value::eValueTypeHostAddress); 186254721Semaste switch (address_type) 187254721Semaste { 188254721Semaste case eAddressTypeInvalid: m_value.SetValueType(Value::eValueTypeScalar); break; 189254721Semaste case eAddressTypeFile: m_value.SetValueType(Value::eValueTypeFileAddress); break; 190254721Semaste case eAddressTypeLoad: m_value.SetValueType(Value::eValueTypeLoadAddress); break; 191254721Semaste case eAddressTypeHost: m_value.SetValueType(Value::eValueTypeHostAddress); break; 192254721Semaste } 193254721Semaste// m_value.SetContext(Value::eContextTypeClangType, clang_type); 194254721Semaste m_value.SetClangType (clang_type); 195254721Semaste m_name = name; 196254721Semaste SetIsConstant (); 197254721Semaste SetValueIsValid(true); 198254721Semaste SetAddressTypeOfChildren(eAddressTypeLoad); 199254721Semaste} 200254721Semaste 201254721SemasteValueObjectSP 202254721SemasteValueObjectConstResult::Create 203254721Semaste( 204254721Semaste ExecutionContextScope *exe_scope, 205254721Semaste const Error& error 206254721Semaste) 207254721Semaste{ 208254721Semaste return (new ValueObjectConstResult (exe_scope, 209254721Semaste error))->GetSP(); 210254721Semaste} 211254721Semaste 212254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope, 213254721Semaste const Error& error) : 214254721Semaste ValueObject (exe_scope), 215254721Semaste m_type_name (), 216254721Semaste m_byte_size (0), 217254721Semaste m_impl(this) 218254721Semaste{ 219254721Semaste m_error = error; 220254721Semaste SetIsConstant (); 221254721Semaste} 222254721Semaste 223254721SemasteValueObjectConstResult::ValueObjectConstResult (ExecutionContextScope *exe_scope, 224254721Semaste const Value &value, 225254721Semaste const ConstString &name) : 226254721Semaste ValueObject (exe_scope), 227254721Semaste m_type_name (), 228254721Semaste m_byte_size (0), 229254721Semaste m_impl(this) 230254721Semaste{ 231254721Semaste m_value = value; 232254721Semaste m_value.GetData(m_data); 233254721Semaste} 234254721Semaste 235254721SemasteValueObjectConstResult::~ValueObjectConstResult() 236254721Semaste{ 237254721Semaste} 238254721Semaste 239254721SemasteClangASTType 240254721SemasteValueObjectConstResult::GetClangTypeImpl() 241254721Semaste{ 242254721Semaste return m_value.GetClangType(); 243254721Semaste} 244254721Semaste 245254721Semastelldb::ValueType 246254721SemasteValueObjectConstResult::GetValueType() const 247254721Semaste{ 248254721Semaste return eValueTypeConstResult; 249254721Semaste} 250254721Semaste 251254721Semasteuint64_t 252254721SemasteValueObjectConstResult::GetByteSize() 253254721Semaste{ 254254721Semaste if (m_byte_size == 0) 255254721Semaste m_byte_size = GetClangType().GetByteSize(); 256254721Semaste return m_byte_size; 257254721Semaste} 258254721Semaste 259254721Semastevoid 260254721SemasteValueObjectConstResult::SetByteSize (size_t size) 261254721Semaste{ 262254721Semaste m_byte_size = size; 263254721Semaste} 264254721Semaste 265254721Semastesize_t 266254721SemasteValueObjectConstResult::CalculateNumChildren() 267254721Semaste{ 268254721Semaste return GetClangType().GetNumChildren (true); 269254721Semaste} 270254721Semaste 271254721SemasteConstString 272254721SemasteValueObjectConstResult::GetTypeName() 273254721Semaste{ 274254721Semaste if (m_type_name.IsEmpty()) 275254721Semaste m_type_name = GetClangType().GetConstTypeName (); 276254721Semaste return m_type_name; 277254721Semaste} 278254721Semaste 279254721Semastebool 280254721SemasteValueObjectConstResult::UpdateValue () 281254721Semaste{ 282254721Semaste // Const value is always valid 283254721Semaste SetValueIsValid (true); 284254721Semaste return true; 285254721Semaste} 286254721Semaste 287254721Semaste 288254721Semastebool 289254721SemasteValueObjectConstResult::IsInScope () 290254721Semaste{ 291254721Semaste // A const result value is always in scope since it serializes all 292254721Semaste // information needed to contain the constant value. 293254721Semaste return true; 294254721Semaste} 295254721Semaste 296254721Semastelldb::ValueObjectSP 297254721SemasteValueObjectConstResult::Dereference (Error &error) 298254721Semaste{ 299254721Semaste return m_impl.Dereference(error); 300254721Semaste} 301254721Semaste 302254721Semastelldb::ValueObjectSP 303254721SemasteValueObjectConstResult::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create) 304254721Semaste{ 305254721Semaste return m_impl.GetSyntheticChildAtOffset(offset, type, can_create); 306254721Semaste} 307254721Semaste 308254721Semastelldb::ValueObjectSP 309254721SemasteValueObjectConstResult::AddressOf (Error &error) 310254721Semaste{ 311254721Semaste return m_impl.AddressOf(error); 312254721Semaste} 313254721Semaste 314254721Semastelldb::addr_t 315254721SemasteValueObjectConstResult::GetAddressOf (bool scalar_is_load_address, 316254721Semaste AddressType *address_type) 317254721Semaste{ 318254721Semaste return m_impl.GetAddressOf(scalar_is_load_address, address_type); 319254721Semaste} 320254721Semaste 321254721SemasteValueObject * 322254721SemasteValueObjectConstResult::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index) 323254721Semaste{ 324254721Semaste return m_impl.CreateChildAtIndex(idx, synthetic_array_member, synthetic_index); 325254721Semaste} 326254721Semaste 327254721Semastesize_t 328254721SemasteValueObjectConstResult::GetPointeeData (DataExtractor& data, 329254721Semaste uint32_t item_idx, 330254721Semaste uint32_t item_count) 331254721Semaste{ 332254721Semaste return m_impl.GetPointeeData(data, item_idx, item_count); 333254721Semaste} 334254721Semaste 335254721Semastelldb::ValueObjectSP 336254721SemasteValueObjectConstResult::GetDynamicValue (lldb::DynamicValueType use_dynamic) 337254721Semaste{ 338254721Semaste // Always recalculate dynamic values for const results as the memory that 339254721Semaste // they might point to might have changed at any time. 340254721Semaste if (use_dynamic != eNoDynamicValues) 341254721Semaste { 342254721Semaste if (!IsDynamic()) 343254721Semaste { 344254721Semaste ExecutionContext exe_ctx (GetExecutionContextRef()); 345254721Semaste Process *process = exe_ctx.GetProcessPtr(); 346254721Semaste if (process && process->IsPossibleDynamicValue(*this)) 347254721Semaste m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 348254721Semaste } 349254721Semaste if (m_dynamic_value) 350254721Semaste return m_dynamic_value->GetSP(); 351254721Semaste } 352254721Semaste return ValueObjectSP(); 353254721Semaste} 354254721Semaste 355