ValueObject.cpp revision 00c3ae7dac4cf9654d1569735c41e58fb2fd8969
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), 6700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton m_pointers_point_to_load_addrs (false), 6800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton m_is_deref_of_parent (false) 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::~ValueObject () 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruser_id_t 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetUpdateID() const 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_update_id; 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::UpdateValueIfNeeded (ExecutionContextScope *exe_scope) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 89d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 90d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 91d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 92d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_scope) 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process *process = exe_scope->CalculateProcess(); 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process) 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const user_id_t stop_id = process->GetStopID(); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_update_id != stop_id) 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton bool first_update = m_update_id == 0; 102ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // Save the old value using swap to avoid a string copy which 103ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // also will clear our m_value_str 10417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (m_value_str.empty()) 10517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 10617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_valid = false; 10717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 10817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton else 10917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 11017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_valid = true; 11117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str.swap (m_value_str); 11217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str.clear(); 11317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.clear(); 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_summary_str.clear(); 1164ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.clear(); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton const bool value_was_valid = GetValueIsValid(); 119ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton SetValueDidChange (false); 120ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 121ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton m_error.Clear(); 122ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 123ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // Call the pure virtual function to update the value 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateValue (exe_scope); 125ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 126ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton // Update the fact that we tried to update the value for this 127fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton // value object whether or not we succeed 128ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton m_update_id = stop_id; 129ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton bool success = m_error.Success(); 130ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton SetValueIsValid (success); 13117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 13217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (first_update) 13317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (false); 13417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton else if (!m_value_did_change && success == false) 135ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton { 13617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value wasn't gotten successfully, so we mark this 13717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // as changed if the value used to be valid and now isn't 13817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (value_was_valid); 139ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton } 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor & 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () const 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetError() const 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetLocationAsCString (ExecutionContextScope *exe_scope) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (UpdateValueIfNeeded(exe_scope)) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value.GetValueType()) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 1856916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterInfo *reg_info = m_value.GetRegisterInfo(); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = "scalar"; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2; 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 2280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonValueObject::ResolveValue (ExecutionContextScope *exe_scope, Scalar &scalar) 2290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 2300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 2310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton exe_scope->CalculateExecutionContext(exe_ctx); 2320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ()); 2330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return scalar.IsValid(); 2340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 2350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 2360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 23717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 25017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueDidChange (ExecutionContextScope *exe_scope) 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton GetValueAsCString (exe_scope); 25317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create) 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < GetNumChildren()) 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already made the child value object? 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (can_create && m_children[idx].get() == NULL) 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No we haven't created the child at this index, so lets have our 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // subclass do it and cache the result for quick future access. 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children[idx] = CreateChildAtIndex (idx, false, 0); 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp = m_children[idx]; 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 286462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2945d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> child_indexes; 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *clang_ast = GetClangAST(); 299462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton void *clang_type = GetClangType(); 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang_type, 303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_child_indexes > 0) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>::const_iterator end = child_indexes.end (); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp = GetChildAtIndex(*pos, can_create); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (++pos; pos != end; ++pos) 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_sp) 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp = new_child_sp; 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_sp.reset(); 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_children.size(); 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children) 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children.resize(num_children); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name) 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name.SetCString(name); 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index) 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP valobj_sp; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string child_name_str; 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_byte_size = 0; 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t child_byte_offset = 0; 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_bitfield_bit_size = 0; 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_bitfield_bit_offset = 0; 370bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool child_is_base_class = false; 37100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 37200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool transparent_pointers = synthetic_array_member == false; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *clang_ast = GetClangAST(); 375f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType(); 376f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t child_clang_type; 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast, 378427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang_type, 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name_str, 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 387bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 38800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 38900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 3909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (child_clang_type && child_byte_size) 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synthetic_index) 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset += child_byte_size * synthetic_index; 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString child_name; 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!child_name_str.empty()) 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.SetCString (child_name_str.c_str()); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner valobj_sp.reset (new ValueObjectChild (this, 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang_ast, 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_clang_type, 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 406bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 40700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 40800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent)); 409427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs); 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return valobj_sp; 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSummaryAsCString (ExecutionContextScope *exe_scope) 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (UpdateValueIfNeeded (exe_scope)) 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 422f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType(); 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if this is a pointer to a C string? 42503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton StreamString sstr; 428f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t elem_or_pointee_clang_type; 429f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetClangAST(), 431427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton &elem_or_pointee_clang_type)); 43203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 433f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 434f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Process *process = exe_scope->CalculateProcess(); 43703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (process != NULL) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 439f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 44003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::AddressType cstr_address_type = eAddressTypeInvalid; 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 442f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton size_t cstr_len = 0; 443f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (ClangASTContext::eTypeIsArray)) 444f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have an array 446f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton cstr_len = ClangASTContext::GetArraySize (clang_type); 447f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton cstr_address = GetAddressOf (cstr_address_type, true); 448f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 449f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 450f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 451f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer 452f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton cstr_address = GetPointerValue (cstr_address_type, true); 453f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 45403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (cstr_address != LLDB_INVALID_ADDRESS) 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton DataExtractor data; 45703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton size_t bytes_read = 0; 45803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton std::vector<char> data_buffer; 45903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Error error; 460f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (cstr_len > 0) 46103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 462f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton data_buffer.resize(cstr_len); 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 << '"'; 4685c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton data.Dump (&sstr, 4695c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 0, // Start offset in "data" 4705c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton eFormatChar, // Print as characters 4715c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 1, // Size of item (1 byte for a char!) 4725c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton bytes_read, // How many bytes to print? 4735c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton UINT32_MAX, // num per line 4745c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton LLDB_INVALID_ADDRESS,// base address 4755c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 0, // bitfield bit size 4765c9721abf957d95d3ccdb01596bbac42c112f863Greg 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'; 4865c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 4875c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton sstr << '"'; 48803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 48903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost); 49003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0) 49103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 49203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton size_t len = strlen(&data_buffer.front()); 49303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (len == 0) 49403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 49503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (len > bytes_read) 49603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton len = bytes_read; 49703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 4985c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton data.Dump (&sstr, 4995c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 0, // Start offset in "data" 5005c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton eFormatChar, // Print as characters 5015c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 1, // Size of item (1 byte for a char!) 5025c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton len, // How many bytes to print? 5035c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton UINT32_MAX, // num per line 5045c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton LLDB_INVALID_ADDRESS,// base address 5055c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 0, // bitfield bit size 5065c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 0); // bitfield bit offset 5075c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 50803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (len < k_max_buf_size) 50903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 5105c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton cstr_address += k_max_buf_size; 51103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 5125c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton sstr << '"'; 51303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 51703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (sstr.GetSize() > 0) 51803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.assign (sstr.GetData(), sstr.GetSize()); 51903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 52003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton else if (ClangASTContext::IsFunctionPointerType (clang_type)) 52103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 52203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::AddressType func_ptr_address_type = eAddressTypeInvalid; 52303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true); 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (func_ptr_address_type) 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeInvalid: 53003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeFile: 53103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 53203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 53303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeLoad: 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Address so_addr; 536eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton Target *target = exe_scope->CalculateTarget(); 537eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton if (target && target->GetSectionLoadList().IsEmpty() == false) 53803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 539eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 54003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 54103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton so_addr.Dump (&sstr, 54203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton exe_scope, 54303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Address::DumpStyleResolvedDescription, 54403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton Address::DumpStyleSectionNameOffset); 54503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 54603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case eAddressTypeHost: 55103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 55403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (sstr.GetSize() > 0) 55503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.assign (1, '('); 55703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.append (sstr.GetData(), sstr.GetSize()); 55803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton m_summary_str.append (1, ')'); 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5694ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 5704ae519666628cca07c194bf677163009cc2e5a8bJim InghamValueObject::GetObjectDescription (ExecutionContextScope *exe_scope) 5714ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 5724ae519666628cca07c194bf677163009cc2e5a8bJim Ingham if (!m_object_desc_str.empty()) 5734ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return m_object_desc_str.c_str(); 5744ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 5754ae519666628cca07c194bf677163009cc2e5a8bJim Ingham if (!GetValueIsValid()) 5764ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 5774ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 5784ae519666628cca07c194bf677163009cc2e5a8bJim Ingham Process *process = exe_scope->CalculateProcess(); 579b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 5804ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 581b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 582b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 5834ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 584b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham lldb::LanguageType language = GetObjectRuntimeLanguage(); 585b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 5864ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 5870e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 5880e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 5890e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham // Aw, hell, if the things a pointer, let's try ObjC anyway... 5900e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 5910e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 5920e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 5930e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType()); 5940e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (qual_type->isAnyPointerType()) 5950e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC); 5960e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 5970e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 5980e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 599b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this, exe_scope)) 6004ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 6014ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 6024ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 603e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 604e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 605e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 606e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 607e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 6084ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValueAsCString (ExecutionContextScope *exe_scope) 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If our byte size is zero this is an aggregate type that has children 614462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (ClangASTContext::IsAggregateType (GetClangType()) == false) 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (UpdateValueIfNeeded(exe_scope)) 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Value::ContextType context_type = m_value.GetContextType(); 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (context_type) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6246916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeClangType: 6256916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeLLDBType: 6266916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeVariable: 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 628f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType (); 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 63211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton if (m_format == eFormatDefault) 63311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format = ClangASTType::GetFormat(clang_type); 63411730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton 63511730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton if (ClangASTType::DumpTypeValue (GetClangAST(), // The clang AST 63611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton clang_type, // The clang type to display 63711730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton &sstr, 63811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format, // Format to display this type with 63911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_data, // Data to extract from 64011730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton 0, // Byte offset into "m_data" 64111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetByteSize(), // Byte size of item in "m_data" 64211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetBitfieldBitSize(), // Bitfield bit size 64311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetBitfieldBitOffset())) // Bitfield bit offset 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(sstr.GetString()); 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.clear(); 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6516916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeRegisterInfo: 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString reg_sstr; 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.Dump(®_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(reg_sstr.GetString()); 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 66254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 66354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 66454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 66817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_value_did_change && m_old_value_valid) 66917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 67017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value was gotten successfully, so we consider the 67117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // value as changed if the value string differs 67217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (m_old_value_str != m_value_str); 67317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68103e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 682f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonValueObject::GetAddressOf (lldb::AddressType &address_type, bool scalar_is_load_address) 683f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 684f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 685f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 686f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 687f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 688f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeLoad; 690f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 691f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 692f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 693f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 694f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 695f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 696f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 697f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 698f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = m_value.GetValueAddressType (); 699f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 700f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 701f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 702f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 703f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeInvalid; 704f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 705f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 70803e0f97cfa469792dd69b36f782d33a014225788Greg ClaytonValueObject::GetPointerValue (lldb::AddressType &address_type, bool scalar_is_load_address) 70903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 71003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t address = LLDB_INVALID_ADDRESS; 71103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeInvalid; 712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 71303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 71403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 71503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (scalar_is_load_address) 71603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 71703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 71803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 71903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 72003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 72103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 72203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 72303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 72403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeHostAddress: 72503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 72603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton uint32_t data_offset = 0; 72703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 72803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = m_value.GetValueAddressType(); 72903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (address_type == eAddressTypeInvalid) 73003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 73103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 73203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 73303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 734427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 735427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton address_type = eAddressTypeLoad; 737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 73803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 73903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 74003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueFromCString (ExecutionContextScope *exe_scope, const char *value_str) 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!UpdateValueIfNeeded(exe_scope)) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 750462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *end = NULL; 753bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingInvalid: 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingUint: 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(unsigned long long)) 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned long long ull_val = strtoull(value_str, &end, 0); 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = ull_val; 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingSint: 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(long long)) 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long long sll_val = strtoll(value_str, &end, 0); 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = sll_val; 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingIEEE754: 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const off_t byte_offset = GetByteOffset(); 79454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size)); 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst != NULL) 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We are decoding a float into host byte order below, so make 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sure m_data knows what it contains. 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.SetByteOrder(eByteOrderHost); 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetClangAST(), 802462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value_str, 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst, 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size); 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (converted_byte_size == byte_size) 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingVector: 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we have made it here the value is in m_data and we should write it 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // out to the target 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (); 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write () 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the update ID so the next time we try and read the value 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we try and read it again. 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_update_id = 0; 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: when Value has a method to write a value back, call it from here. 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 838b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType 839b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 840b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 841f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t opaque_qual_type = GetClangType(); 842b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (opaque_qual_type == NULL) 843b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 844b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 845b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham // If the type is a reference, then resolve it to what it refers to first: 846b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType()); 847b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isAnyPointerType()) 848b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 849b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isObjCObjectPointerType()) 850b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 851b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 852b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType pointee_type (qual_type->getPointeeType()); 853b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->getCXXRecordDeclForPointerType() != NULL) 854b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 855b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCObjectOrInterfaceType()) 856b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 857b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCClassType()) 858b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 859b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 860b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham else 861b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 862b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (ClangASTContext::IsObjCClassType (opaque_qual_type)) 863b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 864974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen if (ClangASTContext::IsCXXClassType (opaque_qual_type)) 865b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 866b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 867b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 868b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 869b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 870b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::AddSyntheticChild (const ConstString &key, ValueObjectSP& valobj_sp) 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_synthetic_children[key] = valobj_sp; 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::map<ConstString, ValueObjectSP>::const_iterator pos = m_synthetic_children.find (key); 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = pos->second; 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 890462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 898462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerOrReferenceType(GetClangType()); 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create) 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(index_str, sizeof(index_str), "[%i]", index); 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = CreateChildAtIndex(0, true, index); 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synthetic_child_sp) 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddSyntheticChild(index_const_str, synthetic_child_sp); 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 926642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 927642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghambool 928642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamValueObject::SetDynamicValue () 929642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 930642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (!IsPointerOrReferenceType()) 931642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return false; 932642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 933642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham // Check that the runtime class is correct for determining the most specific class. 934642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham // If it is a C++ class, see if it is dynamic: 935b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 936642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return true; 937642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 93866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 93900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 94000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 94100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 94200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 94300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 94400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool parent_had_base_class = m_parent && m_parent->GetBaseClassPath (s); 94500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t clang_type = GetClangType(); 94600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 94700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name); 94800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 94900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 95000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 95100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 95200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 95300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 95400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 95500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 95600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 95700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 95800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 95900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 96000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 96100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 96200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 96300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (m_parent) 96400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 96500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (m_parent->IsBaseClass()) 96600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return m_parent->GetNonBaseClassParent(); 96700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 96800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return m_parent; 96900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 97000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 97100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 97266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 97366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 974b01000fd063629facd45044f137446fb748ee179Greg ClaytonValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes) 975bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 97600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 97700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 97800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (is_deref_of_parent) 97900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("*("); 98000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 981bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (m_parent) 982b01000fd063629facd45044f137446fb748ee179Greg Clayton m_parent->GetExpressionPath (s, qualify_cxx_base_classes); 98300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 98400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 98500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 98600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 987bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 98800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 98900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 990bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 99100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 99200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 99300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 99400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL); 99500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 99600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer) 99700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 99800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 99900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 100000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) && 100100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray)) 100200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 100300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar('.'); 100400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 100500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 1006bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 100700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 100800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 100900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 1010bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 101100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 101200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 101300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 101400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 101500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 101600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 1017bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1018bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1019bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1020bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 102100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (is_deref_of_parent) 102200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 1023bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1024bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1025bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid 102666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject 102766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton( 102866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton Stream &s, 102966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ExecutionContextScope *exe_scope, 103066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ValueObject *valobj, 103166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton const char *root_valobj_name, 103266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t ptr_depth, 103366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t curr_depth, 103466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t max_depth, 103566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_types, 103666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_location, 103766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool use_objc, 1038bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool scope_already_checked, 1039bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool flat_output 104066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton) 104166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 104266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (valobj) 104366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1044bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 1045bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1046f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 1047bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 1048f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 1049f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 1050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1051bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const bool print_valobj = flat_output == false || has_value; 1052bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1053bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 105466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1055bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (show_location) 1056bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1057bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf("%s: ", valobj->GetLocationAsCString(exe_scope)); 1058bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 105966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1060bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 106166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1062a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton // Always show the type for the top level items. 106300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (show_types || (curr_depth == 0 && !flat_output)) 1064427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>")); 106566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 106666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 1068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1069b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 1070b01000fd063629facd45044f137446fb748ee179Greg Clayton const bool qualify_cxx_base_classes = show_types; 1071b01000fd063629facd45044f137446fb748ee179Greg Clayton valobj->GetExpressionPath(s, qualify_cxx_base_classes); 1072bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString(" ="); 1073bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1075bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 1077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 1078bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1079bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1080bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!scope_already_checked && !valobj->IsInScope(exe_scope->CalculateStackFrame())) 1081bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1082bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = "error: out of scope"; 1083bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 108466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 108566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1086bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 1087bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1088bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 1089bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1090bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton val_cstr = valobj->GetValueAsCString(exe_scope); 1091bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 1092bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 109366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 109466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 109566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1096a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton s.Printf (" error: %s\n", err_cstr); 109766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 109866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 109966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 1101bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1102bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1103bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *sum_cstr = valobj->GetSummaryAsCString(exe_scope); 110466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1105bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (val_cstr) 1106bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s", val_cstr); 110766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1108bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (sum_cstr) 1109bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s", sum_cstr); 1110bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1111bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (use_objc) 1112bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1113bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *object_desc = valobj->GetObjectDescription(exe_scope); 1114bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 1115bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s\n", object_desc); 1116bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1117e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan s.Printf (" [no Objective-C description available]\n"); 1118bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 1119bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 112066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 112166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 112266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (curr_depth < max_depth) 112366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 1125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 1126f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 1127f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 1128f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 1129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 1131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 1132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 1133f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 1135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 1136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1137f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 1138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 1139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton lldb::AddressType ptr_address_type; 1140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (valobj->GetPointerValue (ptr_address_type, true) == 0) 1141f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 1142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 1144f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 1146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 1147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 1148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 1149f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 1150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 1153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 1154f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 115566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1156f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (print_children) 115766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1158bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const uint32_t num_children = valobj->GetNumChildren(); 1159bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 116066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1161bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 116266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1163bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1164bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 1165bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1166bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1167bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1168bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 11693f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 1170bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 1171bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1172bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1173bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton for (uint32_t idx=0; idx<num_children; ++idx) 1174bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1175bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton ValueObjectSP child_sp(valobj->GetChildAtIndex(idx, true)); 1176bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 1177bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1178bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton DumpValueObject (s, 1179bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton exe_scope, 1180bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_sp.get(), 1181bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton NULL, 1182f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 1183bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton curr_depth + 1, 1184bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton max_depth, 1185bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_types, 1186bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_location, 1187bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton false, 1188bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton true, 1189bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton flat_output); 1190bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1191bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1192bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1193bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!flat_output) 1194bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1195bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 1196bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 119766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 119866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 1199bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 1200bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1201bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 1202bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1203f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 1204bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1205bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1206bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1207bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1208bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 1209bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1210bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 121166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 1212bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1213bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 121466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 121566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 121666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 121766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 121866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1219bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 122066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1221bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 122266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 122366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 122466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 122566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 122666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 122766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 1230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObject::CreateConstantValue (ExecutionContextScope *exe_scope, const ConstString &name) 1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (UpdateValueIfNeeded(exe_scope) && m_error.Success()) 1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ExecutionContext exe_ctx; 1237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_scope->CalculateExecutionContext(exe_ctx); 1238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST (); 1240427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1241427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton DataExtractor data; 1242427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton data.SetByteOrder (m_data.GetByteOrder()); 1243427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton data.SetAddressByteSize(m_data.GetAddressByteSize()); 1244427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0); 1246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectConstResult (ast, 1248427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetClangType(), 1249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name, 1250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton data)); 1251427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 1253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectConstResult (m_error)); 1255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 1257427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1258427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1259427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP 1260bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 1261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1262427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ValueObjectSP valobj_sp; 1263c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 1264c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 1265427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1266427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 1267427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1268427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 1269427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 1270427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 1271427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 1272427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 1273427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 127400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 1275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 1276427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 1277427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 1278427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 1279427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast, 1280427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 1281427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 1282427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 1283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 1284427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 1285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 1286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 1287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 1288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 1289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 129000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 129100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 1292a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 1293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 1295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 1296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 1297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectChild (this, 1299427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_ast, 1300427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_clang_type, 1301427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name, 1302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 1303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 1304427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 1305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 130600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 130700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent)); 1308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1310c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1311c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (valobj_sp) 1312c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 1313c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 1314c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 1315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 1316427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1317c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 1318b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 1319c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1320c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 1321c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 1322c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 1323c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1326427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 1327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1329c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton lldb::ValueObjectSP 1330c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 1331427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1332427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ValueObjectSP valobj_sp; 1333427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::AddressType address_type = eAddressTypeInvalid; 1334427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 1335427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address); 1336c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 1337427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 1338427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1339427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 1340427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1341c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 1342427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 1343c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 1344c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 1345b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 1346c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 1347c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 1348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 1349c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 1351427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 1352427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 1353427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1354427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 1355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 1356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 1357427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1358427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 1359427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 1360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton valobj_sp.reset (new ValueObjectConstResult (ast, 1361427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangASTContext::CreatePointerType (ast, clang_type), 1362427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString (name.c_str()), 1363427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton addr, 13646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan eAddressTypeInvalid, 1365427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_data.GetAddressByteSize())); 1366427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1367427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1368427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 1369427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1370427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 1372427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1373427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1374