ValueObject.cpp revision 9db023bd392ede8fc4c92d7dfee64382e08bbd78
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ValueObject.cpp -----------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObject.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 13eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include <stdlib.h> 14eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "llvm/Support/raw_ostream.h" 18b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "clang/AST/Type.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h" 24427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h" 32b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 35eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 46bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonValueObject::ValueObject (ValueObject *parent) : 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (++g_value_obj_uid), // Unique identifier for every value object 48bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton m_parent (parent), 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_update_id (0), // Value object lists always start at 1, value objects start at zero 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name (), 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data (), 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value (), 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error (), 5417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str (), 5517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str (), 5617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_location_str (), 5717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_summary_str (), 584ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str (), 5917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children (), 6017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_synthetic_children (), 6111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_dynamic_value_sp (), 6211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format (eFormatDefault), 6317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid (false), 6417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change (false), 6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid (false), 66427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_old_value_valid (false), 67427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_pointers_point_to_load_addrs (false) 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::~ValueObject () 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruser_id_t 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetUpdateID() const 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_update_id; 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::UpdateValueIfNeeded (ExecutionContextScope *exe_scope) 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 88d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 89d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 90d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 91d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_scope) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process *process = exe_scope->CalculateProcess(); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process) 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const user_id_t stop_id = process->GetStopID(); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_update_id != stop_id) 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton bool first_update = m_update_id == 0; 101ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // Save the old value using swap to avoid a string copy which 102ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // also will clear our m_value_str 10317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (m_value_str.empty()) 10417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 10517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_valid = false; 10617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 10717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton else 10817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 10917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_valid = true; 11017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str.swap (m_value_str); 11117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str.clear(); 11217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.clear(); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_summary_str.clear(); 1154ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.clear(); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton const bool value_was_valid = GetValueIsValid(); 118ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton SetValueDidChange (false); 119ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 120ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton m_error.Clear(); 121ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 122ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // Call the pure virtual function to update the value 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateValue (exe_scope); 124ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 125ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // Update the fact that we tried to update the value for this 126fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton // value object whether or not we succeed 127ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton m_update_id = stop_id; 128ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton bool success = m_error.Success(); 129ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton SetValueIsValid (success); 13017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 13117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (first_update) 13217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (false); 13317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton else if (!m_value_did_change && success == false) 134ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton { 13517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value wasn't gotten successfully, so we mark this 13617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // as changed if the value used to be valid and now isn't 13717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (value_was_valid); 138ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton } 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor & 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () const 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetError() const 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetLocationAsCString (ExecutionContextScope *exe_scope) 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (UpdateValueIfNeeded(exe_scope)) 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value.GetValueType()) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 1846916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterInfo *reg_info = m_value.GetRegisterInfo(); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = "scalar"; 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2; 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 2270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonValueObject::ResolveValue (ExecutionContextScope *exe_scope, Scalar &scalar) 2280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 2290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 2300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton exe_scope->CalculateExecutionContext(exe_ctx); 2310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ()); 2320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return scalar.IsValid(); 2330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 2340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 2350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 23617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 24917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueDidChange (ExecutionContextScope *exe_scope) 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton GetValueAsCString (exe_scope); 25217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create) 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < GetNumChildren()) 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already made the child value object? 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (can_create && m_children[idx].get() == NULL) 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No we haven't created the child at this index, so lets have our 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // subclass do it and cache the result for quick future access. 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children[idx] = CreateChildAtIndex (idx, false, 0); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp = m_children[idx]; 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 285462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2935d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> child_indexes; 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *clang_ast = GetClangAST(); 298462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton void *clang_type = GetClangType(); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang_type, 302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_child_indexes > 0) 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>::const_iterator end = child_indexes.end (); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp = GetChildAtIndex(*pos, can_create); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (++pos; pos != end; ++pos) 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_sp) 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp = new_child_sp; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp.reset(); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_children.size(); 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children.resize(num_children); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name) 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name.SetCString(name); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index) 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP valobj_sp; 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string child_name_str; 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_byte_size = 0; 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t child_byte_offset = 0; 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_bitfield_bit_size = 0; 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_bitfield_bit_offset = 0; 369bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool child_is_base_class = false; 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool transparent_pointers = synthetic_array_member == false; 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *clang_ast = GetClangAST(); 372f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType(); 373f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t child_clang_type; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast, 375427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang_type, 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name_str, 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 384bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 385bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 3869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (child_clang_type && child_byte_size) 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synthetic_index) 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset += child_byte_size * synthetic_index; 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString child_name; 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!child_name_str.empty()) 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.SetCString (child_name_str.c_str()); 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner valobj_sp.reset (new ValueObjectChild (this, 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang_ast, 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_clang_type, 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 402bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 403bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class)); 404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs); 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return valobj_sp; 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSummaryAsCString (ExecutionContextScope *exe_scope) 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (UpdateValueIfNeeded (exe_scope)) 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 417f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType(); 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if this is a pointer to a C string? 42003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton StreamString sstr; 423f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t elem_or_pointee_clang_type; 424f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 425427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetClangAST(), 426427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton &elem_or_pointee_clang_type)); 42703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 428f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 429f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Process *process = exe_scope->CalculateProcess(); 43203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (process != NULL) 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 434f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 43503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::AddressType cstr_address_type = eAddressTypeInvalid; 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 437f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton size_t cstr_len = 0; 438f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (ClangASTContext::eTypeIsArray)) 439f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 440f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have an array 441f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton cstr_len = ClangASTContext::GetArraySize (clang_type); 442f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton cstr_address = GetAddressOf (cstr_address_type, true); 443f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 444f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 446f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer 447f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton cstr_address = GetPointerValue (cstr_address_type, true); 448f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 44903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (cstr_address != LLDB_INVALID_ADDRESS) 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton DataExtractor data; 45203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton size_t bytes_read = 0; 45303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton std::vector<char> data_buffer; 45403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton std::vector<char> cstr_buffer; 45503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton size_t cstr_length; 45603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Error error; 457f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (cstr_len > 0) 45803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 459f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton data_buffer.resize(cstr_len); 46003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton // Resize the formatted buffer in case every character 46103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton // uses the "\xXX" format and one extra byte for a NULL 46203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton cstr_buffer.resize(data_buffer.size() * 4 + 1); 46303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost); 464f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), cstr_len, error); 46503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (bytes_read > 0) 46603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 46703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton sstr << '"'; 46803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton cstr_length = data.Dump (&sstr, 46903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 0, // Start offset in "data" 47003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton eFormatChar, // Print as characters 47103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 1, // Size of item (1 byte for a char!) 47203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton bytes_read, // How many bytes to print? 47303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton UINT32_MAX, // num per line 47403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton LLDB_INVALID_ADDRESS,// base address 47503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 0, // bitfield bit size 47603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 0); // bitfield bit offset 47703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton sstr << '"'; 47803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 47903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 48003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton else 48103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 48203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const size_t k_max_buf_size = 256; 48303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton data_buffer.resize (k_max_buf_size + 1); 48403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton // NULL terminate in case we don't get the entire C string 48503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton data_buffer.back() = '\0'; 48603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton // Make a formatted buffer that can contain take 4 48703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton // bytes per character in case each byte uses the 48803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton // "\xXX" format and one extra byte for a NULL 48903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton cstr_buffer.resize (k_max_buf_size * 4 + 1); 49003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 49103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost); 49203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton size_t total_cstr_len = 0; 49303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0) 49403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 49503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton size_t len = strlen(&data_buffer.front()); 49603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (len == 0) 49703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 49803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (len > bytes_read) 49903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton len = bytes_read; 50003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (sstr.GetSize() == 0) 50103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton sstr << '"'; 50203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 50303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton cstr_length = data.Dump (&sstr, 50403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 0, // Start offset in "data" 50503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton eFormatChar, // Print as characters 50603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 1, // Size of item (1 byte for a char!) 50703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton len, // How many bytes to print? 50803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton UINT32_MAX, // num per line 50903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton LLDB_INVALID_ADDRESS,// base address 51003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 0, // bitfield bit size 51103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 0); // bitfield bit offset 51203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 51303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (len < k_max_buf_size) 51403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 51503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton cstr_address += total_cstr_len; 51603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 51703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (sstr.GetSize() > 0) 51803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton sstr << '"'; 51903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 52303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (sstr.GetSize() > 0) 52403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.assign (sstr.GetData(), sstr.GetSize()); 52503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 52603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton else if (ClangASTContext::IsFunctionPointerType (clang_type)) 52703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 52803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::AddressType func_ptr_address_type = eAddressTypeInvalid; 52903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true); 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (func_ptr_address_type) 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeInvalid: 53603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeFile: 53703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 53803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 53903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeLoad: 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Address so_addr; 542eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton Target *target = exe_scope->CalculateTarget(); 543eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton if (target && target->GetSectionLoadList().IsEmpty() == false) 54403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 545eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 54603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 54703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton so_addr.Dump (&sstr, 54803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton exe_scope, 54903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Address::DumpStyleResolvedDescription, 55003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Address::DumpStyleSectionNameOffset); 55103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 55203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeHost: 55703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 56003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (sstr.GetSize() > 0) 56103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 56203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.assign (1, '('); 56303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.append (sstr.GetData(), sstr.GetSize()); 56403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.append (1, ')'); 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5754ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 5764ae519666628cca07c194bf677163009cc2e5a8bJim InghamValueObject::GetObjectDescription (ExecutionContextScope *exe_scope) 5774ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 5784ae519666628cca07c194bf677163009cc2e5a8bJim Ingham if (!m_object_desc_str.empty()) 5794ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return m_object_desc_str.c_str(); 5804ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 5814ae519666628cca07c194bf677163009cc2e5a8bJim Ingham if (!GetValueIsValid()) 5824ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 5834ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 5844ae519666628cca07c194bf677163009cc2e5a8bJim Ingham Process *process = exe_scope->CalculateProcess(); 585b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 5864ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 587b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 588b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 5894ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 590b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham lldb::LanguageType language = GetObjectRuntimeLanguage(); 591b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 5924ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 5930e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 5940e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 5950e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham // Aw, hell, if the things a pointer, let's try ObjC anyway... 5960e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 5970e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 5980e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 5990e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType()); 6000e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (qual_type->isAnyPointerType()) 6010e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC); 6020e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 6030e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 6040e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 605b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this, exe_scope)) 6064ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 6074ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 6084ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 609e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 610e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 611e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 612e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 613e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 6144ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValueAsCString (ExecutionContextScope *exe_scope) 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If our byte size is zero this is an aggregate type that has children 620462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (ClangASTContext::IsAggregateType (GetClangType()) == false) 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (UpdateValueIfNeeded(exe_scope)) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Value::ContextType context_type = m_value.GetContextType(); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (context_type) 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeClangType: 6316916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeLLDBType: 6326916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeVariable: 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 634f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType (); 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 63811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton if (m_format == eFormatDefault) 63911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format = ClangASTType::GetFormat(clang_type); 64011730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton 64111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton if (ClangASTType::DumpTypeValue (GetClangAST(), // The clang AST 64211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton clang_type, // The clang type to display 64311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton &sstr, 64411730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format, // Format to display this type with 64511730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_data, // Data to extract from 64611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton 0, // Byte offset into "m_data" 64711730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetByteSize(), // Byte size of item in "m_data" 64811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetBitfieldBitSize(), // Bitfield bit size 64911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetBitfieldBitOffset())) // Bitfield bit offset 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(sstr.GetString()); 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.clear(); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeRegisterInfo: 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString reg_sstr; 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.Dump(®_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(reg_sstr.GetString()); 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 66854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 66954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 67054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 67417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_value_did_change && m_old_value_valid) 67517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 67617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value was gotten successfully, so we consider the 67717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // value as changed if the value string differs 67817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (m_old_value_str != m_value_str); 67917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68703e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 688f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonValueObject::GetAddressOf (lldb::AddressType &address_type, bool scalar_is_load_address) 689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 690f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 691f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 692f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 693f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 694f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 695f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeLoad; 696f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 697f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 698f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 699f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 700f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 701f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 702f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 703f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 704f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = m_value.GetValueAddressType (); 705f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 708f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 709f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeInvalid; 710f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 711f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 713f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 71403e0f97cfa469792dd69b36f782d33a014225788Greg ClaytonValueObject::GetPointerValue (lldb::AddressType &address_type, bool scalar_is_load_address) 71503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 71603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t address = LLDB_INVALID_ADDRESS; 71703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeInvalid; 718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 71903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 72003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 72103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (scalar_is_load_address) 72203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 72303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 72403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 72503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 72603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 72703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 72803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 72903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 73003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeHostAddress: 73103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 73203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton uint32_t data_offset = 0; 73303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 73403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = m_value.GetValueAddressType(); 73503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (address_type == eAddressTypeInvalid) 73603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 73703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 73803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 73903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 741427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 742427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton address_type = eAddressTypeLoad; 743427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 74403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 74503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 74603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueFromCString (ExecutionContextScope *exe_scope, const char *value_str) 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!UpdateValueIfNeeded(exe_scope)) 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 756462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *end = NULL; 759bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingInvalid: 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingUint: 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(unsigned long long)) 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned long long ull_val = strtoull(value_str, &end, 0); 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = ull_val; 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingSint: 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(long long)) 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long long sll_val = strtoll(value_str, &end, 0); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = sll_val; 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingIEEE754: 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const off_t byte_offset = GetByteOffset(); 80054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size)); 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst != NULL) 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We are decoding a float into host byte order below, so make 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sure m_data knows what it contains. 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.SetByteOrder(eByteOrderHost); 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetClangAST(), 808462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value_str, 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst, 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size); 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (converted_byte_size == byte_size) 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingVector: 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we have made it here the value is in m_data and we should write it 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // out to the target 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (); 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write () 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the update ID so the next time we try and read the value 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we try and read it again. 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_update_id = 0; 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: when Value has a method to write a value back, call it from here. 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 844b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType 845b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 846b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 847f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t opaque_qual_type = GetClangType(); 848b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (opaque_qual_type == NULL) 849b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 850b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 851b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham // If the type is a reference, then resolve it to what it refers to first: 852b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType()); 853b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isAnyPointerType()) 854b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 855b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isObjCObjectPointerType()) 856b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 857b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 858b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType pointee_type (qual_type->getPointeeType()); 859b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->getCXXRecordDeclForPointerType() != NULL) 860b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 861b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCObjectOrInterfaceType()) 862b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 863b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCClassType()) 864b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 865b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 866b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham else 867b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 868b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (ClangASTContext::IsObjCClassType (opaque_qual_type)) 869b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 870974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen if (ClangASTContext::IsCXXClassType (opaque_qual_type)) 871b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 872b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 873b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 874b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 875b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 876b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::AddSyntheticChild (const ConstString &key, ValueObjectSP& valobj_sp) 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_synthetic_children[key] = valobj_sp; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::map<ConstString, ValueObjectSP>::const_iterator pos = m_synthetic_children.find (key); 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = pos->second; 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 896462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 900f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 904462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerOrReferenceType(GetClangType()); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create) 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(index_str, sizeof(index_str), "[%i]", index); 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = CreateChildAtIndex(0, true, index); 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synthetic_child_sp) 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddSyntheticChild(index_const_str, synthetic_child_sp); 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 932642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 933642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghambool 934642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamValueObject::SetDynamicValue () 935642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 936642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (!IsPointerOrReferenceType()) 937642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return false; 938642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 939642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham // Check that the runtime class is correct for determining the most specific class. 940642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham // If it is a C++ class, see if it is dynamic: 941b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 942642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return true; 943642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 94466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 94566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 94666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 947bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonValueObject::GetExpressionPath (Stream &s) 948bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 949bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (m_parent) 950bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 951bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton m_parent->GetExpressionPath (s); 952bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t parent_clang_type = m_parent->GetClangType(); 953bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (parent_clang_type) 954bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 955bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (ClangASTContext::IsPointerType(parent_clang_type)) 956bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 957bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("->"); 958bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 959bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (ClangASTContext::IsAggregateType (parent_clang_type)) 960bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 961bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (ClangASTContext::IsArrayType (parent_clang_type) == false && 962bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton m_parent->IsBaseClass() == false) 963bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutChar('.'); 964bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 965bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 966bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 967bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 968bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (IsBaseClass()) 969bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 970bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = GetClangType(); 971bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton std::string cxx_class_name; 972bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (ClangASTContext::GetCXXClassName (clang_type, cxx_class_name)) 973bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 974bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s << cxx_class_name.c_str() << "::"; 975bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 976bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 977bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 978bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const char *name = GetName().GetCString(); 980bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (name) 981bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString(name); 982bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 983bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 984bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 985bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid 98666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject 98766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton( 98866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton Stream &s, 98966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ExecutionContextScope *exe_scope, 99066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ValueObject *valobj, 99166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton const char *root_valobj_name, 99266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t ptr_depth, 99366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t curr_depth, 99466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t max_depth, 99566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_types, 99666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_location, 99766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool use_objc, 998bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool scope_already_checked, 999bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool flat_output 100066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton) 100166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 100266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (valobj) 100366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1004bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 1005bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1006f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 1007bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 1008f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 1009f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 1010bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1011bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const bool print_valobj = flat_output == false || has_value; 1012bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1013bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 101466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1015bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (show_location) 1016bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1017bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf("%s: ", valobj->GetLocationAsCString(exe_scope)); 1018bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 101966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1020bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 102166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1022a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton // Always show the type for the top level items. 1023a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton if (show_types || curr_depth == 0) 1024427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>")); 102566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 102666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1027bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 1028bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1029bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton valobj->GetExpressionPath(s); 1030bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString(" ="); 1031bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1032bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1033bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1034bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 1035bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 1036bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1037bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1038bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!scope_already_checked && !valobj->IsInScope(exe_scope->CalculateStackFrame())) 1039bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1040bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = "error: out of scope"; 1041bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 104266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 104366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1044bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 1045bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1046bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 1047bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1048bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton val_cstr = valobj->GetValueAsCString(exe_scope); 1049bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 1050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 105166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 105266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 105366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1054a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton s.Printf (" error: %s\n", err_cstr); 105566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 105666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 105766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 1059bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1060bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1061bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *sum_cstr = valobj->GetSummaryAsCString(exe_scope); 106266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (val_cstr) 1064bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s", val_cstr); 106566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (sum_cstr) 1067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s", sum_cstr); 1068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1069bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (use_objc) 1070bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1071bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *object_desc = valobj->GetObjectDescription(exe_scope); 1072bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 1073bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s\n", object_desc); 1074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1075e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan s.Printf (" [no Objective-C description available]\n"); 1076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 1077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 107866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 107966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 108066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (curr_depth < max_depth) 108166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 1083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 1084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 1085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 1086f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 1087f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1088f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 1089f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 1090f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 1091f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1092f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 1093f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 1094f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 1096f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 1097f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton lldb::AddressType ptr_address_type; 1098f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (valobj->GetPointerValue (ptr_address_type, true) == 0) 1099f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 1100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1101f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 1102f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1103f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 1104f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 1105f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 1106f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 1107f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 1108f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1109f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1110f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 1111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 1112f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 111366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1114f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (print_children) 111566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1116bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const uint32_t num_children = valobj->GetNumChildren(); 1117bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 111866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1119bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 112066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1121bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1122bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 1123bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1124bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1125bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1126bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 11273f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 1128bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 1129bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1130bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1131bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton for (uint32_t idx=0; idx<num_children; ++idx) 1132bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton ValueObjectSP child_sp(valobj->GetChildAtIndex(idx, true)); 1134bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 1135bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1136bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton DumpValueObject (s, 1137bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton exe_scope, 1138bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_sp.get(), 1139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton NULL, 1140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 1141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton curr_depth + 1, 1142bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton max_depth, 1143bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_types, 1144bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_location, 1145bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton false, 1146bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton true, 1147bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton flat_output); 1148bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1149bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1150bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1151bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!flat_output) 1152bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1153bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 1154bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 115566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 115666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 1157bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 1158bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1159bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 1160bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 1162bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1163bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1164bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1165bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1166bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 1167bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1168bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 116966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 1170bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1171bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 117266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 117366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 117466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 117566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 117666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1177bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 117866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1179bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 118066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 118166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 118266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 118366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 118466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 118566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1186427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1187427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 1188427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObject::CreateConstantValue (ExecutionContextScope *exe_scope, const ConstString &name) 1189427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 1191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1192427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (UpdateValueIfNeeded(exe_scope) && m_error.Success()) 1193427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1194427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ExecutionContext exe_ctx; 1195427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_scope->CalculateExecutionContext(exe_ctx); 1196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST (); 1198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton DataExtractor data; 1200427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton data.SetByteOrder (m_data.GetByteOrder()); 1201427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton data.SetAddressByteSize(m_data.GetAddressByteSize()); 1202427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1203427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0); 1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectConstResult (ast, 1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetClangType(), 1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name, 1208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton data)); 1209427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 1211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1212427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectConstResult (m_error)); 1213427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1214427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 1215427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1216427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1217427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP 1218bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 1219427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1220427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ValueObjectSP valobj_sp; 1221c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 1222c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 1223427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1224427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 1225427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 1227427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 1228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 1229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 1230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast, 1237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 1238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 1239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 1240427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 1241427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 1242427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 1243427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 1244427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 1245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 1246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 1247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_is_base_class); 12489db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (child_clang_type && child_byte_offset) 1249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 1251427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 1252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 1253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectChild (this, 1255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_ast, 1256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_clang_type, 1257427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name, 1258427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 1259427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 1260427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 1261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 1262427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_is_base_class)); 1263427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1264427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1265c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1266c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (valobj_sp) 1267c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 1268c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 1269c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 1270427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 1271427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1272c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 1273c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton GetExpressionPath(strm); 1274c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1275c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 1276c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 1277c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 1278c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 1279427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1280427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1281427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 1282427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1284c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton lldb::ValueObjectSP 1285c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 1286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ValueObjectSP valobj_sp; 1288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::AddressType address_type = eAddressTypeInvalid; 1289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 1290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address); 1291c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 1292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 1293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 1295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1296c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 1297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 1298c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 1299c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 1300c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton GetExpressionPath(expr_path_strm); 1301c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 1302c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 1303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 1304c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 1306427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 1307427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 1308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 1310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 1311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 1312427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1313427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 1314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 1315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectConstResult (ast, 1316427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangASTContext::CreatePointerType (ast, clang_type), 1317427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString (name.c_str()), 1318427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton addr, 1319427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton address_type, 1320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_data.GetAddressByteSize())); 1321427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1322427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1326427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 1327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1329