ValueObject.cpp revision 9ae7cef26612773c6b3422834cec83f0fbb2cf8c
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" 29e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata#include "lldb/Core/ValueObjectSyntheticFilter.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 32cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton 33f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata#include "lldb/Interpreter/ScriptInterpreterPython.h" 34f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 394ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h" 40b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h" 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 43eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata#include "lldb/Utility/RefCounter.h" 4786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granatausing namespace lldb_utility; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 57fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) : 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (++g_value_obj_uid), // Unique identifier for every value object 59fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (&parent), 60dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (parent.GetUpdatePoint ()), 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name (), 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data (), 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value (), 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error (), 6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str (), 6617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str (), 6717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_location_str (), 6817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_summary_str (), 694ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str (), 7047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(parent.GetManager()), 7117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children (), 7217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_synthetic_children (), 7347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 74e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 7547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 7611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format (eFormatDefault), 7723ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 7823ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_summary_format(), 7923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_forced_summary_format(), 8023ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_value_format(), 81e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_synthetic_filter(), 8223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_user_id_of_forced_summary(0), 8317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid (false), 8417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change (false), 8517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid (false), 86427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_old_value_valid (false), 8700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton m_pointers_point_to_load_addrs (false), 881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 89886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 91e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_is_expression_path_child(false), 9286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata m_dump_printable_counter(0) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject(this); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 98fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ExecutionContextScope *exe_scope) : 101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UserID (++g_value_obj_uid), // Unique identifier for every value object 102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (NULL), 103dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (exe_scope), 104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_name (), 105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_data (), 106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value (), 107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error (), 108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str (), 109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str (), 110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_location_str (), 111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str (), 112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_object_desc_str (), 11347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(), 114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children (), 115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_synthetic_children (), 11647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 117e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 11847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_format (eFormatDefault), 12023ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 12123ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_summary_format(), 12223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_forced_summary_format(), 12323ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_value_format(), 124e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_synthetic_filter(), 12523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_user_id_of_forced_summary(0), 126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_is_valid (false), 127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_did_change (false), 128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children_count_valid (false), 129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid (false), 130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_pointers_point_to_load_addrs (false), 1311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 132886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 1339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 134e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_is_expression_path_child(false), 13586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata m_dump_printable_counter(0) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager = new ValueObjectManager(); 13847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject (this); 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor 143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject () 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 149886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format) 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1511391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 152886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (update_format) 153886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata UpdateFormatsIfNeeded(); 1541391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 155d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 156d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 157d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 158d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 159d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool first_update = m_update_point.IsFirstEvaluation(); 161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_update_point.NeedsUpdating()) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetUpdated(); 165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Save the old value using swap to avoid a string copy which 167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // also will clear our m_value_str 168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_value_str.empty()) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = false; 171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = true; 175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str.swap (m_value_str); 176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str.clear(); 177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClearUserVisibleData(); 180f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const bool value_was_valid = GetValueIsValid(); 182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 183ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error.Clear(); 185ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Call the pure virtual function to update the value 187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool success = UpdateValue (); 188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueIsValid (success); 190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (first_update) 192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else if (!m_value_did_change && success == false) 194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // The value wasn't gotten successfully, so we mark this 196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // as changed if the value used to be valid and now isn't 197fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (value_was_valid); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granatavoid 2041391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::UpdateFormatsIfNeeded() 2051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{ 2061391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata /*printf("CHECKING FOR UPDATES. I am at revision %d, while the format manager is at revision %d\n", 2071391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision, 2081391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata Debugger::ValueFormats::GetCurrentRevision());*/ 2091a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (HasCustomSummaryFormat() && m_update_point.GetUpdateID() != m_user_id_of_forced_summary) 2101a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2111a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClearCustomSummaryFormat(); 2121a102087f54079c25c8827afac6153a44ca535daEnrico Granata m_summary_str.clear(); 2131a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 2148a717e596312951672ecd8c54df2d255e6da20baEnrico Granata if (m_last_format_mgr_revision != Debugger::Formatting::ValueFormats::GetCurrentRevision()) 2151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 2161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_summary_format.get()) 217f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_last_summary_format.reset((StringSummaryFormat*)NULL); 2181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_value_format.get()) 219e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_value_format.reset(/*(ValueFormat*)NULL*/); 220e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get()) 221e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_synthetic_filter.reset(/*(SyntheticFilter*)NULL*/); 2229ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata 2239ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata m_synthetic_value = NULL; 2248a717e596312951672ecd8c54df2d255e6da20baEnrico Granata 225e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata Debugger::Formatting::ValueFormats::Get(*this, m_last_value_format); 2268a717e596312951672ecd8c54df2d255e6da20baEnrico Granata Debugger::Formatting::GetSummaryFormat(*this, m_last_summary_format); 227e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata Debugger::Formatting::GetSyntheticFilter(*this, m_last_synthetic_filter); 2288a717e596312951672ecd8c54df2d255e6da20baEnrico Granata 2298a717e596312951672ecd8c54df2d255e6da20baEnrico Granata m_last_format_mgr_revision = Debugger::Formatting::ValueFormats::GetCurrentRevision(); 230f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 231f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClearUserVisibleData(); 2321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 2331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata} 2341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 238e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham UpdateValueIfNeeded(); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 243bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError() 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 245bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton UpdateValueIfNeeded(); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString () 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 258fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded()) 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value.GetValueType()) 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 2706916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterInfo *reg_info = m_value.GetRegisterInfo(); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = "scalar"; 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2; 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 313fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar) 3140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 3150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 316fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 317fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 318fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 3190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ()); 3200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return scalar.IsValid(); 3210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 3220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 3230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 32417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 337fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange () 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 339fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham GetValueAsCString (); 34017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 353917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 354917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 355917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton UpdateValueIfNeeded(); 356917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (idx < GetNumChildren()) 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 358917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check if we have already made the child value object? 359917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (can_create && m_children[idx] == NULL) 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 361917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // No we haven't created the child at this index, so lets have our 362917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // subclass do it and cache the result for quick future access. 363917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton m_children[idx] = CreateChildAtIndex (idx, false, 0); 364e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 365917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 366917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_children[idx] != NULL) 367917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return m_children[idx]->GetSP(); 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 377462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 378427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3855d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 390917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 391917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 392917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton UpdateValueIfNeeded(); 393917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 394917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t> child_indexes; 395917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 396917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton void *clang_type = GetClangType(); 397917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 398917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 399917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 400917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton name.GetCString(), 401917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 402917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_indexes); 403917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (num_child_indexes > 0) 404e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 405917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 406917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator end = child_indexes.end (); 407e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 408917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = GetChildAtIndex(*pos, can_create); 409917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton for (++pos; pos != end; ++pos) 410917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 411917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_sp) 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 413917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 414917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = new_child_sp; 415917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 416917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 417917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 418917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp.reset(); 419e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_children.size(); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children.resize(num_children); 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name) 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name.SetCString(name); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index) 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 458bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham ValueObject *valobj = NULL; 459e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 460917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 46124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = synthetic_array_member; 462917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::string child_name_str; 463917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_byte_size = 0; 464917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton int32_t child_byte_offset = 0; 465917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_size = 0; 466917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_offset = 0; 467917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_base_class = false; 468917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_deref_of_parent = false; 469917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 470917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool transparent_pointers = synthetic_array_member == false; 471917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 472917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t clang_type = GetClangType(); 473917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t child_clang_type; 474917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 475917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ExecutionContext exe_ctx; 476917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 477917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 479917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetName().GetCString(), 481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton idx, 483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton transparent_pointers, 484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 48524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 486917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name_str, 487917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 488917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 489917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 490917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 491917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 492917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 493917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_clang_type && child_byte_size) 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 495917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (synthetic_index) 496917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset += child_byte_size * synthetic_index; 497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 498917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ConstString child_name; 499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!child_name_str.empty()) 500917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name.SetCString (child_name_str.c_str()); 501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 502917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj = new ValueObjectChild (*this, 503917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type, 505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name, 506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 507917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 509917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 512917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_pointers_point_to_load_addrs) 513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs); 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 515e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 51647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 520fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString () 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 522fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded ()) 5231391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 526f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata SummaryFormat *summary_format = GetSummaryFormat().get(); 5271a102087f54079c25c8827afac6153a44ca535daEnrico Granata 5281a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (summary_format) 5291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 530f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str = summary_format->FormatObject(GetSP()); 5311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 532f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata else 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 534f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type_t clang_type = GetClangType(); 535f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 53690d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata // Do some default printout for function pointers 537f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (clang_type) 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 539f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata StreamString sstr; 540f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type_t elem_or_pointee_clang_type; 541f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 542f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetClangAST(), 543f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata &elem_or_pointee_clang_type)); 544f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 545f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ExecutionContextScope *exe_scope = GetExecutionContextScope(); 546f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (exe_scope) 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (ClangASTContext::IsFunctionPointerType (clang_type)) 549fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 550f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata AddressType func_ptr_address_type = eAddressTypeInvalid; 551f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true); 552fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 553f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 554f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 555f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata switch (func_ptr_address_type) 55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 557f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeInvalid: 558f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeFile: 559f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 560f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 561f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeLoad: 56203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 563f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address so_addr; 564f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Target *target = exe_scope->CalculateTarget(); 565f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (target && target->GetSectionLoadList().IsEmpty() == false) 566fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 567f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 568f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 569f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata so_addr.Dump (&sstr, 570f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata exe_scope, 571f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address::DumpStyleResolvedDescription, 572f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address::DumpStyleSectionNameOffset); 573f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 574fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 57503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 576f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 578f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeHost: 579f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 580f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 581f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 582f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (sstr.GetSize() > 0) 583f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 584f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.assign (1, '('); 585f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.append (sstr.GetData(), sstr.GetSize()); 586f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.append (1, ')'); 587fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5991a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool 6001a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer) 6011a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 6021a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 6031a102087f54079c25c8827afac6153a44ca535daEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(), 6041a102087f54079c25c8827afac6153a44ca535daEnrico Granata GetClangAST(), 6051a102087f54079c25c8827afac6153a44ca535daEnrico Granata &elem_or_pointee_clang_type)); 6061a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 6071a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)); 6081a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!is_char_arr_ptr) 6091a102087f54079c25c8827afac6153a44ca535daEnrico Granata return false; 6101a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!check_pointer) 6111a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 6121a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test(ClangASTContext::eTypeIsArray)) 6131a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 6141a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 6151a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 6161a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetAddressOf (cstr_address_type, true); 6171a102087f54079c25c8827afac6153a44ca535daEnrico Granata return (cstr_address != LLDB_INVALID_ADDRESS); 6181a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 6191a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6201a102087f54079c25c8827afac6153a44ca535daEnrico Granatavoid 6211a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ReadPointedString(Stream& s, 6221a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error& error, 62386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t max_length, 62486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool honor_array, 62586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata lldb::Format item_format) 6261a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 6271a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6281a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (max_length == 0) 62986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata max_length = 128; // FIXME this should be a setting, or a formatting parameter 6301a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6311a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t clang_type = GetClangType(); 6321a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 6331a102087f54079c25c8827afac6153a44ca535daEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 6341a102087f54079c25c8827afac6153a44ca535daEnrico Granata GetClangAST(), 6351a102087f54079c25c8827afac6153a44ca535daEnrico Granata &elem_or_pointee_clang_type)); 6361a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 6371a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 6381a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6391a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExecutionContextScope *exe_scope = GetExecutionContextScope(); 6401a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (exe_scope) 6411a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6421a102087f54079c25c8827afac6153a44ca535daEnrico Granata Target *target = exe_scope->CalculateTarget(); 6431a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (target != NULL) 6441a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6451a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 6461a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 6471a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6481a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t cstr_len = 0; 6491a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool capped_data = false; 6501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test (ClangASTContext::eTypeIsArray)) 6511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6521a102087f54079c25c8827afac6153a44ca535daEnrico Granata // We have an array 6531a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_len = ClangASTContext::GetArraySize (clang_type); 65486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (cstr_len > max_length) 6551a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 65686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata capped_data = true; 65786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len = max_length; 6581a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6591a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetAddressOf (cstr_address_type, true); 6601a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6611a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 6621a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6631a102087f54079c25c8827afac6153a44ca535daEnrico Granata // We have a pointer 6641a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetPointerValue (cstr_address_type, true); 6651a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6661a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (cstr_address != LLDB_INVALID_ADDRESS) 6671a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6681a102087f54079c25c8827afac6153a44ca535daEnrico Granata Address cstr_so_addr (NULL, cstr_address); 6691a102087f54079c25c8827afac6153a44ca535daEnrico Granata DataExtractor data; 6701a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t bytes_read = 0; 6711a102087f54079c25c8827afac6153a44ca535daEnrico Granata std::vector<char> data_buffer; 6721a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool prefer_file_cache = false; 67386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (cstr_len > 0 && honor_array) 6741a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6751a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.resize(cstr_len); 6761a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder()); 6771a102087f54079c25c8827afac6153a44ca535daEnrico Granata bytes_read = target->ReadMemory (cstr_so_addr, 6781a102087f54079c25c8827afac6153a44ca535daEnrico Granata prefer_file_cache, 6791a102087f54079c25c8827afac6153a44ca535daEnrico Granata &data_buffer.front(), 6801a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_len, 6811a102087f54079c25c8827afac6153a44ca535daEnrico Granata error); 6821a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (bytes_read > 0) 6831a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6841a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 6851a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.Dump (&s, 6861a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // Start offset in "data" 68786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata item_format, 6881a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1, // Size of item (1 byte for a char!) 6891a102087f54079c25c8827afac6153a44ca535daEnrico Granata bytes_read, // How many bytes to print? 6901a102087f54079c25c8827afac6153a44ca535daEnrico Granata UINT32_MAX, // num per line 6911a102087f54079c25c8827afac6153a44ca535daEnrico Granata LLDB_INVALID_ADDRESS,// base address 6921a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // bitfield bit size 6931a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0); // bitfield bit offset 6941a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (capped_data) 6951a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << "..."; 6961a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 6971a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6981a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6991a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 7001a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 70186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len = max_length; 70286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata const size_t k_max_buf_size = 64; 7031a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.resize (k_max_buf_size + 1); 7041a102087f54079c25c8827afac6153a44ca535daEnrico Granata // NULL terminate in case we don't get the entire C string 7051a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.back() = '\0'; 7061a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7071a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7081a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7091a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder()); 7101a102087f54079c25c8827afac6153a44ca535daEnrico Granata while ((bytes_read = target->ReadMemory (cstr_so_addr, 7111a102087f54079c25c8827afac6153a44ca535daEnrico Granata prefer_file_cache, 7121a102087f54079c25c8827afac6153a44ca535daEnrico Granata &data_buffer.front(), 7131a102087f54079c25c8827afac6153a44ca535daEnrico Granata k_max_buf_size, 7141a102087f54079c25c8827afac6153a44ca535daEnrico Granata error)) > 0) 7151a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 7161a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t len = strlen(&data_buffer.front()); 7171a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len == 0) 7181a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 7191a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len > bytes_read) 7201a102087f54079c25c8827afac6153a44ca535daEnrico Granata len = bytes_read; 72186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (len > cstr_len) 72286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata len = cstr_len; 7231a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7241a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.Dump (&s, 7251a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // Start offset in "data" 72686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata item_format, 7271a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1, // Size of item (1 byte for a char!) 7281a102087f54079c25c8827afac6153a44ca535daEnrico Granata len, // How many bytes to print? 7291a102087f54079c25c8827afac6153a44ca535daEnrico Granata UINT32_MAX, // num per line 7301a102087f54079c25c8827afac6153a44ca535daEnrico Granata LLDB_INVALID_ADDRESS,// base address 7311a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // bitfield bit size 7321a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0); // bitfield bit offset 7331a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7341a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len < k_max_buf_size) 7351a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 73686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (len >= cstr_len) 73786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 73886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << "..."; 73986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 74086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 74186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len -= len; 7421a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_so_addr.Slide (k_max_buf_size); 7431a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7441a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7451a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7461a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7471a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7481a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7491a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7501a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 7511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 7521a102087f54079c25c8827afac6153a44ca535daEnrico Granata error.SetErrorString("impossible to read a string from this object"); 7531a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7541a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 7551a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7564ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 757fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription () 7584ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 759886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 760fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!UpdateValueIfNeeded ()) 7614ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 762886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 763886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!m_object_desc_str.empty()) 764886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_object_desc_str.c_str(); 765886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 766fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 767fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope == NULL) 768fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return NULL; 769fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 7704ae519666628cca07c194bf677163009cc2e5a8bJim Ingham Process *process = exe_scope->CalculateProcess(); 771b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 7724ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 773b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 774b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 7754ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 776b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham lldb::LanguageType language = GetObjectRuntimeLanguage(); 777b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 7784ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 7790e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 7800e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 78170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway... 7820e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 7830e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 7840e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 78570c55622e15857e232cf4777a502fa5fe40e785bJim Ingham bool is_signed; 78670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed) 78770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham || ClangASTContext::IsPointerType (opaque_qual_type)) 78870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham { 7890e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC); 79070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham } 7910e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 7920e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 7930e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 7940de37195f17fefb536157b3296a18999116b8125Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this)) 7954ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 7964ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 7974ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 798e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 799e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 800e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 801e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 802e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 8034ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 806fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString () 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If our byte size is zero this is an aggregate type that has children 809462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (ClangASTContext::IsAggregateType (GetClangType()) == false) 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 811fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded()) 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Value::ContextType context_type = m_value.GetContextType(); 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (context_type) 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeClangType: 8206916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeLLDBType: 8216916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeVariable: 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 823f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType (); 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 826f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (m_last_value_format) 8271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 828f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str = m_last_value_format->FormatObject(GetSP()); 8291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 83182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 832f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata StreamString sstr; 833f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Format format = GetFormat(); 834f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (format == eFormatDefault) 835f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata format = (m_is_bitfield_for_scalar ? eFormatUnsigned : 836f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClangASTType::GetFormat(clang_type)); 837f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 838f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (ClangASTType::DumpTypeValue (GetClangAST(), // The clang AST 839f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type, // The clang type to display 840f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata &sstr, 841f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata format, // Format to display this type with 842f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_data, // Data to extract from 843f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 0, // Byte offset into "m_data" 844f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetByteSize(), // Byte size of item in "m_data" 845f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetBitfieldBitSize(), // Bitfield bit size 846f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetBitfieldBitOffset())) // Bitfield bit offset 847f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.swap(sstr.GetString()); 848f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata else 849f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 850f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)", 851f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_data.GetByteSize(), 852f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetByteSize()); 853f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.clear(); 854f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 85582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeRegisterInfo: 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString reg_sstr; 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.Dump(®_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(reg_sstr.GetString()); 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 87154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 87254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 87354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 87717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_value_did_change && m_old_value_valid) 87817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 87917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value was gotten successfully, so we consider the 88017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // value as changed if the value string differs 88117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (m_old_value_str != m_value_str); 88217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 890de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// this call should only return pointers to data that needs no special memory management 891de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// (either because they are hardcoded strings, or because they are backed by some other 892de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// object); returning any new()-ed or malloc()-ed data here, will lead to leaks! 893886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granataconst char * 894886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::GetPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, 895886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata lldb::Format custom_format) 896886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 89786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 89886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata RefCounter ref(&m_dump_printable_counter); 89986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 90090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (custom_format != lldb::eFormatInvalid) 901886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata SetFormat(custom_format); 902886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 903886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata const char * return_value; 904886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 905886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata switch(val_obj_display) 906886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 907886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayValue: 908886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetValueAsCString(); 909886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 910886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplaySummary: 911886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetSummaryAsCString(); 912886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 913886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayLanguageSpecific: 914886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetObjectDescription(); 915886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 916f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eDisplayLocation: 917f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata return_value = GetLocationAsCString(); 918f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 919886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 920886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 92186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // this code snippet might lead to endless recursion, thus we use a RefCounter here to 92286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // check that we are not looping endlessly 92386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!return_value && (m_dump_printable_counter < 3)) 9249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 9259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // try to pick the other choice 9269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (val_obj_display == eDisplayValue) 9279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return_value = GetSummaryAsCString(); 9289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (val_obj_display == eDisplaySummary) 929de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 930de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == true) 931de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 932de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata // this thing has no value 933de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata return_value = "<no summary defined for this datatype>"; 934de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 935de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else 936de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata return_value = GetValueAsCString(); 937de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 9389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 939886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 940de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata return (return_value ? return_value : "<no printable representation>"); 9419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 9429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 943886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 9449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 9459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s, 9469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectRepresentationStyle val_obj_display, 9479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata lldb::Format custom_format) 9489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 94986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 95086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata clang_type_t elem_or_pointee_type; 95186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type)); 9521a102087f54079c25c8827afac6153a44ca535daEnrico Granata 95386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) 95486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata && val_obj_display == ValueObject::eDisplayValue) 9551a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 95686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // when being asked to get a printable display an array or pointer type directly, 95786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // try to "do the right thing" 95886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 95986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (IsCStringContainer(true) && 96086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCString || 96186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatCharArray || 96286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatChar || 96386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatVectorOfChar)) // print char[] & char* directly 96486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 96586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata Error error; 96686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ReadPointedString(s, 96786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata error, 96886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 0, 96986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfChar) || 97086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCharArray)); 97186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return !error.Fail(); 97286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 97386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 97486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (custom_format == lldb::eFormatEnum) 97586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return false; 97686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 97786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // this only works for arrays, because I have no way to know when 97886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // the pointed memory ends, and no special \0 end of data marker 97986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (flags.Test(ClangASTContext::eTypeIsArray)) 98086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 98186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatBytes) || 98286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatBytesWithASCII)) 98386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 98486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t count = GetNumChildren(); 98586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 98686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << '['; 98786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata for (uint32_t low = 0; low < count; low++) 98886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 98986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 99086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (low) 99186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ','; 99286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 99386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 99486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!child.get()) 99586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 996de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata s << "<invalid child>"; 99786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata continue; 99886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 99986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, custom_format); 100086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 100186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 100286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ']'; 100386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 100486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return true; 100586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 100686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 100786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatVectorOfChar) || 100886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfFloat32) || 100986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfFloat64) || 101086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt16) || 101186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt32) || 101286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt64) || 101386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt8) || 101486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt128) || 101586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt16) || 101686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt32) || 101786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt64) || 101886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly 101986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 102086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t count = GetNumChildren(); 102186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 102286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata lldb::Format format = FormatManager::GetSingleItemFormat(custom_format); 102386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 102486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << '['; 102586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata for (uint32_t low = 0; low < count; low++) 102686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 102786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 102886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (low) 102986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ','; 103086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 103186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 103286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!child.get()) 103386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1034de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata s << "<invalid child>"; 103586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata continue; 103686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 103786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, format); 103886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 103986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 104086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ']'; 104186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 104286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return true; 104386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 104486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 104586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 104686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatBoolean) || 104786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatBinary) || 104886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatChar) || 104986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCharPrintable) || 105086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplexFloat) || 105186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatDecimal) || 105286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatHex) || 105386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatFloat) || 105486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatOctal) || 105586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatOSType) || 105686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnicode16) || 105786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnicode32) || 105886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnsigned) || 105986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatPointer) || 106086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplexInteger) || 106186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplex) || 106286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatDefault)) // use the [] operator 106386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return false; 10641a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 106586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata const char *targetvalue = GetPrintableRepresentation(val_obj_display, custom_format); 106690d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (targetvalue) 106786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s.PutCString(targetvalue); 106886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool var_success = (targetvalue != NULL); 106990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (custom_format != eFormatInvalid) 107086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata SetFormat(eFormatDefault); 107186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return var_success; 1072886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 1073886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 107403e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 1075b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address) 1076f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 1077e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!UpdateValueIfNeeded()) 1078e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return LLDB_INVALID_ADDRESS; 1079e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1080f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 1081f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 1083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 1084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeLoad; 1086f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1087f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1088f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1089f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1090f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 1091f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 1092f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 1093f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1094f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = m_value.GetValueAddressType (); 1095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1096f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1097f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1098f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1099f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeInvalid; 1100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 1101f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 1102f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1103f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 1104b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address) 110503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 110603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t address = LLDB_INVALID_ADDRESS; 110703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeInvalid; 1108e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1109e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!UpdateValueIfNeeded()) 1110e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return address; 1111e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1112f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 111303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 111403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 111503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (scalar_is_load_address) 111603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 111703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 111803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 111903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 112003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 112103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 112203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 112303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 112403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeHostAddress: 112503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 112603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton uint32_t data_offset = 0; 112703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 112803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = m_value.GetValueAddressType(); 112903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (address_type == eAddressTypeInvalid) 113003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 113103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 113203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 113303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 1134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1135427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 1136427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton address_type = eAddressTypeLoad; 1137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 113803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 113903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 114003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str) 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 1146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!UpdateValueIfNeeded()) 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 1150462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *end = NULL; 1153bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingInvalid: 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingUint: 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(unsigned long long)) 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned long long ull_val = strtoull(value_str, &end, 0); 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1169801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value.GetScalar() = ull_val; 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingSint: 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(long long)) 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long long sll_val = strtoll(value_str, &end, 0); 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1185801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value.GetScalar() = sll_val; 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingIEEE754: 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const off_t byte_offset = GetByteOffset(); 119454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size)); 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst != NULL) 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We are decoding a float into host byte order below, so make 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sure m_data knows what it contains. 1199cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton m_data.SetByteOrder(lldb::endian::InlHostByteOrder()); 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetClangAST(), 1202462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value_str, 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst, 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size); 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (converted_byte_size == byte_size) 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingVector: 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we have made it here the value is in m_data and we should write it 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // out to the target 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (); 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write () 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the update ID so the next time we try and read the value 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we try and read it again. 1231fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetNeedsUpdate(); 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: when Value has a method to write a value back, call it from here. 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1238b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType 1239b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 1240b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 1241f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t opaque_qual_type = GetClangType(); 1242b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (opaque_qual_type == NULL) 1243b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 1244b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1245b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham // If the type is a reference, then resolve it to what it refers to first: 1246b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType()); 1247b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isAnyPointerType()) 1248b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 1249b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (qual_type->isObjCObjectPointerType()) 1250b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1251b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1252b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham clang::QualType pointee_type (qual_type->getPointeeType()); 1253b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->getCXXRecordDeclForPointerType() != NULL) 1254b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 1255b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCObjectOrInterfaceType()) 1256b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1257b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (pointee_type->isObjCClassType()) 1258b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1259b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 1260b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham else 1261b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham { 1262b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (ClangASTContext::IsObjCClassType (opaque_qual_type)) 1263b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeObjC; 1264974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen if (ClangASTContext::IsCXXClassType (opaque_qual_type)) 1265b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC_plus_plus; 1266b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham } 1267b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1268b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham return lldb::eLanguageTypeC; 1269b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 1270b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 127247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj) 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 127447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_synthetic_children[key] = valobj; 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 128147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key); 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 128347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = pos->second->GetSP(); 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1290462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129370c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool 129424b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType () 129524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 129624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return ClangASTContext::IsArrayType (GetClangType()); 129724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 129824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 129924b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool 13009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType () 13019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 13029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return ClangASTContext::IsScalarType (GetClangType()); 13039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 13049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 13059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 130670c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed) 130770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{ 130870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham return ClangASTContext::IsIntegerType (GetClangType(), is_signed); 130970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham} 1310f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPointerOrReferenceType (GetClangType()); 131582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 131682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 131782f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 131882f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType () 131982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{ 132082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType()); 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1323917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool 1324917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType () 1325917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 1326917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType()); 1327917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 1328917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create) 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(index_str, sizeof(index_str), "[%i]", index); 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 134347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *synthetic_child; 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 134647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child = CreateChildAtIndex(0, true, index); 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 134947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (synthetic_child) 135047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham { 135147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham AddSyntheticChild(index_const_str, synthetic_child); 135247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = synthetic_child->GetSP(); 1353886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->SetName(index_str); 1354886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->m_is_array_item_for_pointer = true; 135547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham } 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1360642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 136124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index 136224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array. 136324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as: 136424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection 136524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// { 136624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// uint32_t item_count; 136724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Item item_array[0]; 136824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// }; 136924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice 137024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array". 137124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 137224b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP 137324b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create) 137424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 137524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP synthetic_child_sp; 137624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (IsArrayType ()) 137724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 137824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton char index_str[64]; 137924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton snprintf(index_str, sizeof(index_str), "[%i]", index); 138024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ConstString index_const_str(index_str); 138124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Check if we have already created a synthetic array member in this 138224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // valid object. If we have we will re-use it. 138324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = GetSyntheticChild (index_const_str); 138424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!synthetic_child_sp) 138524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 138624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObject *synthetic_child; 138724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // We haven't made a synthetic array member for INDEX yet, so 138824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // lets make one and cache it for any future reference. 138924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child = CreateChildAtIndex(0, true, index); 139024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 139124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Cache the value if we got one back... 139224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (synthetic_child) 139324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 139424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton AddSyntheticChild(index_const_str, synthetic_child); 139524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = synthetic_child->GetSP(); 139624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp->SetName(index_str); 139724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp->m_is_array_item_for_pointer = true; 139824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 139924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 140024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 140124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return synthetic_child_sp; 140224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 140324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 14049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP 14059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create) 14069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 14079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP synthetic_child_sp; 14089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (IsScalarType ()) 14099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14109762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char index_str[64]; 14119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to); 14129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ConstString index_const_str(index_str); 14139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Check if we have already created a synthetic array member in this 14149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // valid object. If we have we will re-use it. 14159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = GetSyntheticChild (index_const_str); 14169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!synthetic_child_sp) 14179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectChild *synthetic_child; 14199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // We haven't made a synthetic array member for INDEX yet, so 14209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // lets make one and cache it for any future reference. 14219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child = new ValueObjectChild(*this, 14229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangAST(), 14239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangType(), 14249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata index_const_str, 14259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetByteSize(), 14269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 0, 14279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata to-from+1, 14289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata from, 14299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false, 14309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false); 14319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 14329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Cache the value if we got one back... 14339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (synthetic_child) 14349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata AddSyntheticChild(index_const_str, synthetic_child); 14369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = synthetic_child->GetSP(); 14379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->SetName(index_str); 14389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->m_is_bitfield_for_scalar = true; 14399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return synthetic_child_sp; 14439762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 14449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1445e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or -> 1446e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has 1447e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown 1448e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means 1449e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off 1450e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char* 1451e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression) 1452e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1453e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!expression || !expression[0]) 1454e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 1455e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '.') 1456e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+1; 1457e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '-' && expression[1] == '>') 1458e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+2; 1459e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 1460e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1461e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1462e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatalldb::ValueObjectSP 1463e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create) 1464e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1465e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synthetic_child_sp; 1466e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ConstString name_const_string(expression); 1467e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Check if we have already created a synthetic array member in this 1468e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // valid object. If we have we will re-use it. 1469e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetSyntheticChild (name_const_string); 1470e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!synthetic_child_sp) 1471e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 1472e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // We haven't made a synthetic array member for expression yet, so 1473e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // lets make one and cache it for any future reference. 1474e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetValueForExpressionPath(expression); 1475e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1476e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Cache the value if we got one back... 1477e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (synthetic_child_sp.get()) 1478e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 1479e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata AddSyntheticChild(name_const_string, synthetic_child_sp.get()); 1480e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp->SetName(SkipLeadingExpressionPathSeparators(expression)); 1481e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp->m_is_expression_path_child = true; 1482e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 1483e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 1484e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return synthetic_child_sp; 1485e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1486e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1487e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid 1488e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::CalculateSyntheticValue (lldb::SyntheticValueType use_synthetic) 1489e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1490e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (use_synthetic == lldb::eNoSyntheticFilter) 1491e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 1492e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1493e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata UpdateFormatsIfNeeded(); 1494e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1495e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get() == NULL) 1496e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 1497e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 14989ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata if (m_synthetic_value == NULL) 14999ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata m_synthetic_value = new ValueObjectSynthetic(*this, m_last_synthetic_filter); 1500e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1501e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1502e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1503e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid 150410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic) 1505642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 150610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 150710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return; 150810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 150947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (!m_dynamic_value && !IsDynamic()) 1510e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1511e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham Process *process = m_update_point.GetProcess(); 1512e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool worth_having_dynamic_value = false; 1513642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1514e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1515e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // FIXME: Process should have some kind of "map over Runtimes" so we don't have to 1516e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // hard code this everywhere. 1517e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham lldb::LanguageType known_type = GetObjectRuntimeLanguage(); 1518e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC) 1519e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1520e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime (known_type); 1521e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (runtime) 1522e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this); 1523e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1524e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham else 1525e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1526e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus); 1527e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (cpp_runtime) 1528e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this); 1529e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1530e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!worth_having_dynamic_value) 1531e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1532e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC); 1533e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (objc_runtime) 153410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this); 1535e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1536e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1537e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1538e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (worth_having_dynamic_value) 153910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 154047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 154147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// if (worth_having_dynamic_value) 154247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager); 1543e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1544e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1545e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham} 1546e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 154747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 154810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic) 1549e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{ 155010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 155110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return ValueObjectSP(); 155210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 155310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (!IsDynamic() && m_dynamic_value == NULL) 1554e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 155510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham CalculateDynamicValue(use_dynamic); 1556e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 155747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_dynamic_value) 155847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_dynamic_value->GetSP(); 155947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 156047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 1561642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 156266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1563e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// GetDynamicValue() returns a NULL SharedPointer if the object is not dynamic 1564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// or we do not really want a dynamic VO. this method instead returns this object 1565e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// itself when making it synthetic has no meaning. this makes it much simpler 1566e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to replace the SyntheticValue for the ValueObject 1567e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP 1568e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticValue (SyntheticValueType use_synthetic) 1569e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1570e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (use_synthetic == lldb::eNoSyntheticFilter) 1571e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1572e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1573e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata UpdateFormatsIfNeeded(); 1574e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1575e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get() == NULL) 1576e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1577e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1578e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata CalculateSyntheticValue(use_synthetic); 1579e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1580e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_synthetic_value) 1581e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return m_synthetic_value->GetSP(); 1582e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata else 1583e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1584e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1585e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 158600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 158700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 158800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 158900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 159000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1591e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s); 159200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t clang_type = GetClangType(); 159300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 159400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name); 159500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 159600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 159700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 159800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 159900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 160000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 160100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 160200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 160300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 160400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 160500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 160600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 160700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 160800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 160900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 1610e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()) 161100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1612e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()->IsBaseClass()) 1613e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent()->GetNonBaseClassParent(); 161400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 1615e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent(); 161600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 161700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 161800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 161966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 162066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 16211391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 1622bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 162300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 162400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 162590d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (is_deref_of_parent && epformat == eDereferencePointers) { 16261391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely 16271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName. 16281391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // the eHonorPointers mode is meant to produce strings in this latter format 16291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("*("); 16301391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 163100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 16321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ValueObject* parent = GetParent(); 16331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 16341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (parent) 16351391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat); 1636886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1637886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // if we are a deref_of_parent just because we are synthetic array 1638886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // members made up to allow ptr[%d] syntax to work in variable 1639886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // printing, then add our name ([%d]) to the expression path 164090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (m_is_array_item_for_pointer && epformat == eHonorPointers) 1641886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(m_name.AsCString()); 16421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 164300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 164400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 164500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 1646bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 164700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 164800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 1649bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 165000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 165100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 165200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 165300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL); 165400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 165590d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers) 165600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 165700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 165800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 16591391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 16601391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 16611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer) 16621391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 16631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("->"); 16641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 16651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) && 16661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray)) 16671391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 16681391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutChar('.'); 16691391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 167000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 167100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 1672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 167300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 167400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 167500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 1676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 167700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 167800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 167900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 168000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 168100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 168200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 1683bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1684bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1685bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1686bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 16871391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (is_deref_of_parent && epformat == eDereferencePointers) { 168800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 16891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1690bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1691bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1692ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP 1693ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression, 1694ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 1695ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 1696ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_value_type, 1697ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 1698ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* final_task_on_target) 1699ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 1700ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1701ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* dummy_first_unparsed; 1702ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 1703ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType dummy_final_value_type; 1704ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing; 1705ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1706ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 1707ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 1708ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 1709ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 1710ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1711ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 1712ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1713ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing) 1714ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1715ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; 1716ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1717ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects 1718ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1719ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*final_task_on_target == ValueObject::eDereference) 1720ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1721ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 1722ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 1723ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 1724ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1725ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 1726ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_value_type = ValueObject::eInvalid; 1727ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1728ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1729ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1730ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1731ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_task_on_target = ValueObject::eNothing; 1732ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 1733ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1734ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1735ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*final_task_on_target == ValueObject::eTakeAddress) 1736ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1737ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 1738ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 1739ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 1740ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1741ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eTakingAddressFailed; 1742ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_value_type = ValueObject::eInvalid; 1743ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1744ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1745ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1746ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1747ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_task_on_target = ValueObject::eNothing; 1748ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 1749ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1750ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1751ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1752ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; // final_task_on_target will still have its original value, so you know I did not do it 1753ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 1754ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 17551a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 17561a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression, 17571a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectListSP& list, 17581a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 17591a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 17601a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_value_type, 17611a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 17621a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* final_task_on_target) 17631a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 17641a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* dummy_first_unparsed; 17651a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 17661a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType dummy_final_value_type; 17671a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing; 17681a102087f54079c25c8827afac6153a44ca535daEnrico Granata 17691a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 17701a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 17711a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 17721a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 17731a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 17741a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 17751a102087f54079c25c8827afac6153a44ca535daEnrico Granata 17761a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!ret_val.get()) // if there are errors, I add nothing to the list 17771a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 17781a102087f54079c25c8827afac6153a44ca535daEnrico Granata 17791a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*reason_to_stop != eArrayRangeOperatorMet) 17801a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 17811a102087f54079c25c8827afac6153a44ca535daEnrico Granata // I need not expand a range, just post-process the final value and return 17821a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing) 17831a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 17841a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 17851a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 17861a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 17871a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects 17881a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 17891a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*final_task_on_target == ValueObject::eDereference) 17901a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 17911a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 17921a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 17931a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 17941a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 17951a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 17961a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_value_type = ValueObject::eInvalid; 17971a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 17981a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 17991a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 18001a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18011a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_task_on_target = ValueObject::eNothing; 18021a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 18031a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 18041a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18051a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18061a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*final_task_on_target == ValueObject::eTakeAddress) 18071a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18081a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 18091a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 18101a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 18111a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18121a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eTakingAddressFailed; 18131a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_value_type = ValueObject::eInvalid; 18141a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 18151a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18161a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 18171a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18181a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_task_on_target = ValueObject::eNothing; 18191a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 18201a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 18211a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18221a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18231a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18241a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18251a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 18261a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18271a102087f54079c25c8827afac6153a44ca535daEnrico Granata return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed, 18281a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 18291a102087f54079c25c8827afac6153a44ca535daEnrico Granata ret_val, 18301a102087f54079c25c8827afac6153a44ca535daEnrico Granata list, 18311a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 18321a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 18331a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 18341a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 18351a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18361a102087f54079c25c8827afac6153a44ca535daEnrico Granata // in any non-covered case, just do the obviously right thing 18371a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 18381a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 18391a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 18401a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP 1842ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr, 1843ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 1844ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 1845ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_result, 1846ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 1847ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* what_next) 1848ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 1849ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP root = GetSP(); 1850ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1851ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 1852ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1853ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1854ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1855ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1856ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata while (true) 1857ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1858ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1859ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 1860ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1861ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata lldb::clang_type_t root_clang_type = root->GetClangType(); 18621a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t pointee_clang_type; 18631a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 18641a102087f54079c25c8827afac6153a44ca535daEnrico Granata 18651a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 18661a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 18671a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 1868ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1869ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!expression_cstr || *expression_cstr == '\0') 1870ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1871ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEndOfString; 1872ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 1873ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1874ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1875ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata switch (*expression_cstr) 1876ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1877ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '-': 1878ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1879ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && 18801a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error 1881ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1882ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1883ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrowInsteadOfDot; 1884ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1885ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1886ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 18871a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) && // if yo are trying to extract an ObjC IVar when this is forbidden 18881a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && 1889ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options.m_no_fragile_ivar) 1890ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1891ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1892ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eFragileIVarNotAllowed; 1893ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1894ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1895ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1896ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (expression_cstr[1] != '>') 1897ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1898ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1899ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 1900ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1901ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1902ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1903ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip the - 1904ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1905ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '.': // or fallthrough from -> 1906ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1907ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' && 19081a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error 1909ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1910ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1911ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDotInsteadOfArrow; 1912ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1913ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1914ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1915ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip . 1916ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *next_separator = strpbrk(expression_cstr+1,"-.["); 1917ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString child_name; 1918ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!next_separator) // if no other separator just expand this last layer 1919ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1920ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCString (expression_cstr); 1921ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetChildMemberWithName(child_name, true); 1922ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (root.get()) // we know we are done, so just return 1923ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1924ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = '\0'; 1925ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEndOfString; 1926ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 1927ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 1928ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1929ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1930ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1931ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1932ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 1933ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1934ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1935ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1936ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1937ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // other layers do expand 1938ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1939ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr); 1940ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetChildMemberWithName(child_name, true); 1941ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (root.get()) // store the new root and move on 1942ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1943ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = next_separator; 1944ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 1945ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 1946ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1947ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1948ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1949ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1950ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 1951ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1952ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1953ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1954ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 1956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '[': 1958ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 19591a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T* 1960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 19611a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 1962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1964ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eRangeOperatorInvalid; 1965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 1969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1971ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eRangeOperatorNotAllowed; 1972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 1977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 19781a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 1979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1980ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1981ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 1982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // even if something follows, we cannot expand unbounded ranges, just let the caller do it 1986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 1988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 1989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eUnboundedRange; 1990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 1991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 1994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 1995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 1996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 1999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2002ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 2003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2004ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 2006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2011ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 2014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 20151a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2018ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eUnboundedRange; 2020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2022ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2024ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 2026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata // from here on we do have a valid index 20311a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 203324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true); 203424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!child_valobj_sp) 203524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true); 203624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (child_valobj_sp) 203724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 203824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton root = child_valobj_sp; 203924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *first_unparsed = end+1; // skip ] 204024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *final_result = ValueObject::ePlain; 204124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton continue; 204224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 204324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton else 2044ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2045ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2046ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2047ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2048ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2049ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2050ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 20511a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 2052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*what_next == ValueObject::eDereference && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield 20541a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2057ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2058ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2059ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2060ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2061ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 2062ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2063ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2064ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2065ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2066ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2067ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next = eNothing; 2068ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2069ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2070ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2071ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2072ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2073ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 2074ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2075ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2076ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2077ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2078ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2079ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2080ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2081ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2082ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2083ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2084ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 2085ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2086ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2087ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2088ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2089ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 2090ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2091ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 2092ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2093ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2094ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2095ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2096ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2097ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2098ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2099ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 2100ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2101ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2102ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet; 2103ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBitfield; 2104ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2105ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2106ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2107ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2108ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we have a low and a high index 2109ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2110ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2111ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 2112ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 2113ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2114ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2115ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2116ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2117ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2118ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2119ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 2120ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2121ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2122ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2123ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2124ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2125ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2126ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2127ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (index_lower > index_higher) // swap indices if required 2128ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2129ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long temp = index_lower; 2130ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_lower = index_higher; 2131ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_higher = temp; 2132ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 21331a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 2134ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2135ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 2136ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2137ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2138ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2139ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2142ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet; 2147ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBitfield; 2148ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2149ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2150ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 21511a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield 2152ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next == ValueObject::eDereference && 21531a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2154ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2155ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2156ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2157ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2158ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2159ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2160ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 2161ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2162ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2163ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2164ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2165ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2166ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next = ValueObject::eNothing; 2167ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2168ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2169ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2170ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2171ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2172ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2173ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2174ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBoundedRange; 2175ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2176ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2177ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2178ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2179ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2180ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata default: // some non-separator is in the way 2181ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2182ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2184ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2186ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2187ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2188ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2189ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2190ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 2191ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 21921a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 21931a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr, 21941a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 21951a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectSP root, 21961a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectListSP& list, 21971a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 21981a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_result, 21991a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 22001a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* what_next) 22011a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 22021a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 22031a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 22041a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22051a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22061a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22071a102087f54079c25c8827afac6153a44ca535daEnrico Granata while (true) 22081a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22091a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22101a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 22111a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22121a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t root_clang_type = root->GetClangType(); 22131a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t pointee_clang_type; 22141a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 22151a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22161a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 22171a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 22181a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 22191a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22201a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!expression_cstr || *expression_cstr == '\0') 22211a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22221a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEndOfString; 22231a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 22241a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 22251a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22261a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22271a102087f54079c25c8827afac6153a44ca535daEnrico Granata switch (*expression_cstr) 22281a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22291a102087f54079c25c8827afac6153a44ca535daEnrico Granata case '[': 22301a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22311a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T* 22321a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22331a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 22341a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22351a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22361a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorInvalid; 22371a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 22381a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 22391a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22401a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 22411a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22421a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22431a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorNotAllowed; 22441a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 22451a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 22461a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22471a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22481a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 22491a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 22511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22521a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22531a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 22541a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 22551a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 22561a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22571a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // expand this into list 22581a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22591a102087f54079c25c8827afac6153a44ca535daEnrico Granata int max_index = root->GetNumChildren() - 1; 22601a102087f54079c25c8827afac6153a44ca535daEnrico Granata for (int index = 0; index < max_index; index++) 22611a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22621a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 22631a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 22641a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 22651a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22661a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 22671a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 22681a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 22691a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 22701a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22711a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22721a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 22731a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 22741a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 22751a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22761a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22771a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 22781a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 22791a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 22801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22811a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 22821a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22831a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 22841a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 22851a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 22861a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22871a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22881a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 22891a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 22901a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 22911a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22921a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 22931a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22941a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 22951a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22961a102087f54079c25c8827afac6153a44ca535daEnrico Granata int max_index = root->GetNumChildren() - 1; 22971a102087f54079c25c8827afac6153a44ca535daEnrico Granata for (int index = 0; index < max_index; index++) 22981a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22991a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 23001a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 23011a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 23021a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23031a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 23041a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 23051a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 23061a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 23071a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23081a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 23091a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23101a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23111a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 23121a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23131a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23141a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23151a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23161a102087f54079c25c8827afac6153a44ca535daEnrico Granata // from here on we do have a valid index 23171a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 23181a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23191a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetChildAtIndex(index, true); 23201a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 23211a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23221a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23231a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 23241a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23251a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23261a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23271a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 23281a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23291a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 23301a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 23311a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 23321a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 23331a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 23341a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23351a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23361a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 23371a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23381a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*what_next == ValueObject::eDereference && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield 23391a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 23401a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23411a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 23421a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 23431a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 23441a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23451a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23461a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 23471a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23481a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23491a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23501a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 23511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23521a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next = eNothing; 23531a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 23541a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23551a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23561a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 23571a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23581a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 23591a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 23601a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23611a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23621a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 23631a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23641a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23651a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23661a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 23671a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23681a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 23691a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 23701a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 23711a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 23721a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 23731a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23741a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23751a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23761a102087f54079c25c8827afac6153a44ca535daEnrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 23771a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23781a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 23791a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 23801a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23811a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23821a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 23831a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23841a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23851a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23861a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 23871a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23881a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 23891a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 23901a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 23911a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 23921a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 23931a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23941a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23951a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23961a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we have a low and a high index 23971a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23981a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 23991a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 24001a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 24011a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24021a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24031a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 24041a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24051a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24061a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24071a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 24081a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 24091a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24101a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24111a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 24121a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24131a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24141a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24151a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (index_lower > index_higher) // swap indices if required 24161a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24171a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long temp = index_lower; 24181a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_lower = index_higher; 24191a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_higher = temp; 24201a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24211a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 24221a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24231a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 24241a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 24251a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24261a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24271a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 24281a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24291a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24311a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24401a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield 24411a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next == ValueObject::eDereference && 24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24531a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next = ValueObject::eNothing; 24561a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24612bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (unsigned long index = index_lower; 24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata index <= index_higher; index++) 24631a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; 24691a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24701a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 24711a102087f54079c25c8827afac6153a44ca535daEnrico Granata return index_higher-index_lower+1; // tell me number of items I added to the VOList 24721a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata default: // some non-[ separator, or something entirely wrong, is in the way 24771a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24821a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata 2488bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid 248966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject 249066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton( 249166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton Stream &s, 249266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ValueObject *valobj, 249366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton const char *root_valobj_name, 249466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t ptr_depth, 249566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t curr_depth, 249666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t max_depth, 249766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_types, 249866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_location, 249966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool use_objc, 250010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham lldb::DynamicValueType use_dynamic, 2501e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata bool use_synth, 2502bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool scope_already_checked, 25037f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata bool flat_output, 25047f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata uint32_t omit_summary_depth 250566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton) 250666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 250782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (valobj) 250866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 250982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton bool update_success = valobj->UpdateValueIfNeeded (); 251082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 251182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (update_success && use_dynamic != lldb::eNoDynamicValues) 2512e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 251310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get(); 2514e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (dynamic_value) 2515e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham valobj = dynamic_value; 2516e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 2517e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2518bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 2519bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 2521bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 2522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 2523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 2524bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2525bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const bool print_valobj = flat_output == false || has_value; 2526bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2527bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 252866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2529bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (show_location) 2530bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2531fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham s.Printf("%s: ", valobj->GetLocationAsCString()); 2532bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 253366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2534bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 253566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2536a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton // Always show the type for the top level items. 253700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (show_types || (curr_depth == 0 && !flat_output)) 2538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>")); 253966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 254066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2541bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 2542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2543b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 2544b01000fd063629facd45044f137446fb748ee179Greg Clayton const bool qualify_cxx_base_classes = show_types; 2545b01000fd063629facd45044f137446fb748ee179Greg Clayton valobj->GetExpressionPath(s, qualify_cxx_base_classes); 2546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString(" ="); 2547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2548bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 2551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 2552bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2554fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!scope_already_checked && !valobj->IsInScope()) 2555bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 255682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton err_cstr = "out of scope"; 2557bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 255866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 255966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2560bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 25611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char *sum_cstr = NULL; 25621a102087f54079c25c8827afac6153a44ca535daEnrico Granata SummaryFormat* entry = valobj->GetSummaryFormat().get(); 2563bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 25647f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata if (omit_summary_depth > 0) 25657f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata entry = NULL; 25667f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata 2567bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 2568bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2569fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham val_cstr = valobj->GetValueAsCString(); 2570bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 2571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 257266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 257366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 257466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 257582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton s.Printf (" <%s>\n", err_cstr); 257666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 257766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 257866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2579f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 2580bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2581bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 25821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 25837f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL; 258466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 25851391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // We must calculate this value in realtime because entry might alter this variable's value 25861391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // (e.g. by saying ${var%fmt}) and render precached values useless 25871391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr)) 25881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.Printf(" %s", valobj->GetValueAsCString()); 258966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 259090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (sum_cstr) 2591886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 2592886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // for some reason, using %@ (ObjC description) in a summary string, makes 2593886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // us believe we need to reset ourselves, thus invalidating the content of 2594886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty 2595886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // let us recalculate it! 2596886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (sum_cstr[0] == '\0') 2597886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", valobj->GetSummaryAsCString()); 2598886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 2599886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", sum_cstr); 2600886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 2601bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2602bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (use_objc) 2603bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2604fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const char *object_desc = valobj->GetObjectDescription(); 2605bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 2606bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s\n", object_desc); 2607bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2608e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan s.Printf (" [no Objective-C description available]\n"); 2609bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 2610886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 261166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 261266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 261366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (curr_depth < max_depth) 261466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2615f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 2616f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 2617f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 2618f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 2619f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 2620f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2621f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 2622f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 2623f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 2624f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2625f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 2626f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 2627f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2628f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 2629f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 2630b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType ptr_address_type; 2631f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (valobj->GetPointerValue (ptr_address_type, true) == 0) 2632f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 2633f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2634f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 2635f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2636f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 2637f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 2638f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 2639f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 2640f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 2641f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2642f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2643f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 2644f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 2645f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 264666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2647886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr)) 264866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2649e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synth_vobj = valobj->GetSyntheticValue(use_synth ? 2650e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata lldb::eUseSyntheticFilter : 2651e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata lldb::eNoSyntheticFilter); 2652e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata const uint32_t num_children = synth_vobj->GetNumChildren(); 2653bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 265466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2655bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 265666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2657bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2658bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 2659bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2660bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2661bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2662bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 26633f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 2664bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 2665bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2666bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2667bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton for (uint32_t idx=0; idx<num_children; ++idx) 2668bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2669e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP child_sp(synth_vobj->GetChildAtIndex(idx, true)); 2670bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 2671bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton DumpValueObject (s, 2673bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_sp.get(), 2674bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton NULL, 2675f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 2676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton curr_depth + 1, 2677bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton max_depth, 2678bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_types, 2679bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_location, 2680bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton false, 2681e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham use_dynamic, 2682e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata use_synth, 2683bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton true, 26847f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata flat_output, 26857f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata omit_summary_depth > 1 ? omit_summary_depth - 1 : 0); 2686bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2687bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2688bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2689bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!flat_output) 2690bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2691bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 2692bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 269366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 269466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 2695bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 2696bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2697bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 2698bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2699f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 2700bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2701bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2702bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2703bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2704bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 2705bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2706bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 270766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 2708bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2709bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 271066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 271166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 271266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 271366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 271466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2715bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 271666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2717bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 271866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 271966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 272066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 272166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 272266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 272366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2724427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2725427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 2726fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name) 2727427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 2728427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 2729427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2730fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (UpdateValueIfNeeded() && m_error.Success()) 2731427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2732fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 2733fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 2734fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2735fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 2736fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 2737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2738fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham clang::ASTContext *ast = GetClangAST (); 2739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2740fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham DataExtractor data; 2741fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetByteOrder (m_data.GetByteOrder()); 2742fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetAddressByteSize(m_data.GetAddressByteSize()); 2743427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2744801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule()); 2745427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 274647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (exe_scope, 274747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 274847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham GetClangType(), 274947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 275047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham data); 2751fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2752427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2753fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2754fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!valobj_sp) 2755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 275647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (NULL, m_error); 2757427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2758427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 2759427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 2760427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2761427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP 2762bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 2763427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 276447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 276547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 2766e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2767c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 2768c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 2769427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2770427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 277124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = false; 2772427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2773427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 2774427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 2775427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 2776427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 2777427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 2778427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 277900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 2780427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 2781427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 2782427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 2783427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 278458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 278558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext exe_ctx; 278658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 278758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 278858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 278958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham clang_ast, 2790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 2791427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 2792427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 2793427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 2794427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 279524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 2796427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 2797427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 2798427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 2799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 2800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 280100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 280200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 2803a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 2804427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2805427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 2806427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 2807427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 2808427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 280947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj = new ValueObjectChild (*this, 281047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham clang_ast, 281147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_clang_type, 281247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_name, 281347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_size, 281447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_offset, 281547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_size, 281647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_offset, 281747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_base_class, 281847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_deref_of_parent); 2819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2821c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 282247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 2823c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2824c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 282547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 2826c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2827427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 2828427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2829c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 2830b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 2831c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2832c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 2833c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 2834c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 2835c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 283647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 2837427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2838427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 2839427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2840e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP 2841c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 2842427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 2843e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_addr_of_valobj_sp) 2844e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 2845e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2846b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeInvalid; 2847427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 2848427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address); 2849c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 2850427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 2851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2852427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 2853427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2854c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 2855427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 2856c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2857c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 2858b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 2859c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 2860c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2861427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 2862c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2863427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 2864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 2865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 2866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 2868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 2869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 2870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2871427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 2872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 287347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(), 287447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 287547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ClangASTContext::CreatePointerType (ast, clang_type), 287647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ConstString (name.c_str()), 287747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham addr, 287847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeInvalid, 287947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_data.GetAddressByteSize()); 2880427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2881427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2882427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 2883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2884427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2885e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 2886427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 2887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 28880039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 28890039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 28900039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type) 28910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 28920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 28930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 28940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 28950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 28960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 28970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 28980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 28990039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 29000039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29010039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 29020039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 29030039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 29040039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton clang_ast_type); 29050039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 29060039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 29070039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 29080039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29090039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 29100039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp) 29110039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 29120039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 29130039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 29140039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 29150039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 29160039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29170039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 29180039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 29190039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 29200039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29210039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 29220039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 29230039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 29240039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton type_sp); 29250039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 29260039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 29270039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 29280039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29290039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 2930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () : 2931dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_thread_id (LLDB_INVALID_UID), 2932dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_stop_id (0) 2933fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 2934fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 2935fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2936fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected): 2937fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update (true), 2938dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update (true), 293991635093b0282d888fcde84a276ae518643c7fcaJim Ingham m_thread_id (LLDB_INVALID_THREAD_ID), 2940dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_stop_id (0) 2941dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson 2942fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 2943fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 2944fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *computed_exe_scope = exe_scope; // If use_selected is true, we may find a better scope, 2945fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // and if so we want to cache that not the original. 2946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 2947fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 2948fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.target != NULL) 2949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2950fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp = exe_ctx.target->GetSP(); 2951fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2952fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.process == NULL) 2953fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.target->GetProcessSP(); 2954fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 2955fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.process->GetSP(); 2956fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2957fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp != NULL) 2958fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2959fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id = m_process_sp->GetStopID(); 2960fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = NULL; 2961fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2962fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.thread == NULL) 2963fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2964fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 2965fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2966fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = m_process_sp->GetThreadList().GetSelectedThread().get(); 2967fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread) 2968fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = thread; 2969fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2970fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2971fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 2972fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = exe_ctx.thread; 2973fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2974fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 2975fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2976fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = thread->GetIndexID(); 2977fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.frame == NULL) 2978fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2979fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 2980fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2981fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get(); 2982fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (frame) 2983fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2984fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = frame->GetStackID(); 2985fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = frame; 2986fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2987fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2988fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2989fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 2990fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = exe_ctx.frame->GetStackID(); 2991fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2992fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2993fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2994fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = computed_exe_scope; 2995fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 2996fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2997fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) : 2998fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope (rhs.m_exe_scope), 2999dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_needs_update(true), 3000dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update(true), 3001fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp (rhs.m_target_sp), 3002fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp (rhs.m_process_sp), 3003fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id (rhs.m_thread_id), 3004fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id (rhs.m_stack_id), 3005fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id (0) 3006fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3007fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3008fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3009fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint () 3010fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3011fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3012fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3013fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope * 3014fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope () 3015fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3016fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // We have to update before giving out the scope, or we could be handing out stale pointers. 3017fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SyncWithProcessState(); 3018fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3019fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return m_exe_scope; 3020fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3021fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3022fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state. If the current 3023fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return 3024fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change". If the current state is different, we update our state, and return 3025fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change". If we did see a change, we also set m_needs_update to true, so 3026fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true. 3027fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3028fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3029fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState() 3030fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3031fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we're already invalid, we don't need to do anything, and nothing has changed: 3032fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_stop_id == LLDB_INVALID_UID) 3033fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3034fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Can't update with an invalid state. 3035fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = false; 3036fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3037fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3039fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we don't have a process nothing can change. 3040fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_process_sp) 3041fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3042fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3043fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If our stop id is the current stop ID, nothing has changed: 3044e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham uint32_t cur_stop_id = m_process_sp->GetStopID(); 3045e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_stop_id == cur_stop_id) 3046fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3047fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3048e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // If the current stop id is 0, either we haven't run yet, or the process state has been cleared. 3049e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // In either case, we aren't going to be able to sync with the process state. 3050e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (cur_stop_id == 0) 3051e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return false; 3052e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3053e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham m_stop_id = cur_stop_id; 3054fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = true; 3055fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = m_process_sp.get(); 3056fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3057fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Something has changed, so we will return true. Now make sure the thread & frame still exist, and if either 3058fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // doesn't, mark ourselves as invalid. 3059fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3060fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_THREAD_ID) 3061fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3062fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get(); 3063fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_thread == NULL) 3064bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton { 306591635093b0282d888fcde84a276ae518643c7fcaJim Ingham SetInvalid(); 3066bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton } 3067fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3068fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3069fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_thread; 3070fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3071fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_stack_id.IsValid()) 3072fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3073fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get(); 3074fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_frame == NULL) 3075fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetInvalid(); 3076fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3077fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_frame; 3078fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3079fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3080fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3081fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return true; 3082fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3083fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3084ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid 3085ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated () 3086ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{ 3087ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_first_update = false; 3088ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_needs_update = false; 3089ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham if (m_process_sp) 3090ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_stop_id = m_process_sp->GetStopID(); 3091ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham} 3092ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3093ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3094fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3095fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope) 3096fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3097fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!IsValid()) 3098fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3099fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool needs_update = false; 3101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = NULL; 3102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // The target has to be non-null, and the 3104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *target = exe_scope->CalculateTarget(); 3105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (target != NULL) 3106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *old_target = m_target_sp.get(); 3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (target == old_target); 3109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *process = exe_scope->CalculateProcess(); 3110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (process != NULL) 3111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // FOR NOW - assume you can't update variable objects across process boundaries. 3113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *old_process = m_process_sp.get(); 3114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (process == old_process); 3115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::user_id_t stop_id = process->GetStopID(); 3117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (stop_id != m_stop_id) 3118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id = stop_id; 3121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // See if we're switching the thread or stack context. If no thread is given, this is 3123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // being evaluated in a global context. 3124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = exe_scope->CalculateThread(); 3125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 3126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::user_id_t new_thread_index = thread->GetIndexID(); 3128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_thread_index != m_thread_id) 3129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3131fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = new_thread_index; 3132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *new_frame = exe_scope->CalculateStackFrame(); 3136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame != NULL) 3137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame->GetStackID() != m_stack_id) 3139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3140fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = new_frame->GetStackID(); 3142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If this had been given a thread, and now there is none, we should update. 3153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Otherwise we don't have to do anything. 3154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_UID) 3155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3157fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3163fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there is no process, then we don't need to update anything. 3165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a process to not, we should try to update. 3166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp.get() != NULL) 3167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 3170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there's no target, nothing can change so we don't need to update anything. 3178fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a target to not, we should try to update. 3179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_target_sp.get() != NULL) 3180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp.reset(); 3183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 3184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_needs_update) 3189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = needs_update; 3190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return needs_update; 3192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3193f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 3194f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid 3195f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico GranataValueObject::ClearUserVisibleData() 3196f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{ 3197f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_location_str.clear(); 3198f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.clear(); 3199f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.clear(); 3200f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_object_desc_str.clear(); 32012bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen} 3202