ValueObject.cpp revision 801417e453f8531ac176cd952200587bf15d9ccf
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" 221391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/Debugger.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h" 25427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h" 26e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectDynamicValue.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h" 280039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/ValueObjectMemory.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 31cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton 321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 364ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h" 37b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 40eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h" 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0; 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 51fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) : 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (++g_value_obj_uid), // Unique identifier for every value object 53fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (&parent), 54dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (parent.GetUpdatePoint ()), 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name (), 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data (), 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value (), 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error (), 5917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str (), 6017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str (), 6117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_location_str (), 6217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_summary_str (), 634ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str (), 6447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(parent.GetManager()), 6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children (), 6617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_synthetic_children (), 6747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 6847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 6911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format (eFormatDefault), 7017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid (false), 7117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change (false), 7217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid (false), 73427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_old_value_valid (false), 7400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton m_pointers_point_to_load_addrs (false), 751391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 76886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision(0), 791391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_summary_format(), 801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_value_format() 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject(this); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 86fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 88fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ExecutionContextScope *exe_scope) : 89fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UserID (++g_value_obj_uid), // Unique identifier for every value object 90fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (NULL), 91dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (exe_scope), 92fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_name (), 93fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_data (), 94fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value (), 95fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error (), 96fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str (), 97fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str (), 98fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_location_str (), 99fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str (), 100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_object_desc_str (), 10147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(), 102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children (), 103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_synthetic_children (), 10447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 10547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_format (eFormatDefault), 107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_is_valid (false), 108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_did_change (false), 109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children_count_valid (false), 110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid (false), 111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_pointers_point_to_load_addrs (false), 1121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 113886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 1149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 1151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision(0), 1161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_summary_format(), 1171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_value_format() 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager = new ValueObjectManager(); 12047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject (this); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor 125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject () 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 131886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 134886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (update_format) 135886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata UpdateFormatsIfNeeded(); 1361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 137d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 138d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 139d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 140d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 141d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool first_update = m_update_point.IsFirstEvaluation(); 143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_update_point.NeedsUpdating()) 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetUpdated(); 147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Save the old value using swap to avoid a string copy which 149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // also will clear our m_value_str 150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_value_str.empty()) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = false; 153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = true; 157fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str.swap (m_value_str); 158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str.clear(); 159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_location_str.clear(); 161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str.clear(); 162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_object_desc_str.clear(); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const bool value_was_valid = GetValueIsValid(); 165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 166ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error.Clear(); 168ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Call the pure virtual function to update the value 170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool success = UpdateValue (); 171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueIsValid (success); 173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (first_update) 175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else if (!m_value_did_change && success == false) 177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 178fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // The value wasn't gotten successfully, so we mark this 179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // as changed if the value used to be valid and now isn't 180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (value_was_valid); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1861391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granatavoid 1871391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::UpdateFormatsIfNeeded() 1881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{ 1891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata /*printf("CHECKING FOR UPDATES. I am at revision %d, while the format manager is at revision %d\n", 1901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision, 1911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata Debugger::ValueFormats::GetCurrentRevision());*/ 1921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_format_mgr_revision != Debugger::ValueFormats::GetCurrentRevision()) 1931391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_summary_format.get()) 1951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_summary_format.reset((SummaryFormat*)NULL); 1961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_value_format.get()) 1971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_value_format.reset((ValueFormat*)NULL); 1981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata Debugger::ValueFormats::Get(*this, m_last_value_format); 199886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!Debugger::SummaryFormats::Get(*this, m_last_summary_format)) 200886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata Debugger::RegexSummaryFormats::Get(*this, m_last_summary_format); 2011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision = Debugger::ValueFormats::GetCurrentRevision(); 2021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_value_str.clear(); 2031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_summary_str.clear(); 2041391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 2051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata} 2061391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 210e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham UpdateValueIfNeeded(); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 215bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError() 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 217bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton UpdateValueIfNeeded(); 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 228fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString () 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 230fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded()) 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value.GetValueType()) 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 2426916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterInfo *reg_info = m_value.GetRegisterInfo(); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = "scalar"; 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2; 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 285fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar) 2860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 2870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 289fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 290fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 2910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ()); 2920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return scalar.IsValid(); 2930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 2940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 2950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 29617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 309fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange () 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 311fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham GetValueAsCString (); 31217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create) 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 325917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 326917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 327917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton UpdateValueIfNeeded(); 328917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (idx < GetNumChildren()) 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 330917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check if we have already made the child value object? 331917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (can_create && m_children[idx] == NULL) 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 333917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // No we haven't created the child at this index, so lets have our 334917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // subclass do it and cache the result for quick future access. 335917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton m_children[idx] = CreateChildAtIndex (idx, false, 0); 336e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 337917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 338917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_children[idx] != NULL) 339917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return m_children[idx]->GetSP(); 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 349462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3575d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 362917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 363917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 364917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton UpdateValueIfNeeded(); 365917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 366917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t> child_indexes; 367917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 368917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton void *clang_type = GetClangType(); 369917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 370917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 371917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 372917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton name.GetCString(), 373917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 374917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_indexes); 375917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (num_child_indexes > 0) 376e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 377917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator end = child_indexes.end (); 379e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = GetChildAtIndex(*pos, can_create); 381917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton for (++pos; pos != end; ++pos) 382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_sp) 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = new_child_sp; 387917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 388917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 389917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 390917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp.reset(); 391e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 392917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_children.size(); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children) 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children.resize(num_children); 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name) 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name.SetCString(name); 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index) 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 430bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham ValueObject *valobj = NULL; 431e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::string child_name_str; 435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_byte_size = 0; 436917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton int32_t child_byte_offset = 0; 437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_size = 0; 438917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_offset = 0; 439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_base_class = false; 440917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_deref_of_parent = false; 441917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 442917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool transparent_pointers = synthetic_array_member == false; 443917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 444917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t clang_type = GetClangType(); 445917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t child_clang_type; 446917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 447917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ExecutionContext exe_ctx; 448917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 449917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 450917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 451917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 452917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetName().GetCString(), 453917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 454917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton idx, 455917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton transparent_pointers, 456917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 457917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name_str, 458917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 459917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 460917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 461917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 462917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 463917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 464917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_clang_type && child_byte_size) 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 466917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (synthetic_index) 467917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset += child_byte_size * synthetic_index; 468917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 469917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ConstString child_name; 470917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!child_name_str.empty()) 471917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name.SetCString (child_name_str.c_str()); 472917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 473917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj = new ValueObjectChild (*this, 474917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 475917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type, 476917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name, 477917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 479917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_pointers_point_to_load_addrs) 484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs); 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 486e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 48747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 491fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString () 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 493fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded ()) 4941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_summary_format.get()) 4981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 4991391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata StreamString s; 5001391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ExecutionContext exe_ctx; 5011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata this->GetExecutionContextScope()->CalculateExecutionContext(exe_ctx); 5021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata SymbolContext sc = exe_ctx.frame->GetSymbolContext(eSymbolContextEverything); 503886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 504886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (m_last_summary_format->m_show_members_oneliner) 505886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 506886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata const uint32_t num_children = GetNumChildren(); 507886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (num_children) 508886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 509886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 510886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutChar('('); 511886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 512886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata for (uint32_t idx=0; idx<num_children; ++idx) 513886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 514886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata ValueObjectSP child_sp(GetChildAtIndex(idx, true)); 515886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (child_sp.get()) 516886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 517886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (idx) 518886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(", "); 519886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(child_sp.get()->GetName().AsCString()); 520886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutChar('='); 5219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata s.PutCString(child_sp.get()->GetPrintableRepresentation()); 522886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 523886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 524886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 525886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutChar(')'); 526886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 527886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_summary_str.swap(s.GetString()); 528886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_summary_str.c_str(); 529886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 530886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 531886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return "()"; 532886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 533886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 534886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 5351391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 536886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (Debugger::FormatPrompt(m_last_summary_format->m_format.c_str(), &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, NULL, this)) 537886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 538886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_summary_str.swap(s.GetString()); 539886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_summary_str.c_str(); 540886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 541886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 542886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return NULL; 5431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 5441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 5451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 546f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType(); 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if this is a pointer to a C string? 54903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton StreamString sstr; 552f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t elem_or_pointee_clang_type; 553f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetClangAST(), 555427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton &elem_or_pointee_clang_type)); 55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 557fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 558fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 560fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 561fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 563fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *process = exe_scope->CalculateProcess(); 564fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (process != NULL) 565f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 566fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 567fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham AddressType cstr_address_type = eAddressTypeInvalid; 568fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 569fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham size_t cstr_len = 0; 570fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (type_flags.Test (ClangASTContext::eTypeIsArray)) 57103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 572fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // We have an array 573fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham cstr_len = ClangASTContext::GetArraySize (clang_type); 574fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham cstr_address = GetAddressOf (cstr_address_type, true); 57503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 57603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton else 57703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 578fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // We have a pointer 579fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham cstr_address = GetPointerValue (cstr_address_type, true); 580fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 581fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (cstr_address != LLDB_INVALID_ADDRESS) 582fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 583fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham DataExtractor data; 584fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham size_t bytes_read = 0; 585fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham std::vector<char> data_buffer; 586fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Error error; 587fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (cstr_len > 0) 588fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 589fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data_buffer.resize(cstr_len); 590fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder()); 591fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), cstr_len, error); 592fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (bytes_read > 0) 593fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 594fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham sstr << '"'; 595fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.Dump (&sstr, 596fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 0, // Start offset in "data" 597307fa07606d519d427c812802aff5f9727e7047cGreg Clayton eFormatCharArray, // Print as characters 598fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1, // Size of item (1 byte for a char!) 599fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bytes_read, // How many bytes to print? 600fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UINT32_MAX, // num per line 601fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham LLDB_INVALID_ADDRESS,// base address 602fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 0, // bitfield bit size 603fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 0); // bitfield bit offset 604fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham sstr << '"'; 605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 606fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 607fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 608fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 609fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const size_t k_max_buf_size = 256; 610fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data_buffer.resize (k_max_buf_size + 1); 611fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // NULL terminate in case we don't get the entire C string 612fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data_buffer.back() = '\0'; 6135c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton 614fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham sstr << '"'; 61503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 616fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder()); 617fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0) 618fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 619fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham size_t len = strlen(&data_buffer.front()); 620fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (len == 0) 621fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham break; 622fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (len > bytes_read) 623fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham len = bytes_read; 624fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 625fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.Dump (&sstr, 626fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 0, // Start offset in "data" 627307fa07606d519d427c812802aff5f9727e7047cGreg Clayton eFormatCharArray, // Print as characters 628fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1, // Size of item (1 byte for a char!) 629fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham len, // How many bytes to print? 630fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UINT32_MAX, // num per line 631fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham LLDB_INVALID_ADDRESS,// base address 632fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 0, // bitfield bit size 633fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 0); // bitfield bit offset 634fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 635fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (len < k_max_buf_size) 636fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham break; 637fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham cstr_address += k_max_buf_size; 638fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 639fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham sstr << '"'; 64003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 64103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 643fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 644fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (sstr.GetSize() > 0) 645fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str.assign (sstr.GetData(), sstr.GetSize()); 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 647fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else if (ClangASTContext::IsFunctionPointerType (clang_type)) 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 649fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham AddressType func_ptr_address_type = eAddressTypeInvalid; 650fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true); 65103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 652fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 653fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 654fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham switch (func_ptr_address_type) 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 656fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham case eAddressTypeInvalid: 657fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham case eAddressTypeFile: 658fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham break; 659fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 660fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham case eAddressTypeLoad: 66103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 662fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Address so_addr; 663fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *target = exe_scope->CalculateTarget(); 664fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (target && target->GetSectionLoadList().IsEmpty() == false) 66503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 666fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 667fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 668fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham so_addr.Dump (&sstr, 669fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope, 670fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Address::DumpStyleResolvedDescription, 671fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Address::DumpStyleSectionNameOffset); 672fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 67303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 67403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 675fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham break; 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 677fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham case eAddressTypeHost: 678fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham break; 679fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 680fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 681fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (sstr.GetSize() > 0) 682fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 683fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str.assign (1, '('); 684fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str.append (sstr.GetData(), sstr.GetSize()); 685fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str.append (1, ')'); 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6974ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 698fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription () 6994ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 700886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 701fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!UpdateValueIfNeeded ()) 7024ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 703886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 704886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!m_object_desc_str.empty()) 705886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_object_desc_str.c_str(); 706886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 707fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 708fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope == NULL) 709fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return NULL; 710fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 7114ae519666628cca07c194bf677163009cc2e5a8bJim Ingham Process *process = exe_scope->CalculateProcess(); 712b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 7134ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 714b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 715b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 7164ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 717b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham lldb::LanguageType language = GetObjectRuntimeLanguage(); 718b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 7194ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 7200e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 7210e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 72270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway... 7230e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 7240e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 7250e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 72670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham bool is_signed; 72770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed) 72870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham || ClangASTContext::IsPointerType (opaque_qual_type)) 72970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham { 7300e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC); 73170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham } 7320e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 7330e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 7340e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 7350de37195f17fefb536157b3296a18999116b8125Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this)) 7364ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 7374ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 7384ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 739e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 740e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 741e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 742e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 743e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 7444ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 747fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString () 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If our byte size is zero this is an aggregate type that has children 750462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (ClangASTContext::IsAggregateType (GetClangType()) == false) 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 752fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded()) 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Value::ContextType context_type = m_value.GetContextType(); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (context_type) 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeClangType: 7616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeLLDBType: 7626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeVariable: 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType (); 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 76856bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton Format format = GetFormat(); 7691391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (format == eFormatDefault) 7701391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 7711391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_value_format) 7721391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata format = m_last_value_format->m_format; 7731391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 7749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // force the system into using unsigned integers for bitfields 7759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata format = (m_is_bitfield_for_scalar ? eFormatUnsigned : 7769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ClangASTType::GetFormat(clang_type)); 7771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 77811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton 77911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton if (ClangASTType::DumpTypeValue (GetClangAST(), // The clang AST 78011730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton clang_type, // The clang type to display 78111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton &sstr, 7821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata format, // Format to display this type with 78311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_data, // Data to extract from 78411730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton 0, // Byte offset into "m_data" 78511730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetByteSize(), // Byte size of item in "m_data" 78611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetBitfieldBitSize(), // Bitfield bit size 78711730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton GetBitfieldBitOffset())) // Bitfield bit offset 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(sstr.GetString()); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 79082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 79182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)", 79282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton m_data.GetByteSize(), 79382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton GetByteSize()); 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.clear(); 79582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeRegisterInfo: 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString reg_sstr; 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.Dump(®_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(reg_sstr.GetString()); 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 81154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 81254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 81354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 81717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_value_did_change && m_old_value_valid) 81817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 81917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value was gotten successfully, so we consider the 82017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // value as changed if the value string differs 82117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (m_old_value_str != m_value_str); 82217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 830886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granataconst char * 831886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::GetPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, 832886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata lldb::Format custom_format) 833886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 834886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if(custom_format != lldb::eFormatInvalid) 835886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata SetFormat(custom_format); 836886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 837886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata const char * return_value; 838886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 839886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata switch(val_obj_display) 840886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 841886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayValue: 842886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetValueAsCString(); 843886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 844886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplaySummary: 845886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetSummaryAsCString(); 846886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 847886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayLanguageSpecific: 848886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetObjectDescription(); 849886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 850886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 851886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 8529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!return_value) 8539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 8549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // try to pick the other choice 8559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (val_obj_display == eDisplayValue) 8569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return_value = GetSummaryAsCString(); 8579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (val_obj_display == eDisplaySummary) 8589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return_value = GetValueAsCString(); 8599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 8609762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return_value = ""; 8619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 862886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 8639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return (return_value ? return_value : ""); 8649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 8659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 866886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 8679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 8689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s, 8699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectRepresentationStyle val_obj_display, 8709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata lldb::Format custom_format) 8719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 8729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata const char *targetvalue = GetPrintableRepresentation(val_obj_display, custom_format); 8739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if(targetvalue) 8749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata s.PutCString(targetvalue); 8759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool var_success = (targetvalue != NULL); 8769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if(custom_format != eFormatInvalid) 8779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata SetFormat(eFormatDefault); 8789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return var_success; 879886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 880886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 88103e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 882b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address) 883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 884e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!UpdateValueIfNeeded()) 885e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return LLDB_INVALID_ADDRESS; 886e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 887f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 888f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 889f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 890f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 891f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 892f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeLoad; 893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 895f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 896f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 897f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 898f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 900f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 901f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = m_value.GetValueAddressType (); 902f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 903f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 904f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 905f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 906f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeInvalid; 907f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 908f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 909f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 910f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 911b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address) 91203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 91303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t address = LLDB_INVALID_ADDRESS; 91403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeInvalid; 915e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 916e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!UpdateValueIfNeeded()) 917e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return address; 918e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 919f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 92003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 92103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 92203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (scalar_is_load_address) 92303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 92403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 92503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 92603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 92703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 92803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 92903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 93003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 93103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeHostAddress: 93203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 93303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton uint32_t data_offset = 0; 93403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 93503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = m_value.GetValueAddressType(); 93603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (address_type == eAddressTypeInvalid) 93703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 93803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 93903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 94003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 943427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton address_type = eAddressTypeLoad; 944427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 94503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 94603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 94703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str) 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 953fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!UpdateValueIfNeeded()) 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 957462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *end = NULL; 960bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingInvalid: 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingUint: 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(unsigned long long)) 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned long long ull_val = strtoull(value_str, &end, 0); 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 976801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value.GetScalar() = ull_val; 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingSint: 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(long long)) 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long long sll_val = strtoll(value_str, &end, 0); 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 992801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value.GetScalar() = sll_val; 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingIEEE754: 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const off_t byte_offset = GetByteOffset(); 100154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size)); 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst != NULL) 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We are decoding a float into host byte order below, so make 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sure m_data knows what it contains. 1006cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton m_data.SetByteOrder(lldb::endian::InlHostByteOrder()); 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetClangAST(), 1009462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value_str, 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst, 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size); 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (converted_byte_size == byte_size) 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingVector: 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we have made it here the value is in m_data and we should write it 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // out to the target 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (); 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write () 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the update ID so the next time we try and read the value 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we try and read it again. 1038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetNeedsUpdate(); 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: when Value has a method to write a value back, call it from here. 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1045b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType 1046b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 1047b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 1048f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t opaque_qual_type = GetClangType(); 1049b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (opaque_qual_type == NULL) 1050b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 1051b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1052b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham // If the type is a reference, then resolve it to what it refers to first: 1053b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType()); 1054b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isAnyPointerType()) 1055b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 1056b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isObjCObjectPointerType()) 1057b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1058b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1059b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType pointee_type (qual_type->getPointeeType()); 1060b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->getCXXRecordDeclForPointerType() != NULL) 1061b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 1062b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCObjectOrInterfaceType()) 1063b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1064b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCClassType()) 1065b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1066b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 1067b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham else 1068b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 1069b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (ClangASTContext::IsObjCClassType (opaque_qual_type)) 1070b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1071974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen if (ClangASTContext::IsCXXClassType (opaque_qual_type)) 1072b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 1073b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 1074b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1075b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 1076b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 1077b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 107947da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj) 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 108147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_synthetic_children[key] = valobj; 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 108847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key); 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 109047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = pos->second->GetSP(); 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1097462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110070c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool 11019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType () 11029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 11039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return ClangASTContext::IsScalarType (GetClangType()); 11049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 11059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 11069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 110770c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed) 110870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{ 110970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham return ClangASTContext::IsIntegerType (GetClangType(), is_signed); 111070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham} 1111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPointerOrReferenceType (GetClangType()); 111682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 111782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 111882f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 111982f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType () 112082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{ 112182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType()); 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1124917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool 1125917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType () 1126917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 1127917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType()); 1128917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 1129917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create) 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(index_str, sizeof(index_str), "[%i]", index); 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *synthetic_child; 114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 114747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child = CreateChildAtIndex(0, true, index); 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 115047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (synthetic_child) 115147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham { 115247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham AddSyntheticChild(index_const_str, synthetic_child); 115347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = synthetic_child->GetSP(); 1154886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->SetName(index_str); 1155886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->m_is_array_item_for_pointer = true; 115647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham } 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1161642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 11629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP 11639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create) 11649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 11659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP synthetic_child_sp; 11669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (IsScalarType ()) 11679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char index_str[64]; 11699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to); 11709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ConstString index_const_str(index_str); 11719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Check if we have already created a synthetic array member in this 11729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // valid object. If we have we will re-use it. 11739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = GetSyntheticChild (index_const_str); 11749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!synthetic_child_sp) 11759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectChild *synthetic_child; 11779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // We haven't made a synthetic array member for INDEX yet, so 11789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // lets make one and cache it for any future reference. 11799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child = new ValueObjectChild(*this, 11809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangAST(), 11819762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangType(), 11829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata index_const_str, 11839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetByteSize(), 11849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 0, 11859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata to-from+1, 11869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata from, 11879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false, 11889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false); 11899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 11909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Cache the value if we got one back... 11919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (synthetic_child) 11929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata AddSyntheticChild(index_const_str, synthetic_child); 11949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = synthetic_child->GetSP(); 11959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->SetName(index_str); 11969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->m_is_bitfield_for_scalar = true; 11979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 11989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 11999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return synthetic_child_sp; 12019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1203e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid 120410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic) 1205642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 120610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 120710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return; 120810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 120947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (!m_dynamic_value && !IsDynamic()) 1210e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1211e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham Process *process = m_update_point.GetProcess(); 1212e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool worth_having_dynamic_value = false; 1213642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1214e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1215e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // FIXME: Process should have some kind of "map over Runtimes" so we don't have to 1216e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // hard code this everywhere. 1217e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham lldb::LanguageType known_type = GetObjectRuntimeLanguage(); 1218e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC) 1219e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1220e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime (known_type); 1221e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (runtime) 1222e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this); 1223e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1224e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham else 1225e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1226e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus); 1227e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (cpp_runtime) 1228e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this); 1229e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1230e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!worth_having_dynamic_value) 1231e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1232e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC); 1233e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (objc_runtime) 123410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this); 1235e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1236e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1237e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1238e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (worth_having_dynamic_value) 123910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 124047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 124147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// if (worth_having_dynamic_value) 124247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager); 1243e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1244e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1245e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham} 1246e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 124747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 124810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic) 1249e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{ 125010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 125110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return ValueObjectSP(); 125210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 125310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (!IsDynamic() && m_dynamic_value == NULL) 1254e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 125510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham CalculateDynamicValue(use_dynamic); 1256e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 125747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_dynamic_value) 125847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_dynamic_value->GetSP(); 125947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 126047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 1261642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 126266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 126300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 126400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 126500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 126600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 126700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1268e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s); 126900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t clang_type = GetClangType(); 127000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 127100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name); 127200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 127300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 127400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 127500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 127600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 127700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 127800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 127900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 128000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 128100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 128200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 128300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 128400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 128500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 128600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 1287e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()) 128800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1289e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()->IsBaseClass()) 1290e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent()->GetNonBaseClassParent(); 129100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 1292e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent(); 129300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 129400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 129500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 129666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 129766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 12981391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 1299bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 130000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 130100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 13021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if(is_deref_of_parent && epformat == eDereferencePointers) { 13031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely 13041391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName. 13051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // the eHonorPointers mode is meant to produce strings in this latter format 13061391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("*("); 13071391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 130800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 13091391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ValueObject* parent = GetParent(); 13101391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 13111391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (parent) 13121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat); 1313886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1314886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // if we are a deref_of_parent just because we are synthetic array 1315886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // members made up to allow ptr[%d] syntax to work in variable 1316886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // printing, then add our name ([%d]) to the expression path 1317886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if(m_is_array_item_for_pointer && epformat == eHonorPointers) 1318886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(m_name.AsCString()); 13191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 132000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 132100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 132200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 1323bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 132400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 132500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 1326bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 132700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 132800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 132900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 133000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL); 133100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 13321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if(parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers) 133300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 133400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 133500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 13361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 13371391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 13381391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer) 13391391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 13401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("->"); 13411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 13421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) && 13431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray)) 13441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 13451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutChar('.'); 13461391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 134700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 134800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 1349bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 135000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 135100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 135200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 1353bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 135400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 135500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 135600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 135700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 135800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 135900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 1360bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1361bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1362bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1363bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 13641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (is_deref_of_parent && epformat == eDereferencePointers) { 136500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 13661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1367bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1368bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1369bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid 137066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject 137166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton( 137266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton Stream &s, 137366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ValueObject *valobj, 137466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton const char *root_valobj_name, 137566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t ptr_depth, 137666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t curr_depth, 137766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t max_depth, 137866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_types, 137966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_location, 138066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool use_objc, 138110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham lldb::DynamicValueType use_dynamic, 1382bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool scope_already_checked, 1383bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool flat_output 138466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton) 138566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 138682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (valobj) 138766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 138882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton bool update_success = valobj->UpdateValueIfNeeded (); 138982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 139082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (update_success && use_dynamic != lldb::eNoDynamicValues) 1391e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 139210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get(); 1393e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (dynamic_value) 1394e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham valobj = dynamic_value; 1395e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1396e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1397bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 1398bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1399f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 1400bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 1401f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 1402f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 1403bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1404bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const bool print_valobj = flat_output == false || has_value; 1405bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1406bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 140766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1408bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (show_location) 1409bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1410fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham s.Printf("%s: ", valobj->GetLocationAsCString()); 1411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 141266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1413bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 141466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1415a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton // Always show the type for the top level items. 141600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (show_types || (curr_depth == 0 && !flat_output)) 1417427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>")); 141866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 141966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1420bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 1421bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1422b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 1423b01000fd063629facd45044f137446fb748ee179Greg Clayton const bool qualify_cxx_base_classes = show_types; 1424b01000fd063629facd45044f137446fb748ee179Greg Clayton valobj->GetExpressionPath(s, qualify_cxx_base_classes); 1425bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString(" ="); 1426bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1427bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1428bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1429bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 1430bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 1431bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1432bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1433fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!scope_already_checked && !valobj->IsInScope()) 1434bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 143582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton err_cstr = "out of scope"; 1436bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 143766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 143866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1439bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 14401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char *sum_cstr = NULL; 14411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata SummaryFormat* entry = valobj->m_last_summary_format.get(); 1442bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1443bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 1444bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1445fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham val_cstr = valobj->GetValueAsCString(); 1446bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 1447bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 144866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 144966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 145066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 145182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton s.Printf (" <%s>\n", err_cstr); 145266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 145366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 145466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1455f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 1456bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1457bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 14581391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 14591391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata sum_cstr = valobj->GetSummaryAsCString(); 146066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 14611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // We must calculate this value in realtime because entry might alter this variable's value 14621391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // (e.g. by saying ${var%fmt}) and render precached values useless 14631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr)) 14641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.Printf(" %s", valobj->GetValueAsCString()); 146566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1466886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if(sum_cstr) 1467886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 1468886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // for some reason, using %@ (ObjC description) in a summary string, makes 1469886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // us believe we need to reset ourselves, thus invalidating the content of 1470886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty 1471886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // let us recalculate it! 1472886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (sum_cstr[0] == '\0') 1473886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", valobj->GetSummaryAsCString()); 1474886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 1475886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", sum_cstr); 1476886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 1477bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1478bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (use_objc) 1479bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1480fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const char *object_desc = valobj->GetObjectDescription(); 1481bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 1482bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s\n", object_desc); 1483bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1484e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan s.Printf (" [no Objective-C description available]\n"); 1485bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 1486886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 148766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 148866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 148966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (curr_depth < max_depth) 149066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1491f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 1492f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 1493f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 1494f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 1495f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 1496f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1497f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 1498f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 1499f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 1500f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1501f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 1502f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 1503f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1504f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 1505f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 1506b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType ptr_address_type; 1507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (valobj->GetPointerValue (ptr_address_type, true) == 0) 1508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 1509f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 1511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 1513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 1514f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 1515f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 1516f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 1517f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 1520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 1521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 152266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1523886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr)) 152466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1525bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const uint32_t num_children = valobj->GetNumChildren(); 1526bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 152766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1528bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 152966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1530bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1531bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 1532bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1533bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1534bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1535bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 15363f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 1537bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 1538bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1539bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1540bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton for (uint32_t idx=0; idx<num_children; ++idx) 1541bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton ValueObjectSP child_sp(valobj->GetChildAtIndex(idx, true)); 1543bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 1544bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1545bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton DumpValueObject (s, 1546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_sp.get(), 1547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton NULL, 1548f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 1549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton curr_depth + 1, 1550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton max_depth, 1551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_types, 1552bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_location, 1553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton false, 1554e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham use_dynamic, 1555bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton true, 1556bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton flat_output); 1557bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1558bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1559bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1560bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!flat_output) 1561bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1562bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 1563bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 156466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 156566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 1566bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 1567bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1568bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 1569bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1570f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 1571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1572bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1573bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 1574bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 1575bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 1576bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1577bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 157866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 1579bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1580bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 158166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 158266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 158366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 158466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 158566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1586bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 158766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 1588bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 158966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 159066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 159166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 159266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 159366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 159466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 1597fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name) 1598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1599427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 1600427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1601fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded() && m_error.Success()) 1602427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1603fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 1604fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 1605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1606fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 1607fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 1608427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1609fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham clang::ASTContext *ast = GetClangAST (); 1610427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1611fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham DataExtractor data; 1612fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetByteOrder (m_data.GetByteOrder()); 1613fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetAddressByteSize(m_data.GetAddressByteSize()); 1614427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1615801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule()); 1616427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 161747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (exe_scope, 161847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 161947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham GetClangType(), 162047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 162147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham data); 1622fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1623427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1624fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1625fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!valobj_sp) 1626427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 162747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (NULL, m_error); 1628427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1629427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 1630427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1631427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1632427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP 1633bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 1634427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 163547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 163647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 1637e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1638c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 1639c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 1640427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 1642427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1643427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 1644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 1645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 1646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 1647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 1648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 164900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 1650427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 1651427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 1652427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 1653427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 165458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 165558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext exe_ctx; 165658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 165758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 165858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 165958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham clang_ast, 1660427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 1661427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 1662427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 1663427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 1664427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 1665427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 1666427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 1667427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 1668427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 1669427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 167000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 167100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 1672a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 1673427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1674427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 1675427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 1676427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 1677427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 167847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj = new ValueObjectChild (*this, 167947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham clang_ast, 168047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_clang_type, 168147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_name, 168247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_size, 168347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_offset, 168447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_size, 168547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_offset, 168647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_base_class, 168747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_deref_of_parent); 1688427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1689427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1690c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 169147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 1692c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 1693c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 169447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 1695c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 1696427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 1697427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1698c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 1699b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 1700c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1701c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 1702c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 1703c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 1704c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 170547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 1706427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1707427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1708427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1709e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP 1710c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 1711427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 1712e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_addr_of_valobj_sp) 1713e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 1714e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1715b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeInvalid; 1716427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 1717427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address); 1718c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 1719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 1720427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1721427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 1722427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1723c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 1724427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 1725c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 1726c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 1727b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 1728c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 1729c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 1730427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 1731c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1732427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 1733427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 1734427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 1735427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 1737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 1738427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 1739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 1740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 1741427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 174247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(), 174347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 174447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ClangASTContext::CreatePointerType (ast, clang_type), 174547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ConstString (name.c_str()), 174647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham addr, 174747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeInvalid, 174847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_data.GetAddressByteSize()); 1749427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1750427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1751427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 1752427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1753427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 1754e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 1755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 1756427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 17570039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 17580039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 17590039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type) 17600039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 17610039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 17620039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 17630039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 17640039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 17650039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 17660039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 17670039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 17680039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 17690039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 17700039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 17710039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 17720039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 17730039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton clang_ast_type); 17740039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 17750039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 17760039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 17770039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 17780039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 17790039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp) 17800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 17810039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 17820039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 17830039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 17840039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 17850039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 17860039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 17870039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 17880039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 17890039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 17900039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 17910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 17920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 17930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton type_sp); 17940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 17950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 17960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 17970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 17980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 1799fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () : 1800dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_thread_id (LLDB_INVALID_UID), 1801dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_stop_id (0) 1802fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 1803fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 1804fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1805fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected): 1806fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update (true), 1807dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update (true), 180891635093b0282d888fcde84a276ae518643c7fcaJim Ingham m_thread_id (LLDB_INVALID_THREAD_ID), 1809dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_stop_id (0) 1810dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson 1811fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 1812fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 1813fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *computed_exe_scope = exe_scope; // If use_selected is true, we may find a better scope, 1814fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // and if so we want to cache that not the original. 1815fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 1816fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 1817fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.target != NULL) 1818fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1819fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp = exe_ctx.target->GetSP(); 1820fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1821fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.process == NULL) 1822fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.target->GetProcessSP(); 1823fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 1824fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.process->GetSP(); 1825fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1826fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp != NULL) 1827fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1828fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id = m_process_sp->GetStopID(); 1829fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = NULL; 1830fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1831fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.thread == NULL) 1832fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1833fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 1834fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1835fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = m_process_sp->GetThreadList().GetSelectedThread().get(); 1836fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread) 1837fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = thread; 1838fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1839fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1840fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 1841fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = exe_ctx.thread; 1842fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1843fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 1844fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1845fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = thread->GetIndexID(); 1846fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.frame == NULL) 1847fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1848fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 1849fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1850fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get(); 1851fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (frame) 1852fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1853fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = frame->GetStackID(); 1854fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = frame; 1855fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1856fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1857fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1858fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 1859fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = exe_ctx.frame->GetStackID(); 1860fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1861fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1862fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1863fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = computed_exe_scope; 1864fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 1865fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1866fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) : 1867fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope (rhs.m_exe_scope), 1868dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_needs_update(true), 1869dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update(true), 1870fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp (rhs.m_target_sp), 1871fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp (rhs.m_process_sp), 1872fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id (rhs.m_thread_id), 1873fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id (rhs.m_stack_id), 1874fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id (0) 1875fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 1876fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 1877fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1878fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint () 1879fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 1880fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 1881fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1882fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope * 1883fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope () 1884fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 1885fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // We have to update before giving out the scope, or we could be handing out stale pointers. 1886fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SyncWithProcessState(); 1887fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1888fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return m_exe_scope; 1889fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 1890fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1891fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state. If the current 1892fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return 1893fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change". If the current state is different, we update our state, and return 1894fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change". If we did see a change, we also set m_needs_update to true, so 1895fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true. 1896fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1897fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 1898fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState() 1899fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 1900fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we're already invalid, we don't need to do anything, and nothing has changed: 1901fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_stop_id == LLDB_INVALID_UID) 1902fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1903fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Can't update with an invalid state. 1904fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = false; 1905fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 1906fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1907fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1908fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we don't have a process nothing can change. 1909fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_process_sp) 1910fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 1911fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1912fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If our stop id is the current stop ID, nothing has changed: 1913e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham uint32_t cur_stop_id = m_process_sp->GetStopID(); 1914e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_stop_id == cur_stop_id) 1915fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 1916fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1917e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // If the current stop id is 0, either we haven't run yet, or the process state has been cleared. 1918e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // In either case, we aren't going to be able to sync with the process state. 1919e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (cur_stop_id == 0) 1920e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return false; 1921e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1922e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham m_stop_id = cur_stop_id; 1923fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = true; 1924fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = m_process_sp.get(); 1925fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1926fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Something has changed, so we will return true. Now make sure the thread & frame still exist, and if either 1927fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // doesn't, mark ourselves as invalid. 1928fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1929fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_THREAD_ID) 1930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1931fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get(); 1932fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_thread == NULL) 1933bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton { 193491635093b0282d888fcde84a276ae518643c7fcaJim Ingham SetInvalid(); 1935bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton } 1936fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 1937fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1938fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_thread; 1939fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1940fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_stack_id.IsValid()) 1941fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1942fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get(); 1943fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_frame == NULL) 1944fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetInvalid(); 1945fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 1946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_frame; 1947fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1948fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1950fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return true; 1951fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 1952fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1953ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid 1954ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated () 1955ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{ 1956ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_first_update = false; 1957ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_needs_update = false; 1958ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham if (m_process_sp) 1959ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_stop_id = m_process_sp->GetStopID(); 1960ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham} 1961ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 1962ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 1963fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 1964fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope) 1965fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 1966fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!IsValid()) 1967fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 1968fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1969fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool needs_update = false; 1970fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = NULL; 1971fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1972fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // The target has to be non-null, and the 1973fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *target = exe_scope->CalculateTarget(); 1974fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (target != NULL) 1975fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1976fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *old_target = m_target_sp.get(); 1977fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (target == old_target); 1978fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *process = exe_scope->CalculateProcess(); 1979fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (process != NULL) 1980fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1981fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // FOR NOW - assume you can't update variable objects across process boundaries. 1982fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *old_process = m_process_sp.get(); 1983fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (process == old_process); 1984fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 1985fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::user_id_t stop_id = process->GetStopID(); 1986fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (stop_id != m_stop_id) 1987fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1988fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 1989fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id = stop_id; 1990fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 1991fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // See if we're switching the thread or stack context. If no thread is given, this is 1992fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // being evaluated in a global context. 1993fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = exe_scope->CalculateThread(); 1994fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 1995fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1996fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::user_id_t new_thread_index = thread->GetIndexID(); 1997fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_thread_index != m_thread_id) 1998fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 1999fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 2000fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = new_thread_index; 2001fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 2002fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2003fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2004fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *new_frame = exe_scope->CalculateStackFrame(); 2005fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame != NULL) 2006fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2007fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame->GetStackID() != m_stack_id) 2008fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2009fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 2010fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = new_frame->GetStackID(); 2011fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2012fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2013fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 2014fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2015fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 2016fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 2017fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2018fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2019fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 2020fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2021fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If this had been given a thread, and now there is none, we should update. 2022fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Otherwise we don't have to do anything. 2023fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_UID) 2024fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2025fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 2026fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 2027fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 2028fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2029fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2030fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2031fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 2032fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2033fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there is no process, then we don't need to update anything. 2034fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a process to not, we should try to update. 2035fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp.get() != NULL) 2036fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2037fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 2038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 2039fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 2040fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 2041fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2042fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2043fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2044fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 2045fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2046fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there's no target, nothing can change so we don't need to update anything. 2047fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a target to not, we should try to update. 2048fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_target_sp.get() != NULL) 2049fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2050fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 2051fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp.reset(); 2052fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 2053fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 2054fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 2055fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2056fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2057fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_needs_update) 2058fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = needs_update; 2059fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2060fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return needs_update; 2061fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 2062