ValueObject.cpp revision 21f37ad875d4f50d1b4b3d307e120f6d27103730
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" 23979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata#include "lldb/Core/Log.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h" 26427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h" 27e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectDynamicValue.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h" 290039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/ValueObjectMemory.h" 30e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata#include "lldb/Core/ValueObjectSyntheticFilter.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 33cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton 34f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata#include "lldb/Interpreter/ScriptInterpreterPython.h" 35f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 404ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h" 41b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h" 42afb7c85df796f74262917e44dd68f668dade3911Enrico Granata#include "lldb/Target/ObjCLanguageRuntime.h" 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 45eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata#include "lldb/Utility/RefCounter.h" 4986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granatausing namespace lldb_utility; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 59fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) : 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (++g_value_obj_uid), // Unique identifier for every value object 61fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (&parent), 62dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (parent.GetUpdatePoint ()), 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name (), 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data (), 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value (), 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error (), 6717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str (), 6817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str (), 6917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_location_str (), 7017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_summary_str (), 714ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str (), 7247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(parent.GetManager()), 7317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children (), 7417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_synthetic_children (), 7547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 76e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 7747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 7811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format (eFormatDefault), 7923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 807dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata m_last_format_mgr_dynamic(parent.m_last_format_mgr_dynamic), 8123ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_summary_format(), 8223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_forced_summary_format(), 8323ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_value_format(), 84e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_synthetic_filter(), 8521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 8617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid (false), 8717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change (false), 8817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid (false), 89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_old_value_valid (false), 9000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton m_pointers_point_to_load_addrs (false), 911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 92886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 94e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_is_expression_path_child(false), 95979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 96441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata m_is_expression_result(parent.m_is_expression_result), 9786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata m_dump_printable_counter(0) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject(this); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ExecutionContextScope *exe_scope) : 106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UserID (++g_value_obj_uid), // Unique identifier for every value object 107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (NULL), 108dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (exe_scope), 109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_name (), 110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_data (), 111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value (), 112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error (), 113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str (), 114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str (), 115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_location_str (), 116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str (), 117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_object_desc_str (), 11847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(), 119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children (), 120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_synthetic_children (), 12147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 122e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 12347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_format (eFormatDefault), 12523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 126afb7c85df796f74262917e44dd68f668dade3911Enrico Granata m_last_format_mgr_dynamic(lldb::eNoDynamicValues), 12723ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_summary_format(), 12823ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_forced_summary_format(), 12923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_value_format(), 130e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_synthetic_filter(), 13121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_is_valid (false), 133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_did_change (false), 134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children_count_valid (false), 135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid (false), 136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_pointers_point_to_load_addrs (false), 1371391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 138886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 1399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 140e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_is_expression_path_child(false), 141979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 142afb7c85df796f74262917e44dd68f668dade3911Enrico Granata m_is_expression_result(false), 14386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata m_dump_printable_counter(0) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager = new ValueObjectManager(); 14647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject (this); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor 151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject () 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 157886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format) 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 159afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return UpdateValueIfNeeded(m_last_format_mgr_dynamic, update_format); 160afb7c85df796f74262917e44dd68f668dade3911Enrico Granata} 161afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 162afb7c85df796f74262917e44dd68f668dade3911Enrico Granatabool 163afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::UpdateValueIfNeeded (lldb::DynamicValueType use_dynamic, bool update_format) 164afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{ 1651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 166886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (update_format) 167afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateFormatsIfNeeded(use_dynamic); 1681391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 169d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 170d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 171d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 172d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 173d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool first_update = m_update_point.IsFirstEvaluation(); 175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_update_point.NeedsUpdating()) 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetUpdated(); 179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Save the old value using swap to avoid a string copy which 181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // also will clear our m_value_str 182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_value_str.empty()) 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = false; 185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = true; 189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str.swap (m_value_str); 190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str.clear(); 191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 193f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClearUserVisibleData(); 194f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const bool value_was_valid = GetValueIsValid(); 196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 197ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error.Clear(); 199ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton 200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Call the pure virtual function to update the value 201fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool success = UpdateValue (); 202fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueIsValid (success); 204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (first_update) 206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else if (!m_value_did_change && success == false) 208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // The value wasn't gotten successfully, so we mark this 210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // as changed if the value used to be valid and now isn't 211fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (value_was_valid); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granatavoid 218afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::UpdateFormatsIfNeeded(lldb::DynamicValueType use_dynamic) 2191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{ 220979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 221979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (log) 222979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata log->Printf("checking for FormatManager revisions. VO named %s is at revision %d, while the format manager is at revision %d", 223979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata GetName().GetCString(), 2241391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision, 225979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata Debugger::Formatting::ValueFormats::GetCurrentRevision()); 22621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (HasCustomSummaryFormat() && m_update_point.GetModID() != m_user_id_of_forced_summary) 2271a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2281a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClearCustomSummaryFormat(); 2291a102087f54079c25c8827afac6153a44ca535daEnrico Granata m_summary_str.clear(); 2301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 231afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if ( (m_last_format_mgr_revision != Debugger::Formatting::ValueFormats::GetCurrentRevision()) || 232afb7c85df796f74262917e44dd68f668dade3911Enrico Granata m_last_format_mgr_dynamic != use_dynamic) 2331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 2341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_summary_format.get()) 235f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_last_summary_format.reset((StringSummaryFormat*)NULL); 2361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (m_last_value_format.get()) 237e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_value_format.reset(/*(ValueFormat*)NULL*/); 238e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get()) 239e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_last_synthetic_filter.reset(/*(SyntheticFilter*)NULL*/); 2409ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata 2419ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata m_synthetic_value = NULL; 2428a717e596312951672ecd8c54df2d255e6da20baEnrico Granata 243441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata Debugger::Formatting::ValueFormats::Get(*this, lldb::eNoDynamicValues, m_last_value_format); 244afb7c85df796f74262917e44dd68f668dade3911Enrico Granata Debugger::Formatting::GetSummaryFormat(*this, use_dynamic, m_last_summary_format); 245afb7c85df796f74262917e44dd68f668dade3911Enrico Granata Debugger::Formatting::GetSyntheticFilter(*this, use_dynamic, m_last_synthetic_filter); 2468a717e596312951672ecd8c54df2d255e6da20baEnrico Granata 2478a717e596312951672ecd8c54df2d255e6da20baEnrico Granata m_last_format_mgr_revision = Debugger::Formatting::ValueFormats::GetCurrentRevision(); 248afb7c85df796f74262917e44dd68f668dade3911Enrico Granata m_last_format_mgr_dynamic = use_dynamic; 249f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 250f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClearUserVisibleData(); 2511391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 2521391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata} 2531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 257afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 262bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError() 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 264afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString () 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 277afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false)) 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value.GetValueType()) 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 2896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterInfo *reg_info = m_value.GetRegisterInfo(); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = "scalar"; 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2; 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 332fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar) 3330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 334c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything 335c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata { 336c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata ExecutionContext exe_ctx; 337c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata ExecutionContextScope *exe_scope = GetExecutionContextScope(); 338c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata if (exe_scope) 339c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata exe_scope->CalculateExecutionContext(exe_ctx); 340c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ()); 341c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata return scalar.IsValid(); 342c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata } 343c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata else 344c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata return false; 3450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 3460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 3470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 34817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 361fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange () 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 363fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham GetValueAsCString (); 36417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create) 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 377917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 379afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (idx < GetNumChildren()) 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check if we have already made the child value object? 383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (can_create && m_children[idx] == NULL) 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // No we haven't created the child at this index, so lets have our 386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // subclass do it and cache the result for quick future access. 387917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton m_children[idx] = CreateChildAtIndex (idx, false, 0); 388e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 389917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 390917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_children[idx] != NULL) 391917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return m_children[idx]->GetSP(); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 401462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4095d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 414917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 415917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 416afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 417917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 418917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t> child_indexes; 419917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton void *clang_type = GetClangType(); 421917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 422917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 423917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 424917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton name.GetCString(), 425917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 426917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_indexes); 427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (num_child_indexes > 0) 428e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 429917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 430917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator end = child_indexes.end (); 431e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = GetChildAtIndex(*pos, can_create); 433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton for (++pos; pos != end; ++pos) 434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_sp) 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 438917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = new_child_sp; 439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 440917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 441917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 442917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp.reset(); 443e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 444917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_children.size(); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children) 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children.resize(num_children); 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47347da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index) 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 476bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham ValueObject *valobj = NULL; 477e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 47924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = synthetic_array_member; 480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::string child_name_str; 481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_byte_size = 0; 482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton int32_t child_byte_offset = 0; 483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_size = 0; 484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_offset = 0; 485917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_base_class = false; 486917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_deref_of_parent = false; 487917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 488917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool transparent_pointers = synthetic_array_member == false; 489917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 490917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t clang_type = GetClangType(); 491917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t child_clang_type; 492917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 493917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ExecutionContext exe_ctx; 494917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 495917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 496917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 498917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetName().GetCString(), 499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 500917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton idx, 501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton transparent_pointers, 502917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 50324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name_str, 505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 507917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 509917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_clang_type && child_byte_size) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (synthetic_index) 514917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset += child_byte_size * synthetic_index; 515917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 516917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ConstString child_name; 517917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!child_name_str.empty()) 518917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name.SetCString (child_name_str.c_str()); 519917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 520917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj = new ValueObjectChild (*this, 521917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 522917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type, 523917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name, 524917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 525917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 526917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 527917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 528917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 529917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 530917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_pointers_point_to_load_addrs) 531917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs); 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 533e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 53447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 538fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString () 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5407dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata if (UpdateValueIfNeeded (true)) 5411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 544f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata SummaryFormat *summary_format = GetSummaryFormat().get(); 5451a102087f54079c25c8827afac6153a44ca535daEnrico Granata 5461a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (summary_format) 5471391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 548f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str = summary_format->FormatObject(GetSP()); 5491391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 550f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata else 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 552f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type_t clang_type = GetClangType(); 553f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 55490d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata // Do some default printout for function pointers 555f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (clang_type) 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 557f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata StreamString sstr; 558f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type_t elem_or_pointee_clang_type; 559f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 560f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetClangAST(), 561f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata &elem_or_pointee_clang_type)); 562f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 563f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ExecutionContextScope *exe_scope = GetExecutionContextScope(); 564f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (exe_scope) 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56690d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (ClangASTContext::IsFunctionPointerType (clang_type)) 567fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 568f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata AddressType func_ptr_address_type = eAddressTypeInvalid; 569f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true); 570fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 571f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 572f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 573f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata switch (func_ptr_address_type) 57403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 575f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeInvalid: 576f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeFile: 577f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 578f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 579f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeLoad: 58003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 581f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address so_addr; 582f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Target *target = exe_scope->CalculateTarget(); 583f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (target && target->GetSectionLoadList().IsEmpty() == false) 584fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 585f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 586f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 587f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata so_addr.Dump (&sstr, 588f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata exe_scope, 589f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address::DumpStyleResolvedDescription, 590f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address::DumpStyleSectionNameOffset); 591f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 592fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 59303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 594f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 596f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeHost: 597f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 598f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 599f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 600f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (sstr.GetSize() > 0) 601f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 602f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.assign (1, '('); 603f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.append (sstr.GetData(), sstr.GetSize()); 604f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.append (1, ')'); 605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6171a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool 6181a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer) 6191a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 6201a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 6211a102087f54079c25c8827afac6153a44ca535daEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(), 6221a102087f54079c25c8827afac6153a44ca535daEnrico Granata GetClangAST(), 6231a102087f54079c25c8827afac6153a44ca535daEnrico Granata &elem_or_pointee_clang_type)); 6241a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 6251a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)); 6261a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!is_char_arr_ptr) 6271a102087f54079c25c8827afac6153a44ca535daEnrico Granata return false; 6281a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!check_pointer) 6291a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 6301a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test(ClangASTContext::eTypeIsArray)) 6311a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 6321a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 6331a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 6341a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetAddressOf (cstr_address_type, true); 6351a102087f54079c25c8827afac6153a44ca535daEnrico Granata return (cstr_address != LLDB_INVALID_ADDRESS); 6361a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 6371a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6381a102087f54079c25c8827afac6153a44ca535daEnrico Granatavoid 6391a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ReadPointedString(Stream& s, 6401a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error& error, 64186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t max_length, 64286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool honor_array, 64386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata lldb::Format item_format) 6441a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 6451a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6461a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (max_length == 0) 64786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata max_length = 128; // FIXME this should be a setting, or a formatting parameter 6481a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6491a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t clang_type = GetClangType(); 6501a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 6511a102087f54079c25c8827afac6153a44ca535daEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 6521a102087f54079c25c8827afac6153a44ca535daEnrico Granata GetClangAST(), 6531a102087f54079c25c8827afac6153a44ca535daEnrico Granata &elem_or_pointee_clang_type)); 6541a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 6551a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 6561a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6571a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExecutionContextScope *exe_scope = GetExecutionContextScope(); 6581a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (exe_scope) 6591a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6601a102087f54079c25c8827afac6153a44ca535daEnrico Granata Target *target = exe_scope->CalculateTarget(); 661979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (target == NULL) 662979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 663979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<no target to read from>"; 664979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 665979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 6661a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6671a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 6681a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 6691a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6701a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t cstr_len = 0; 6711a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool capped_data = false; 6721a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test (ClangASTContext::eTypeIsArray)) 6731a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6741a102087f54079c25c8827afac6153a44ca535daEnrico Granata // We have an array 6751a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_len = ClangASTContext::GetArraySize (clang_type); 67686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (cstr_len > max_length) 6771a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 67886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata capped_data = true; 67986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len = max_length; 6801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6811a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetAddressOf (cstr_address_type, true); 6821a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6831a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 6841a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6851a102087f54079c25c8827afac6153a44ca535daEnrico Granata // We have a pointer 6861a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetPointerValue (cstr_address_type, true); 6871a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 688979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (cstr_address == LLDB_INVALID_ADDRESS) 689979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 690979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<invalid address for data>"; 691979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 692979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 6931a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6941a102087f54079c25c8827afac6153a44ca535daEnrico Granata Address cstr_so_addr (NULL, cstr_address); 6951a102087f54079c25c8827afac6153a44ca535daEnrico Granata DataExtractor data; 6961a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t bytes_read = 0; 6971a102087f54079c25c8827afac6153a44ca535daEnrico Granata std::vector<char> data_buffer; 6981a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool prefer_file_cache = false; 69986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (cstr_len > 0 && honor_array) 7001a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 7011a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.resize(cstr_len); 7021a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder()); 7031a102087f54079c25c8827afac6153a44ca535daEnrico Granata bytes_read = target->ReadMemory (cstr_so_addr, 7041a102087f54079c25c8827afac6153a44ca535daEnrico Granata prefer_file_cache, 7051a102087f54079c25c8827afac6153a44ca535daEnrico Granata &data_buffer.front(), 7061a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_len, 7071a102087f54079c25c8827afac6153a44ca535daEnrico Granata error); 7081a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (bytes_read > 0) 7091a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 7101a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7111a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.Dump (&s, 7121a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // Start offset in "data" 71386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata item_format, 7141a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1, // Size of item (1 byte for a char!) 7151a102087f54079c25c8827afac6153a44ca535daEnrico Granata bytes_read, // How many bytes to print? 7161a102087f54079c25c8827afac6153a44ca535daEnrico Granata UINT32_MAX, // num per line 7171a102087f54079c25c8827afac6153a44ca535daEnrico Granata LLDB_INVALID_ADDRESS,// base address 7181a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // bitfield bit size 7191a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0); // bitfield bit offset 7201a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (capped_data) 7211a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << "..."; 7221a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7231a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 724979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 725979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "\"<data not available>\""; 7261a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7271a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 7281a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 72986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len = max_length; 73086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata const size_t k_max_buf_size = 64; 7311a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.resize (k_max_buf_size + 1); 7321a102087f54079c25c8827afac6153a44ca535daEnrico Granata // NULL terminate in case we don't get the entire C string 7331a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.back() = '\0'; 7341a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7351a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7361a102087f54079c25c8827afac6153a44ca535daEnrico Granata 737979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata bool any_data = false; 738979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 7391a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder()); 7401a102087f54079c25c8827afac6153a44ca535daEnrico Granata while ((bytes_read = target->ReadMemory (cstr_so_addr, 7411a102087f54079c25c8827afac6153a44ca535daEnrico Granata prefer_file_cache, 7421a102087f54079c25c8827afac6153a44ca535daEnrico Granata &data_buffer.front(), 7431a102087f54079c25c8827afac6153a44ca535daEnrico Granata k_max_buf_size, 7441a102087f54079c25c8827afac6153a44ca535daEnrico Granata error)) > 0) 7451a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 746979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata any_data = true; 7471a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t len = strlen(&data_buffer.front()); 7481a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len == 0) 7491a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 7501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len > bytes_read) 7511a102087f54079c25c8827afac6153a44ca535daEnrico Granata len = bytes_read; 75286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (len > cstr_len) 75386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata len = cstr_len; 7541a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7551a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.Dump (&s, 7561a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // Start offset in "data" 75786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata item_format, 7581a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1, // Size of item (1 byte for a char!) 7591a102087f54079c25c8827afac6153a44ca535daEnrico Granata len, // How many bytes to print? 7601a102087f54079c25c8827afac6153a44ca535daEnrico Granata UINT32_MAX, // num per line 7611a102087f54079c25c8827afac6153a44ca535daEnrico Granata LLDB_INVALID_ADDRESS,// base address 7621a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // bitfield bit size 7631a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0); // bitfield bit offset 7641a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7651a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len < k_max_buf_size) 7661a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 76786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (len >= cstr_len) 76886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 76986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << "..."; 77086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 77186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 77286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len -= len; 7731a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_so_addr.Slide (k_max_buf_size); 7741a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 775979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 776979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (any_data == false) 777979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<data not available>"; 778979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 7791a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7811a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7821a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7831a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7841a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7851a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 7861a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 7871a102087f54079c25c8827afac6153a44ca535daEnrico Granata error.SetErrorString("impossible to read a string from this object"); 788979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<not a string object>"; 7891a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7901a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 7911a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7924ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 793fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription () 7944ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 795886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 7967dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata if (!UpdateValueIfNeeded (true)) 7974ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 798886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 799886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!m_object_desc_str.empty()) 800886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_object_desc_str.c_str(); 801886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 802fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 803fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope == NULL) 804fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return NULL; 805fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 8064ae519666628cca07c194bf677163009cc2e5a8bJim Ingham Process *process = exe_scope->CalculateProcess(); 807b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 8084ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 809b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 810b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 8114ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 812b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham lldb::LanguageType language = GetObjectRuntimeLanguage(); 813b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 8144ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 8150e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 8160e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 81770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway... 8180e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 8190e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 8200e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 82170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham bool is_signed; 82270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed) 82370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham || ClangASTContext::IsPointerType (opaque_qual_type)) 82470c55622e15857e232cf4777a502fa5fe40e785bJim Ingham { 8250e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC); 82670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham } 8270e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 8280e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 8290e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 8300de37195f17fefb536157b3296a18999116b8125Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this)) 8314ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 8324ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 8334ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 834e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 835e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 836e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 837e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 838e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 8394ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 842fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString () 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If our byte size is zero this is an aggregate type that has children 845462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (ClangASTContext::IsAggregateType (GetClangType()) == false) 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 847afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(true)) 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Value::ContextType context_type = m_value.GetContextType(); 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (context_type) 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeClangType: 8566916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeLLDBType: 8576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeVariable: 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 859f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType (); 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 862afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (m_format == lldb::eFormatDefault && m_last_value_format) 8631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 864f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str = m_last_value_format->FormatObject(GetSP()); 8651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 86782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 868f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata StreamString sstr; 869f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Format format = GetFormat(); 870f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (format == eFormatDefault) 871f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata format = (m_is_bitfield_for_scalar ? eFormatUnsigned : 872f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClangASTType::GetFormat(clang_type)); 873f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 874f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (ClangASTType::DumpTypeValue (GetClangAST(), // The clang AST 875f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type, // The clang type to display 876f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata &sstr, 877f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata format, // Format to display this type with 878f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_data, // Data to extract from 879f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 0, // Byte offset into "m_data" 880f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetByteSize(), // Byte size of item in "m_data" 881f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetBitfieldBitSize(), // Bitfield bit size 882f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetBitfieldBitOffset())) // Bitfield bit offset 883f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.swap(sstr.GetString()); 884f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata else 885f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 886f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)", 887f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_data.GetByteSize(), 888f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetByteSize()); 889f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.clear(); 890f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 89182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeRegisterInfo: 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString reg_sstr; 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.Dump(®_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(reg_sstr.GetString()); 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 90754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 90854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 90954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 91317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_value_did_change && m_old_value_valid) 91417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 91517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value was gotten successfully, so we consider the 91617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // value as changed if the value string differs 91717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (m_old_value_str != m_value_str); 91817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 926afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used 927afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers 928afb7c85df796f74262917e44dd68f668dade3911Enrico Granataunsigned long long 929afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::GetValueAsUnsigned() 930afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{ 931afb7c85df796f74262917e44dd68f668dade3911Enrico Granata // If our byte size is zero this is an aggregate type that has children 932afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == false) 933afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 934afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(true)) 935afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 936afb7c85df796f74262917e44dd68f668dade3911Enrico Granata uint32_t offset = 0; 937afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return m_data.GetMaxU64(&offset, 938afb7c85df796f74262917e44dd68f668dade3911Enrico Granata m_data.GetByteSize()); 939afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 940afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 941afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return 0; 942afb7c85df796f74262917e44dd68f668dade3911Enrico Granata} 943afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 9444e5397c1127d698c61df295f30909e573a1c9876Enrico Granatabool 9454e5397c1127d698c61df295f30909e573a1c9876Enrico GranataValueObject::GetPrintableRepresentation(Stream& s, 9464e5397c1127d698c61df295f30909e573a1c9876Enrico Granata ValueObjectRepresentationStyle val_obj_display, 947886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata lldb::Format custom_format) 948886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 94986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 95086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata RefCounter ref(&m_dump_printable_counter); 95186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 95290d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (custom_format != lldb::eFormatInvalid) 953886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata SetFormat(custom_format); 954886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 955886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata const char * return_value; 95680b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata std::string alloc_mem; 957886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 958886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata switch(val_obj_display) 959886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 960886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayValue: 961886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetValueAsCString(); 962886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 963886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplaySummary: 964886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetSummaryAsCString(); 965886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 966886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayLanguageSpecific: 967886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetObjectDescription(); 968886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 969f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eDisplayLocation: 970f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata return_value = GetLocationAsCString(); 971f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 9724e5397c1127d698c61df295f30909e573a1c9876Enrico Granata case eDisplayChildrenCount: 9734e5397c1127d698c61df295f30909e573a1c9876Enrico Granata { 97480b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata alloc_mem.resize(512); 97580b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata return_value = &alloc_mem[0]; 9764e5397c1127d698c61df295f30909e573a1c9876Enrico Granata int count = GetNumChildren(); 97780b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata snprintf((char*)return_value, 512, "%d", count); 9784e5397c1127d698c61df295f30909e573a1c9876Enrico Granata break; 9794e5397c1127d698c61df295f30909e573a1c9876Enrico Granata } 9804e5397c1127d698c61df295f30909e573a1c9876Enrico Granata default: 9814e5397c1127d698c61df295f30909e573a1c9876Enrico Granata break; 982886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 983886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 98486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // this code snippet might lead to endless recursion, thus we use a RefCounter here to 98586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // check that we are not looping endlessly 98686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!return_value && (m_dump_printable_counter < 3)) 9879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 9889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // try to pick the other choice 9899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (val_obj_display == eDisplayValue) 9909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return_value = GetSummaryAsCString(); 9919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (val_obj_display == eDisplaySummary) 992de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 993de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == true) 994de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 9954e5397c1127d698c61df295f30909e573a1c9876Enrico Granata // this thing has no value, and it seems to have no summary 9964e5397c1127d698c61df295f30909e573a1c9876Enrico Granata // some combination of unitialized data and other factors can also 9974e5397c1127d698c61df295f30909e573a1c9876Enrico Granata // raise this condition, so let's print a nice generic error message 9984e5397c1127d698c61df295f30909e573a1c9876Enrico Granata return_value = "<no available summary>"; 999de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 1000de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else 1001de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata return_value = GetValueAsCString(); 1002de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 10039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1004886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 10054e5397c1127d698c61df295f30909e573a1c9876Enrico Granata if (return_value) 10064e5397c1127d698c61df295f30909e573a1c9876Enrico Granata s.PutCString(return_value); 10074e5397c1127d698c61df295f30909e573a1c9876Enrico Granata else 10084e5397c1127d698c61df295f30909e573a1c9876Enrico Granata s.PutCString("<no printable representation>"); 10094e5397c1127d698c61df295f30909e573a1c9876Enrico Granata 10104e5397c1127d698c61df295f30909e573a1c9876Enrico Granata // we should only return false here if we could not do *anything* 10114e5397c1127d698c61df295f30909e573a1c9876Enrico Granata // even if we have an error message as output, that's a success 10124e5397c1127d698c61df295f30909e573a1c9876Enrico Granata // from our callers' perspective, so return true 10134e5397c1127d698c61df295f30909e573a1c9876Enrico Granata return true; 10144e5397c1127d698c61df295f30909e573a1c9876Enrico Granata 10159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 1016886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 10179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 10189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s, 10199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectRepresentationStyle val_obj_display, 10209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata lldb::Format custom_format) 10219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 102286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 102386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata clang_type_t elem_or_pointee_type; 102486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type)); 10251a102087f54079c25c8827afac6153a44ca535daEnrico Granata 102686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) 102786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata && val_obj_display == ValueObject::eDisplayValue) 10281a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 102986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // when being asked to get a printable display an array or pointer type directly, 103086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // try to "do the right thing" 103186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 103286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (IsCStringContainer(true) && 103386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCString || 103486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatCharArray || 103586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatChar || 103686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatVectorOfChar)) // print char[] & char* directly 103786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 103886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata Error error; 103986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ReadPointedString(s, 104086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata error, 104186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 0, 104286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfChar) || 104386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCharArray)); 104486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return !error.Fail(); 104586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 104686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 104786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (custom_format == lldb::eFormatEnum) 104886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return false; 104986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 105086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // this only works for arrays, because I have no way to know when 105186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // the pointed memory ends, and no special \0 end of data marker 105286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (flags.Test(ClangASTContext::eTypeIsArray)) 105386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 105486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatBytes) || 105586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatBytesWithASCII)) 105686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 105786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t count = GetNumChildren(); 105886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 105986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << '['; 106086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata for (uint32_t low = 0; low < count; low++) 106186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 106286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 106386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (low) 106486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ','; 106586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 106686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 106786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!child.get()) 106886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1069de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata s << "<invalid child>"; 107086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata continue; 107186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 107286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, custom_format); 107386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 107486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 107586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ']'; 107686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 107786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return true; 107886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 107986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 108086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatVectorOfChar) || 108186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfFloat32) || 108286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfFloat64) || 108386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt16) || 108486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt32) || 108586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt64) || 108686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt8) || 108786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt128) || 108886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt16) || 108986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt32) || 109086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt64) || 109186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly 109286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 109386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t count = GetNumChildren(); 109486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 109586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata lldb::Format format = FormatManager::GetSingleItemFormat(custom_format); 109686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 109786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << '['; 109886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata for (uint32_t low = 0; low < count; low++) 109986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 110086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 110186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (low) 110286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ','; 110386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 110486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 110586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!child.get()) 110686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1107de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata s << "<invalid child>"; 110886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata continue; 110986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 111086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, format); 111186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 111286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 111386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ']'; 111486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 111586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return true; 111686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 111786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 111886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 111986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatBoolean) || 112086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatBinary) || 112186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatChar) || 112286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCharPrintable) || 112386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplexFloat) || 112486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatDecimal) || 112586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatHex) || 112686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatFloat) || 112786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatOctal) || 112886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatOSType) || 112986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnicode16) || 113086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnicode32) || 113186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnsigned) || 113286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatPointer) || 113386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplexInteger) || 113486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplex) || 113586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatDefault)) // use the [] operator 113686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return false; 11371a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 11384e5397c1127d698c61df295f30909e573a1c9876Enrico Granata bool var_success = GetPrintableRepresentation(s, val_obj_display, custom_format); 113990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (custom_format != eFormatInvalid) 114086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata SetFormat(eFormatDefault); 114186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return var_success; 1142886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 1143886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 114403e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 1145b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address) 1146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 1147afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1148e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return LLDB_INVALID_ADDRESS; 1149e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 1151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 1153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 1154f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1155f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeLoad; 1156f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1157f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1158f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1159f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1160f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 1161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 1162f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 1163f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1164f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = m_value.GetValueAddressType (); 1165f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1166f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1167f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1168f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1169f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeInvalid; 1170f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 1171f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 1172f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1173f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 1174b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address) 117503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 117603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t address = LLDB_INVALID_ADDRESS; 117703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeInvalid; 1178e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1179afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1180e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return address; 1181e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1182f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 118303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 118403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 118503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (scalar_is_load_address) 118603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 118703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 118803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 118903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 119003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 119103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 119203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 119303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 119403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeHostAddress: 119503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 119603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton uint32_t data_offset = 0; 119703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 119803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = m_value.GetValueAddressType(); 119903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (address_type == eAddressTypeInvalid) 120003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 120103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 120203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 120303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton address_type = eAddressTypeLoad; 1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 120803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 120903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 121003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str) 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 1216afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 1220462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *end = NULL; 1223bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingInvalid: 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingUint: 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(unsigned long long)) 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned long long ull_val = strtoull(value_str, &end, 0); 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 123921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham Value::ValueType value_type = m_value.GetValueType(); 124021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (value_type) 124121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 124221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case Value::eValueTypeLoadAddress: 124321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case Value::eValueTypeHostAddress: 124421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The value in these cases lives in the data. So update the data: 124521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 124621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 124721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case Value::eValueTypeScalar: 124821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_value.GetScalar() = ull_val; 124921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 125021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case Value::eValueTypeFileAddress: 125121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // Try to convert the file address to a load address and then write the new value there. 125221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 125321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingSint: 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(long long)) 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long long sll_val = strtoll(value_str, &end, 0); 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1269801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value.GetScalar() = sll_val; 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingIEEE754: 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const off_t byte_offset = GetByteOffset(); 127854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size)); 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst != NULL) 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We are decoding a float into host byte order below, so make 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sure m_data knows what it contains. 1283cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton m_data.SetByteOrder(lldb::endian::InlHostByteOrder()); 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetClangAST(), 1286462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value_str, 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst, 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size); 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (converted_byte_size == byte_size) 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingVector: 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we have made it here the value is in m_data and we should write it 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // out to the target 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (); 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write () 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the update ID so the next time we try and read the value 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we try and read it again. 1315fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetNeedsUpdate(); 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: when Value has a method to write a value back, call it from here. 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1322b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType 1323b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 1324b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 1325afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return ClangASTType::GetMinimumLanguage (GetClangAST(), 1326afb7c85df796f74262917e44dd68f668dade3911Enrico Granata GetClangType()); 1327b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 1328b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 133047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj) 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 133247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_synthetic_children[key] = valobj; 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 133947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key); 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 134147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = pos->second->GetSP(); 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1348462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135170c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool 135224b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType () 135324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 135424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return ClangASTContext::IsArrayType (GetClangType()); 135524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 135624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 135724b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool 13589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType () 13599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 13609762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return ClangASTContext::IsScalarType (GetClangType()); 13619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 13629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 13639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 136470c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed) 136570c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{ 136670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham return ClangASTContext::IsIntegerType (GetClangType(), is_signed); 136770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham} 1368f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 137282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPointerOrReferenceType (GetClangType()); 137382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 137482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 137582f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 137682f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType () 137782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{ 137882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType()); 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1381917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool 1382917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType () 1383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 1384917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType()); 1385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 1386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create) 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(index_str, sizeof(index_str), "[%i]", index); 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 140147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *synthetic_child; 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 140447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child = CreateChildAtIndex(0, true, index); 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 140747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (synthetic_child) 140847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham { 140947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham AddSyntheticChild(index_const_str, synthetic_child); 141047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = synthetic_child->GetSP(); 1411979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 1412886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->m_is_array_item_for_pointer = true; 141347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham } 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1418642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 141924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index 142024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array. 142124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as: 142224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection 142324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// { 142424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// uint32_t item_count; 142524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Item item_array[0]; 142624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// }; 142724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice 142824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array". 142924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 143024b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP 143124b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create) 143224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 143324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP synthetic_child_sp; 143424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (IsArrayType ()) 143524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 143624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton char index_str[64]; 143724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton snprintf(index_str, sizeof(index_str), "[%i]", index); 143824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ConstString index_const_str(index_str); 143924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Check if we have already created a synthetic array member in this 144024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // valid object. If we have we will re-use it. 144124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = GetSyntheticChild (index_const_str); 144224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!synthetic_child_sp) 144324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 144424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObject *synthetic_child; 144524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // We haven't made a synthetic array member for INDEX yet, so 144624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // lets make one and cache it for any future reference. 144724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child = CreateChildAtIndex(0, true, index); 144824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 144924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Cache the value if we got one back... 145024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (synthetic_child) 145124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 145224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton AddSyntheticChild(index_const_str, synthetic_child); 145324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = synthetic_child->GetSP(); 1454979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 145524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp->m_is_array_item_for_pointer = true; 145624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 145724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 145824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 145924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return synthetic_child_sp; 146024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 146124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 14629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP 14639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create) 14649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 14659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP synthetic_child_sp; 14669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (IsScalarType ()) 14679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char index_str[64]; 14699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to); 14709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ConstString index_const_str(index_str); 14719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Check if we have already created a synthetic array member in this 14729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // valid object. If we have we will re-use it. 14739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = GetSyntheticChild (index_const_str); 14749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!synthetic_child_sp) 14759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectChild *synthetic_child; 14779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // We haven't made a synthetic array member for INDEX yet, so 14789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // lets make one and cache it for any future reference. 14799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child = new ValueObjectChild(*this, 14809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangAST(), 14819762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangType(), 14829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata index_const_str, 14839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetByteSize(), 14849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 0, 14859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata to-from+1, 14869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata from, 14879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false, 14889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false); 14899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 14909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Cache the value if we got one back... 14919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (synthetic_child) 14929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata AddSyntheticChild(index_const_str, synthetic_child); 14949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = synthetic_child->GetSP(); 1495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 14969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->m_is_bitfield_for_scalar = true; 14979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 15009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return synthetic_child_sp; 15019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 15029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatalldb::ValueObjectSP 1504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create) 1505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 1506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectSP synthetic_child_sp; 1508979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1509979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata char name_str[64]; 1510979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata snprintf(name_str, sizeof(name_str), "@%i", offset); 1511979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ConstString name_const_str(name_str); 1512979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1513979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // Check if we have already created a synthetic array member in this 1514979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // valid object. If we have we will re-use it. 1515979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = GetSyntheticChild (name_const_str); 1516979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1517979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child_sp.get()) 1518979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 1519979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1520979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (!can_create) 1521979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return lldb::ValueObjectSP(); 1522979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1523979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectChild *synthetic_child = new ValueObjectChild(*this, 1524979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetASTContext(), 1525979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetOpaqueQualType(), 1526979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_const_str, 1527979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetTypeByteSize(), 1528979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata offset, 1529979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 1530979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 1531979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata false, 1532979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata false); 1533979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child) 1534979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1535979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata AddSyntheticChild(name_const_str, synthetic_child); 1536979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = synthetic_child->GetSP(); 1537979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(name_const_str); 1538979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->m_is_child_at_offset = true; 1539979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1540979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 1541979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 1542979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1543e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or -> 1544e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has 1545e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown 1546e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means 1547e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off 1548e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char* 1549e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression) 1550e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1551e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!expression || !expression[0]) 1552e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 1553e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '.') 1554e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+1; 1555e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '-' && expression[1] == '>') 1556e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+2; 1557e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 1558e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1559e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1560e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatalldb::ValueObjectSP 1561e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create) 1562e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1563e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synthetic_child_sp; 1564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ConstString name_const_string(expression); 1565e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Check if we have already created a synthetic array member in this 1566e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // valid object. If we have we will re-use it. 1567e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetSyntheticChild (name_const_string); 1568e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!synthetic_child_sp) 1569e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 1570e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // We haven't made a synthetic array member for expression yet, so 1571e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // lets make one and cache it for any future reference. 1572e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetValueForExpressionPath(expression); 1573e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1574e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Cache the value if we got one back... 1575e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (synthetic_child_sp.get()) 1576e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 1577e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata AddSyntheticChild(name_const_string, synthetic_child_sp.get()); 1578979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression))); 1579e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp->m_is_expression_path_child = true; 1580e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 1581e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 1582e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return synthetic_child_sp; 1583e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1584e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1585e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid 1586e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::CalculateSyntheticValue (lldb::SyntheticValueType use_synthetic) 1587e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1588e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (use_synthetic == lldb::eNoSyntheticFilter) 1589e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 1590e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1591afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateFormatsIfNeeded(m_last_format_mgr_dynamic); 1592e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1593e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get() == NULL) 1594e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 1595e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 15969ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata if (m_synthetic_value == NULL) 15979ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata m_synthetic_value = new ValueObjectSynthetic(*this, m_last_synthetic_filter); 1598e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1599e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1600e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1601e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid 160210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic) 1603642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 160410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 160510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return; 160610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 160747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (!m_dynamic_value && !IsDynamic()) 1608e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1609979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata Process *process = m_update_point.GetProcessSP().get(); 1610e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool worth_having_dynamic_value = false; 1611642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1612e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1613e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // FIXME: Process should have some kind of "map over Runtimes" so we don't have to 1614e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // hard code this everywhere. 1615e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham lldb::LanguageType known_type = GetObjectRuntimeLanguage(); 1616e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC) 1617e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1618e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime (known_type); 1619e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (runtime) 1620e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this); 1621e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1622e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham else 1623e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1624e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus); 1625e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (cpp_runtime) 1626e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this); 1627e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1628e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!worth_having_dynamic_value) 1629e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1630e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC); 1631e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (objc_runtime) 163210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this); 1633e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1634e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1635e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1636e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (worth_having_dynamic_value) 163710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 163847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 163947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// if (worth_having_dynamic_value) 164047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager); 1641e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1642e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1643e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham} 1644e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 164547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 164610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic) 1647e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{ 164810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 164910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return ValueObjectSP(); 165010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 165110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (!IsDynamic() && m_dynamic_value == NULL) 1652e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 165310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham CalculateDynamicValue(use_dynamic); 1654e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 165547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_dynamic_value) 165647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_dynamic_value->GetSP(); 165747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 165847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 1659642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 166066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1661e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// GetDynamicValue() returns a NULL SharedPointer if the object is not dynamic 1662e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// or we do not really want a dynamic VO. this method instead returns this object 1663e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// itself when making it synthetic has no meaning. this makes it much simpler 1664e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to replace the SyntheticValue for the ValueObject 1665e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP 1666e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticValue (SyntheticValueType use_synthetic) 1667e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1668e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (use_synthetic == lldb::eNoSyntheticFilter) 1669e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1670e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1671afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateFormatsIfNeeded(m_last_format_mgr_dynamic); 1672e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1673e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get() == NULL) 1674e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1675e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1676e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata CalculateSyntheticValue(use_synthetic); 1677e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1678e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_synthetic_value) 1679e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return m_synthetic_value->GetSP(); 1680e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata else 1681e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1682e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1683e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 168400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 1685f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico GranataValueObject::HasSyntheticValue() 1686f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata{ 1687f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata UpdateFormatsIfNeeded(m_last_format_mgr_dynamic); 1688f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 1689f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (m_last_synthetic_filter.get() == NULL) 1690f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 1691f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 1692f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata CalculateSyntheticValue(lldb::eUseSyntheticFilter); 1693f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 1694f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (m_synthetic_value) 1695f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return true; 1696f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 1697f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 1698f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata} 1699f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 1700f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granatabool 170100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 170200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 170300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 170400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1705e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s); 170600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t clang_type = GetClangType(); 170700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 170800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name); 170900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 171000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 171100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 171200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 171300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 171400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 171500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 171600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 171700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 171800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 171900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 172000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 172100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 172200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 172300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 1724e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()) 172500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1726e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()->IsBaseClass()) 1727e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent()->GetNonBaseClassParent(); 172800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 1729e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent(); 173000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 173100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 173200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 173366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 173466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 17351391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 1736bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 173700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 173800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 173990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (is_deref_of_parent && epformat == eDereferencePointers) { 17401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely 17411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName. 17421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // the eHonorPointers mode is meant to produce strings in this latter format 17431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("*("); 17441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 174500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 17461391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ValueObject* parent = GetParent(); 17471391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 17481391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (parent) 17491391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat); 1750886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1751886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // if we are a deref_of_parent just because we are synthetic array 1752886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // members made up to allow ptr[%d] syntax to work in variable 1753886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // printing, then add our name ([%d]) to the expression path 175490d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (m_is_array_item_for_pointer && epformat == eHonorPointers) 1755886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(m_name.AsCString()); 17561391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 175700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 175800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 175900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 1760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 176100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 176200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 1763bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 176400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 176500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 176600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 176700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL); 176800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 176990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers) 177000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 177100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 177200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 17731391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 17741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 17751391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer) 17761391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 17771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("->"); 17781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 17791391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) && 17801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray)) 17811391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 17821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutChar('.'); 17831391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 178400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 178500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 1786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 178700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 178800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 178900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 1790bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 179100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 179200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 179300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 179400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 179500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 179600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 1797bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1798bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1799bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 18011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (is_deref_of_parent && epformat == eDereferencePointers) { 180200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 18031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1804bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1805bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1806ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP 1807ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression, 1808ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 1809ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 1810ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_value_type, 1811ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 1812ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* final_task_on_target) 1813ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 1814ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1815ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* dummy_first_unparsed; 1816ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 1817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType dummy_final_value_type; 1818ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing; 1819ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1820ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 1821ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 1822ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 1823ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 1824ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1825ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 1826ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1827ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing) 1828ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1829ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; 1830ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1831ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects 1832ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1833ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*final_task_on_target == ValueObject::eDereference) 1834ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1835ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 1836ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 1837ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 1838ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1839ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 1840ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_value_type = ValueObject::eInvalid; 1841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1842ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1843ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1844ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1845ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_task_on_target = ValueObject::eNothing; 1846ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 1847ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1848ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1849ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*final_task_on_target == ValueObject::eTakeAddress) 1850ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1851ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 1852ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 1853ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 1854ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1855ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eTakingAddressFailed; 1856ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_value_type = ValueObject::eInvalid; 1857ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1858ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1859ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1860ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1861ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_task_on_target = ValueObject::eNothing; 1862ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 1863ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1864ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1865ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1866ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; // final_task_on_target will still have its original value, so you know I did not do it 1867ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 1868ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 18691a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 18701a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression, 18711a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectListSP& list, 18721a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 18731a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 18741a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_value_type, 18751a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 18761a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* final_task_on_target) 18771a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 18781a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* dummy_first_unparsed; 18791a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 18801a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType dummy_final_value_type; 18811a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing; 18821a102087f54079c25c8827afac6153a44ca535daEnrico Granata 18831a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 18841a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 18851a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 18861a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 18871a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 18881a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 18891a102087f54079c25c8827afac6153a44ca535daEnrico Granata 18901a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!ret_val.get()) // if there are errors, I add nothing to the list 18911a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 18921a102087f54079c25c8827afac6153a44ca535daEnrico Granata 18931a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*reason_to_stop != eArrayRangeOperatorMet) 18941a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18951a102087f54079c25c8827afac6153a44ca535daEnrico Granata // I need not expand a range, just post-process the final value and return 18961a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing) 18971a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18981a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 18991a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 19001a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19011a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects 19021a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19031a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*final_task_on_target == ValueObject::eDereference) 19041a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19051a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 19061a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 19071a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 19081a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19091a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 19101a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_value_type = ValueObject::eInvalid; 19111a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 19121a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19131a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 19141a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19151a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_task_on_target = ValueObject::eNothing; 19161a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 19171a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 19181a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19191a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19201a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*final_task_on_target == ValueObject::eTakeAddress) 19211a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19221a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 19231a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 19241a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 19251a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19261a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eTakingAddressFailed; 19271a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_value_type = ValueObject::eInvalid; 19281a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 19291a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19301a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 19311a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19321a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_task_on_target = ValueObject::eNothing; 19331a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 19341a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 19351a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19361a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19371a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19381a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19391a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 19401a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 19411a102087f54079c25c8827afac6153a44ca535daEnrico Granata return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed, 19421a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 19431a102087f54079c25c8827afac6153a44ca535daEnrico Granata ret_val, 19441a102087f54079c25c8827afac6153a44ca535daEnrico Granata list, 19451a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 19461a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 19471a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 19481a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 19491a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 19501a102087f54079c25c8827afac6153a44ca535daEnrico Granata // in any non-covered case, just do the obviously right thing 19511a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 19521a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 19531a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 19541a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP 1956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr, 1957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 1958ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 1959ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_result, 1960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 1961ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* what_next) 1962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 1963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP root = GetSP(); 1964ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 1966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata while (true) 1971ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 1974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata lldb::clang_type_t root_clang_type = root->GetClangType(); 19761a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t pointee_clang_type; 19771a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 19781a102087f54079c25c8827afac6153a44ca535daEnrico Granata 19791a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 19801a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 19811a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 1982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!expression_cstr || *expression_cstr == '\0') 1984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEndOfString; 1986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 1987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata switch (*expression_cstr) 1990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '-': 1992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && 19941a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error 1995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrowInsteadOfDot; 1998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 20011a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) && // if yo are trying to extract an ObjC IVar when this is forbidden 20021a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && 2003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options.m_no_fragile_ivar) 2004ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eFragileIVarNotAllowed; 2007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (expression_cstr[1] != '>') 2011ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip the - 2018ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '.': // or fallthrough from -> 2020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' && 20221a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error 2023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2024ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDotInsteadOfArrow; 2026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip . 2030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *next_separator = strpbrk(expression_cstr+1,"-.["); 2031ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString child_name; 2032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!next_separator) // if no other separator just expand this last layer 2033ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2034ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCString (expression_cstr); 2035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetChildMemberWithName(child_name, true); 2036ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (root.get()) // we know we are done, so just return 2037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2038ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = '\0'; 2039ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEndOfString; 2040ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 2041ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2042ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2043ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 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 } 2051ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // other layers do expand 2052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr); 2054ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetChildMemberWithName(child_name, true); 2055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (root.get()) // store the new root and move on 2056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2057ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = next_separator; 2058ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 2059ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2060ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2061ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2062ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2063ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2064ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2065ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2066ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2067ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2068ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2069ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2070ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2071ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '[': 2072ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 20731a102087f54079c25c8827afac6153a44ca535daEnrico 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* 2074ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2075f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar... 2076ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2077f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (options.m_no_synthetic_children) // ...only chance left is synthetic 2078f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2079f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2080f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *reason_to_stop = ValueObject::eRangeOperatorInvalid; 2081f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *final_result = ValueObject::eInvalid; 2082f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2083f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2084ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2085ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 2086ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2087ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2088ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eRangeOperatorNotAllowed; 2089ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2090ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2091ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2092ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2093ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 2094ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 20951a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2096ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2097ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2098ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 2099ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2100ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2101ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2102ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // even if something follows, we cannot expand unbounded ranges, just let the caller do it 2103ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2104ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2105ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2106ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eUnboundedRange; 2107ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2108ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2109ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2110ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 2111ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 2112ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!close_bracket_position) // if there is no ], this is a syntax 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 if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 2120ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2121ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2122ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 2123ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2124ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2125ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2126ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2127ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2128ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2129ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2130ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 2131ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 21321a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2133ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2134ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2135ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2136ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eUnboundedRange; 2137ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2138ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2139ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2142ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 2143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2147ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata // from here on we do have a valid index 21481a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2149ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 215024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true); 215124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!child_valobj_sp) 215224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true); 2153f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!child_valobj_sp) 2154f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (root->HasSyntheticValue() && root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetNumChildren() > index) 2155f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata child_valobj_sp = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildAtIndex(index, true); 215624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (child_valobj_sp) 215724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 215824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton root = child_valobj_sp; 215924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *first_unparsed = end+1; // skip ] 216024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *final_result = ValueObject::ePlain; 216124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton continue; 216224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 216324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton else 2164ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2165ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2166ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2167ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2168ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2169ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2170ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 21711a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 2172ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2173ff78238a2ebc66a683dded02c2f99fba85077d05Enrico 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 21741a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2175ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2176ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2177ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2178ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2179ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2180ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2181ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 2182ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2184ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2186ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2187ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next = eNothing; 2188ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2189ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2190ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2191ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2192ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2193f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (ClangASTType::GetMinimumLanguage(root->GetClangAST(), 2194f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root->GetClangType()) == lldb::eLanguageTypeObjC 2195f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata && 2196f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata ClangASTContext::IsPointerType(ClangASTType::GetPointeeType(root->GetClangType())) == false 2197f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata && 2198f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root->HasSyntheticValue() 2199f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata && 2200f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata options.m_no_synthetic_children == false) 2201f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2202f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildAtIndex(index, true); 2203f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2204f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2205f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 2206ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2207ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2208ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2209ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2210ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2211ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2212ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2213ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2214ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2215ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2216ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 2217ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2218ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2219ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2220ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2221f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else if (ClangASTContext::IsScalarType(root_clang_type)) 2222ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2223ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 2224ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2225ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2226ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2227ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2228ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2229ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2230ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2231ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 2232ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2233ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2234ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet; 2235ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBitfield; 2236ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2237ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2238ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2239f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else if (root->HasSyntheticValue() && options.m_no_synthetic_children) 2240f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2241f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildAtIndex(index, true); 2242f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!root.get()) 2243f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2244f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2245f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2246f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *final_result = ValueObject::eInvalid; 2247f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2248f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2249f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2250f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2251f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2252f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2253f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2254f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *final_result = ValueObject::eInvalid; 2255f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2256f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2257ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2258ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we have a low and a high index 2259ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2260ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2261ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 2262ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 2263ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2264ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2265ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2266ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2267ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2268ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2269ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 2270ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2271ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2272ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2273ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2274ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2275ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2276ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2277ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (index_lower > index_higher) // swap indices if required 2278ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2279ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long temp = index_lower; 2280ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_lower = index_higher; 2281ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_higher = temp; 2282ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 22831a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 2284ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2285ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 2286ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2287ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2288ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2289ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2290ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2291ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2292ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2293ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2294ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2295ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2296ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet; 2297ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBitfield; 2298ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2299ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2300ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 23011a102087f54079c25c8827afac6153a44ca535daEnrico 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 2302ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next == ValueObject::eDereference && 23031a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2304ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2305ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2306ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2307ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2308ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2309ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2310ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 2311ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2312ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2313ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2314ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2315ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2316ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next = ValueObject::eNothing; 2317ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2318ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2319ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2320ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2321ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2322ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2323ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2324ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBoundedRange; 2325ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2326ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2327ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2328ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2329ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2330ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata default: // some non-separator is in the way 2331ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2332ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2333ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2334ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2335ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2336ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2337ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2338ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2339ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2340ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 2341ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 23421a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 23431a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr, 23441a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 23451a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectSP root, 23461a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectListSP& list, 23471a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 23481a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_result, 23491a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 23501a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* what_next) 23511a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 23521a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 23531a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23541a102087f54079c25c8827afac6153a44ca535daEnrico Granata 23551a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23561a102087f54079c25c8827afac6153a44ca535daEnrico Granata 23571a102087f54079c25c8827afac6153a44ca535daEnrico Granata while (true) 23581a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23591a102087f54079c25c8827afac6153a44ca535daEnrico Granata 23601a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 23611a102087f54079c25c8827afac6153a44ca535daEnrico Granata 23621a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t root_clang_type = root->GetClangType(); 23631a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t pointee_clang_type; 23641a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 23651a102087f54079c25c8827afac6153a44ca535daEnrico Granata 23661a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 23671a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 23681a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 23691a102087f54079c25c8827afac6153a44ca535daEnrico Granata 23701a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!expression_cstr || *expression_cstr == '\0') 23711a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23721a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEndOfString; 23731a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 23741a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 23751a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23761a102087f54079c25c8827afac6153a44ca535daEnrico Granata 23771a102087f54079c25c8827afac6153a44ca535daEnrico Granata switch (*expression_cstr) 23781a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23791a102087f54079c25c8827afac6153a44ca535daEnrico Granata case '[': 23801a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23811a102087f54079c25c8827afac6153a44ca535daEnrico 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* 23821a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23831a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 23841a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23851a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23861a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorInvalid; 23871a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23881a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23891a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23901a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 23911a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23921a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23931a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorNotAllowed; 23941a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23951a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23961a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23971a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23981a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 23991a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24001a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 24011a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24021a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24031a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 24041a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24051a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24061a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24071a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // expand this into list 24081a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24091a102087f54079c25c8827afac6153a44ca535daEnrico Granata int max_index = root->GetNumChildren() - 1; 24101a102087f54079c25c8827afac6153a44ca535daEnrico Granata for (int index = 0; index < max_index; index++) 24111a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24121a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 24131a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 24141a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 24151a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24161a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 24171a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24181a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 24191a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 24201a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24211a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24221a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 24231a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 24241a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 24251a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24261a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24271a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 24281a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24291a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24311a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24401a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24411a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata int max_index = root->GetNumChildren() - 1; 24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata for (int index = 0; index < max_index; index++) 24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24531a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 24561a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24611a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24631a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata // from here on we do have a valid index 24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24691a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetChildAtIndex(index, true); 24701a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 24711a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24721a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24771a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24821a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24881a102087f54079c25c8827afac6153a44ca535daEnrico 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 24891a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 24901a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24911a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 24921a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 24931a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 24941a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24951a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24961a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 24971a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24981a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24991a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25001a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25011a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25021a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next = eNothing; 25031a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 25041a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25051a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25061a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25071a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25081a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 25091a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 25101a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25111a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 25131a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25181a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 25191a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 25201a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 25211a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 25221a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25231a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25241a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25251a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25261a102087f54079c25c8827afac6153a44ca535daEnrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 25271a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25281a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 25291a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 25301a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25311a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25321a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 25331a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 25341a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25351a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25361a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 25371a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25381a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 25391a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 25401a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 25411a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25431a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25451a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25461a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we have a low and a high index 25471a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25481a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 25491a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 25501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 25511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25521a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25531a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 25541a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 25551a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25561a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25571a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 25581a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 25591a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25601a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25611a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 25621a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 25631a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25641a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25651a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (index_lower > index_higher) // swap indices if required 25661a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25671a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long temp = index_lower; 25681a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_lower = index_higher; 25691a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_higher = temp; 25701a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25711a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 25721a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25731a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 25741a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 25751a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25761a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25771a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 25781a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 25791a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25811a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25821a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25831a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 25841a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 25851a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 25861a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 25871a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25881a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25891a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25901a102087f54079c25c8827afac6153a44ca535daEnrico 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 25911a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next == ValueObject::eDereference && 25921a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 25931a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25941a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 25951a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 25961a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 25971a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25981a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25991a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 26001a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 26011a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 26021a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26031a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 26041a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 26051a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next = ValueObject::eNothing; 26061a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 26071a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26081a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26091a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 26101a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 26112bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (unsigned long index = index_lower; 26121a102087f54079c25c8827afac6153a44ca535daEnrico Granata index <= index_higher; index++) 26131a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 26141a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 26151a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 26161a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 26171a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26181a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; 26191a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 26201a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 26211a102087f54079c25c8827afac6153a44ca535daEnrico Granata return index_higher-index_lower+1; // tell me number of items I added to the VOList 26221a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26231a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26241a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 26251a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26261a102087f54079c25c8827afac6153a44ca535daEnrico Granata default: // some non-[ separator, or something entirely wrong, is in the way 26271a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 26281a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 26291a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 26301a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 26311a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 26321a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 26331a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26341a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26351a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 26361a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 26371a102087f54079c25c8827afac6153a44ca535daEnrico Granata 2638bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid 263966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject 264066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton( 264166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton Stream &s, 264266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ValueObject *valobj, 264366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton const char *root_valobj_name, 264466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t ptr_depth, 264566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t curr_depth, 264666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t max_depth, 264766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_types, 264866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_location, 264966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool use_objc, 265010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham lldb::DynamicValueType use_dynamic, 2651e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata bool use_synth, 2652bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool scope_already_checked, 26537f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata bool flat_output, 26547f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata uint32_t omit_summary_depth 265566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton) 265666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 265782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (valobj) 265866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2659afb7c85df796f74262917e44dd68f668dade3911Enrico Granata bool update_success = valobj->UpdateValueIfNeeded (use_dynamic, true); 266082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 266182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (update_success && use_dynamic != lldb::eNoDynamicValues) 2662e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 266310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get(); 2664e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (dynamic_value) 2665e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham valobj = dynamic_value; 2666e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 2667e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2668bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 2669bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2670f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 2671bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 2672f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 2673f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 2674bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2675bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const bool print_valobj = flat_output == false || has_value; 2676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2677bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 267866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2679bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (show_location) 2680bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2681fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham s.Printf("%s: ", valobj->GetLocationAsCString()); 2682bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 268366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2684bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 268566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2686a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton // Always show the type for the top level items. 268700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (show_types || (curr_depth == 0 && !flat_output)) 2688afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2689441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata const char* typeName = valobj->GetTypeName().AsCString("<invalid type>"); 2690441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf("(%s", typeName); 2691441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata // only show dynamic types if the user really wants to see types 2692441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata if (show_types && use_dynamic != lldb::eNoDynamicValues && 2693441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata (/*strstr(typeName, "id") == typeName ||*/ 2694441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata ClangASTType::GetMinimumLanguage(valobj->GetClangAST(), valobj->GetClangType()) == lldb::eLanguageTypeObjC)) 2695afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2696afb7c85df796f74262917e44dd68f668dade3911Enrico Granata Process* process = valobj->GetUpdatePoint().GetProcessSP().get(); 2697afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (process == NULL) 2698441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf(", dynamic type: unknown) "); 2699afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2700afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2701afb7c85df796f74262917e44dd68f668dade3911Enrico Granata ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime(); 2702afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (runtime == NULL) 2703441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf(", dynamic type: unknown) "); 2704afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2705afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2706afb7c85df796f74262917e44dd68f668dade3911Enrico Granata ObjCLanguageRuntime::ObjCISA isa = runtime->GetISA(*valobj); 2707afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!runtime->IsValidISA(isa)) 2708441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf(", dynamic type: unknown) "); 2709afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2710afb7c85df796f74262917e44dd68f668dade3911Enrico Granata s.Printf(", dynamic type: %s) ", 2711afb7c85df796f74262917e44dd68f668dade3911Enrico Granata runtime->GetActualTypeName(isa).GetCString()); 2712afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 2713afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 2714afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 2715afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2716afb7c85df796f74262917e44dd68f668dade3911Enrico Granata s.Printf(") "); 2717afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 271866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 271966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2720bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 2721bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2722b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 2723b01000fd063629facd45044f137446fb748ee179Greg Clayton const bool qualify_cxx_base_classes = show_types; 2724b01000fd063629facd45044f137446fb748ee179Greg Clayton valobj->GetExpressionPath(s, qualify_cxx_base_classes); 2725bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString(" ="); 2726bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2727bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2728bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2729bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 2730bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 2731bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2732bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2733fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!scope_already_checked && !valobj->IsInScope()) 2734bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 273582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton err_cstr = "out of scope"; 2736bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 273766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 273866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2739bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 27401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char *sum_cstr = NULL; 27411a102087f54079c25c8827afac6153a44ca535daEnrico Granata SummaryFormat* entry = valobj->GetSummaryFormat().get(); 2742bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 27437f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata if (omit_summary_depth > 0) 27447f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata entry = NULL; 27457f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata 2746bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 2747bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2748fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham val_cstr = valobj->GetValueAsCString(); 2749bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 2750bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 275166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 275266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 275366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 275482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton s.Printf (" <%s>\n", err_cstr); 275566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 275666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 275766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 2759bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 27611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 27627f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL; 276366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 27641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // We must calculate this value in realtime because entry might alter this variable's value 27651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // (e.g. by saying ${var%fmt}) and render precached values useless 27661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr)) 27671391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.Printf(" %s", valobj->GetValueAsCString()); 276866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 276990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (sum_cstr) 2770886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 2771886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // for some reason, using %@ (ObjC description) in a summary string, makes 2772886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // us believe we need to reset ourselves, thus invalidating the content of 2773886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty 2774886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // let us recalculate it! 2775886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (sum_cstr[0] == '\0') 2776886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", valobj->GetSummaryAsCString()); 2777886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 2778886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", sum_cstr); 2779886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 2780bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2781bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (use_objc) 2782bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2783fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const char *object_desc = valobj->GetObjectDescription(); 2784bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 2785bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s\n", object_desc); 2786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2787e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan s.Printf (" [no Objective-C description available]\n"); 2788bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 2789886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 279066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 279166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 279266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (curr_depth < max_depth) 279366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 2795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 2796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 2797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 2798f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 2799f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2800f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 2801f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 2802f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 2803f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2804f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 2805f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 2806f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 2808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 2809b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType ptr_address_type; 2810f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (valobj->GetPointerValue (ptr_address_type, true) == 0) 2811f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 2812f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2813f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 2814f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2815f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 2816f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 2817f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 2818f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 2819f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 2820f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2821f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2822f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 2823f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 2824f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 282566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2826886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr)) 282766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2828e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synth_vobj = valobj->GetSyntheticValue(use_synth ? 2829e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata lldb::eUseSyntheticFilter : 2830e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata lldb::eNoSyntheticFilter); 2831e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata const uint32_t num_children = synth_vobj->GetNumChildren(); 2832bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 283366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2834bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 283566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2836bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2837bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 2838bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2839bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2840bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2841bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 28423f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 2843bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 2844bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2845bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2846bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton for (uint32_t idx=0; idx<num_children; ++idx) 2847bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2848e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP child_sp(synth_vobj->GetChildAtIndex(idx, true)); 2849bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 2850bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2851bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton DumpValueObject (s, 2852bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_sp.get(), 2853bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton NULL, 2854f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 2855bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton curr_depth + 1, 2856bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton max_depth, 2857bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_types, 2858bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_location, 2859bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton false, 2860e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham use_dynamic, 2861e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata use_synth, 2862bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton true, 28637f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata flat_output, 28647f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata omit_summary_depth > 1 ? omit_summary_depth - 1 : 0); 2865bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2866bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2867bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2868bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!flat_output) 2869bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2870bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 2871bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 287266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 287366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 2874bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 2875bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2876bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 2877bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2878f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 2879bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2880bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2881bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2882bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2883bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 2884bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2885bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 288666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 2887bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2888bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 288966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 289066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 289166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 289266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 289366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2894bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 289566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2896bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 289766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 289866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 289966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 290066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 290166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 290266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2903427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2904427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 2905fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name) 2906427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 2907427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 2908427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2909afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false) && m_error.Success()) 2910427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2911fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 2912fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 2913fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2914fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 2915fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 2916427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2917fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham clang::ASTContext *ast = GetClangAST (); 2918427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2919fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham DataExtractor data; 2920fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetByteOrder (m_data.GetByteOrder()); 2921fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetAddressByteSize(m_data.GetAddressByteSize()); 2922427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2923801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule()); 2924427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 292547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (exe_scope, 292647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 292747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham GetClangType(), 292847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 292947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham data); 2930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2931427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2932fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2933fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!valobj_sp) 2934427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 293547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (NULL, m_error); 2936427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2937427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 2938427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 2939427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2940427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP 2941bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 2942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 294347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 294447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 2945e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2946c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 2947c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 2948427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2949427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 295024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = false; 2951427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2952427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 2953427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 2954427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 2955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 2956427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 2957427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 295800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 2959427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 2960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 2961427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 2962427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 296358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 296458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext exe_ctx; 296558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 296658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 296758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 296858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham clang_ast, 2969427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 2970427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 2971427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 2972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 2973427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 297424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 2975427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 2976427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 2977427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 2978427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 2979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 298000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 298100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 2982a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 2983427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2984427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 2985427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 2986427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 2987427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 298847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj = new ValueObjectChild (*this, 298947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham clang_ast, 299047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_clang_type, 299147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_name, 299247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_size, 299347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_offset, 299447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_size, 299547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_offset, 299647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_base_class, 299747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_deref_of_parent); 2998427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2999427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3000c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 300147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 3002c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3003c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 300447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 3005c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3006427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 3007427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3008c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 3009b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 3010c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3011c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 3012c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 3013c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 3014c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 301547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 3016427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3017427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3018427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3019e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP 3020c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 3021427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3022e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_addr_of_valobj_sp) 3023e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3024e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3025b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeInvalid; 3026427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 3027427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address); 3028c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 3029427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 3030427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3031427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 3032427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3033c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 3034427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 3035c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3036c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 3037b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 3038c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 3039c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3040427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3041c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 3043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 3044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 3045427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3046427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 3047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 3048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 3049427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 3051427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 305247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(), 305347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 305447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ClangASTContext::CreatePointerType (ast, clang_type), 305547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ConstString (name.c_str()), 305647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham addr, 305747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeInvalid, 305847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_data.GetAddressByteSize()); 3059427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3060427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3061427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3062427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3063427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3064e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3065427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3066427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 30670039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30680039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 30690039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type) 30700039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 30710039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 30720039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 30730039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 30740039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 30750039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30760039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 30770039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 30780039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 30790039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 30810039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 30820039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 30830039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton clang_ast_type); 30840039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 30850039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 30860039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 30870039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30880039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 30890039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp) 30900039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 30910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 30920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 30930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 30940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 30950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 30970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 30980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 30990039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 31000039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 31010039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 31020039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 31030039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton type_sp); 31040039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 31050039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 31060039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 31070039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () : 3109dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_thread_id (LLDB_INVALID_UID), 311021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id () 3111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected): 3115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update (true), 3116dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update (true), 311791635093b0282d888fcde84a276ae518643c7fcaJim Ingham m_thread_id (LLDB_INVALID_THREAD_ID), 311821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id () 3119dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson 3120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 3122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *computed_exe_scope = exe_scope; // If use_selected is true, we may find a better scope, 3123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // and if so we want to cache that not the original. 3124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 3125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 3126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.target != NULL) 3127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp = exe_ctx.target->GetSP(); 3129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.process == NULL) 3131fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.target->GetProcessSP(); 3132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.process->GetSP(); 3134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp != NULL) 3136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 313721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id = m_process_sp->GetModID(); 313821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 3139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = NULL; 3140fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.thread == NULL) 3142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = m_process_sp->GetThreadList().GetSelectedThread().get(); 3146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread) 3147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = thread; 3148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = exe_ctx.thread; 3152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 3154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = thread->GetIndexID(); 3156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.frame == NULL) 3157fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get(); 3161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (frame) 3162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3163fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = frame->GetStackID(); 3164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = frame; 3165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = exe_ctx.frame->GetStackID(); 3170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = computed_exe_scope; 3174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) : 3177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope (rhs.m_exe_scope), 3178dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_needs_update(true), 3179dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update(true), 3180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp (rhs.m_target_sp), 3181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp (rhs.m_process_sp), 3182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id (rhs.m_thread_id), 3183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id (rhs.m_stack_id), 318421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id () 3185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint () 3189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope * 3193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope () 3194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // We have to update before giving out the scope, or we could be handing out stale pointers. 3196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SyncWithProcessState(); 3197fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return m_exe_scope; 3199fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3201fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state. If the current 3202fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return 3203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change". If the current state is different, we update our state, and return 3204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change". If we did see a change, we also set m_needs_update to true, so 3205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true. 3206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState() 3209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we're already invalid, we don't need to do anything, and nothing has changed: 321121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (!m_mod_id.IsValid()) 3212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3213fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Can't update with an invalid state. 3214fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = false; 3215fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3217fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3218fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we don't have a process nothing can change. 3219fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_process_sp) 3220fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3222fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If our stop id is the current stop ID, nothing has changed: 322321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham ProcessModID current_mod_id = m_process_sp->GetModID(); 322421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 322521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_mod_id == current_mod_id) 3226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3227fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3228e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // If the current stop id is 0, either we haven't run yet, or the process state has been cleared. 3229e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // In either case, we aren't going to be able to sync with the process state. 323021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (current_mod_id.GetStopID() == 0) 3231e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return false; 3232e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 323321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id = current_mod_id; 3234fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = true; 3235fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = m_process_sp.get(); 3236fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3237fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Something has changed, so we will return true. Now make sure the thread & frame still exist, and if either 3238fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // doesn't, mark ourselves as invalid. 3239fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3240fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_THREAD_ID) 3241fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3242fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get(); 3243fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_thread == NULL) 3244bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton { 324591635093b0282d888fcde84a276ae518643c7fcaJim Ingham SetInvalid(); 3246bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton } 3247fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3248fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3249fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_thread; 3250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3251fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_stack_id.IsValid()) 3252fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3253fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get(); 3254fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_frame == NULL) 3255fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetInvalid(); 3256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3257fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_frame; 3258fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3259fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3260fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3261fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return true; 3262fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3263fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3264ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid 3265ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated () 3266ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{ 3267ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_first_update = false; 3268ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_needs_update = false; 3269ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham if (m_process_sp) 327021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 327121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id = m_process_sp->GetModID(); 327221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 3273ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham} 3274ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3275ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3276fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3277fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope) 3278fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3279fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!IsValid()) 3280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3282fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool needs_update = false; 3283fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = NULL; 3284fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3285fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // The target has to be non-null, and the 3286fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *target = exe_scope->CalculateTarget(); 3287fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (target != NULL) 3288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3289fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *old_target = m_target_sp.get(); 3290fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (target == old_target); 3291fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *process = exe_scope->CalculateProcess(); 3292fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (process != NULL) 3293fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3294fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // FOR NOW - assume you can't update variable objects across process boundaries. 3295fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *old_process = m_process_sp.get(); 3296fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (process == old_process); 329721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham ProcessModID current_mod_id = process->GetModID(); 329821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_mod_id != current_mod_id) 3299fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3300fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 330121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id = current_mod_id; 3302fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3303fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // See if we're switching the thread or stack context. If no thread is given, this is 3304fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // being evaluated in a global context. 3305fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = exe_scope->CalculateThread(); 3306fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 3307fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3308fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::user_id_t new_thread_index = thread->GetIndexID(); 3309fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_thread_index != m_thread_id) 3310fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3311fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3312fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = new_thread_index; 3313fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3314fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3315fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3316fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *new_frame = exe_scope->CalculateStackFrame(); 3317fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame != NULL) 3318fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3319fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame->GetStackID() != m_stack_id) 3320fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3321fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3322fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = new_frame->GetStackID(); 3323fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3324fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3325fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3326fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3327fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3328fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3329fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3330fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3331fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3332fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3333fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If this had been given a thread, and now there is none, we should update. 3334fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Otherwise we don't have to do anything. 3335fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_UID) 3336fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3337fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3338fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3339fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3340fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3341fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3342fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3343fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3344fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3345fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there is no process, then we don't need to update anything. 3346fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a process to not, we should try to update. 3347fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp.get() != NULL) 3348fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3349fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3350fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 3351fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3352fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3353fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3354fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3355fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3356fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3357fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3358fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there's no target, nothing can change so we don't need to update anything. 3359fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a target to not, we should try to update. 3360fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_target_sp.get() != NULL) 3361fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3362fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3363fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp.reset(); 3364fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 3365fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3366fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3367fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3368fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3369fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_needs_update) 3370fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = needs_update; 3371fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3372fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return needs_update; 3373fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3374f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 3375f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid 3376f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico GranataValueObject::ClearUserVisibleData() 3377f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{ 3378f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_location_str.clear(); 3379f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.clear(); 3380f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.clear(); 3381f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_object_desc_str.clear(); 33822bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen} 3383