ValueObject.cpp revision 441f08ca9d17fad237b93a71aeab9dad74ea1258
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(), 8523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_user_id_of_forced_summary(0), 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(), 13123ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_user_id_of_forced_summary(0), 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()); 2261a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (HasCustomSummaryFormat() && m_update_point.GetUpdateID() != 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{ 3340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 335fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 336fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 337fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 3380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ()); 3390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return scalar.IsValid(); 3400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 3410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 3420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 34317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 356fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange () 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 358fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham GetValueAsCString (); 35917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create) 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 372917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 373917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 374afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 375917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (idx < GetNumChildren()) 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 377917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check if we have already made the child value object? 378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (can_create && m_children[idx] == NULL) 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // No we haven't created the child at this index, so lets have our 381917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // subclass do it and cache the result for quick future access. 382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton m_children[idx] = CreateChildAtIndex (idx, false, 0); 383e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 384917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_children[idx] != NULL) 386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return m_children[idx]->GetSP(); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 396462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4045d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 410917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 411afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 412917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 413917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t> child_indexes; 414917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 415917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton void *clang_type = GetClangType(); 416917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 417917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 418917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 419917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton name.GetCString(), 420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 421917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_indexes); 422917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (num_child_indexes > 0) 423e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 424917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 425917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator end = child_indexes.end (); 426e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = GetChildAtIndex(*pos, can_create); 428917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton for (++pos; pos != end; ++pos) 429917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 430917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_sp) 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = new_child_sp; 434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 436917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp.reset(); 438e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_children.size(); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children) 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_children.resize(num_children); 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46847da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index) 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 471bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham ValueObject *valobj = NULL; 472e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 473917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 47424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = synthetic_array_member; 475917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::string child_name_str; 476917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_byte_size = 0; 477917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton int32_t child_byte_offset = 0; 478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_size = 0; 479917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_offset = 0; 480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_base_class = false; 481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_deref_of_parent = false; 482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool transparent_pointers = synthetic_array_member == false; 484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 485917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t clang_type = GetClangType(); 486917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t child_clang_type; 487917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 488917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ExecutionContext exe_ctx; 489917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 490917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 491917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 492917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 493917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetName().GetCString(), 494917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 495917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton idx, 496917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton transparent_pointers, 497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 49824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name_str, 500917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 502917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 503917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_clang_type && child_byte_size) 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (synthetic_index) 509917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset += child_byte_size * synthetic_index; 510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ConstString child_name; 512917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!child_name_str.empty()) 513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name.SetCString (child_name_str.c_str()); 514917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 515917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj = new ValueObjectChild (*this, 516917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 517917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type, 518917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name, 519917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 520917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 521917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 522917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 523917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 524917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 525917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (m_pointers_point_to_load_addrs) 526917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs); 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 528e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 52947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 533fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString () 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5357dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata if (UpdateValueIfNeeded (true)) 5361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 539f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata SummaryFormat *summary_format = GetSummaryFormat().get(); 5401a102087f54079c25c8827afac6153a44ca535daEnrico Granata 5411a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (summary_format) 5421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 543f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str = summary_format->FormatObject(GetSP()); 5441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 545f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata else 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 547f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type_t clang_type = GetClangType(); 548f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 54990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata // Do some default printout for function pointers 550f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (clang_type) 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 552f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata StreamString sstr; 553f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type_t elem_or_pointee_clang_type; 554f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 555f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetClangAST(), 556f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata &elem_or_pointee_clang_type)); 557f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 558f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ExecutionContextScope *exe_scope = GetExecutionContextScope(); 559f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (exe_scope) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56190d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (ClangASTContext::IsFunctionPointerType (clang_type)) 562fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 563f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata AddressType func_ptr_address_type = eAddressTypeInvalid; 564f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true); 565fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 566f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 567f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 568f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata switch (func_ptr_address_type) 56903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 570f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeInvalid: 571f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeFile: 572f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 573f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 574f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeLoad: 57503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 576f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address so_addr; 577f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Target *target = exe_scope->CalculateTarget(); 578f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (target && target->GetSectionLoadList().IsEmpty() == false) 579fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 580f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 581f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 582f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata so_addr.Dump (&sstr, 583f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata exe_scope, 584f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address::DumpStyleResolvedDescription, 585f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Address::DumpStyleSectionNameOffset); 586f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 587fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 58803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 589f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 591f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eAddressTypeHost: 592f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 593f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 594f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 595f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (sstr.GetSize() > 0) 596f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 597f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.assign (1, '('); 598f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.append (sstr.GetData(), sstr.GetSize()); 599f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.append (1, ')'); 600fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6121a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool 6131a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer) 6141a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 6151a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 6161a102087f54079c25c8827afac6153a44ca535daEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(), 6171a102087f54079c25c8827afac6153a44ca535daEnrico Granata GetClangAST(), 6181a102087f54079c25c8827afac6153a44ca535daEnrico Granata &elem_or_pointee_clang_type)); 6191a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 6201a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)); 6211a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!is_char_arr_ptr) 6221a102087f54079c25c8827afac6153a44ca535daEnrico Granata return false; 6231a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!check_pointer) 6241a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 6251a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test(ClangASTContext::eTypeIsArray)) 6261a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 6271a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 6281a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 6291a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetAddressOf (cstr_address_type, true); 6301a102087f54079c25c8827afac6153a44ca535daEnrico Granata return (cstr_address != LLDB_INVALID_ADDRESS); 6311a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 6321a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6331a102087f54079c25c8827afac6153a44ca535daEnrico Granatavoid 6341a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ReadPointedString(Stream& s, 6351a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error& error, 63686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t max_length, 63786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool honor_array, 63886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata lldb::Format item_format) 6391a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 6401a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6411a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (max_length == 0) 64286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata max_length = 128; // FIXME this should be a setting, or a formatting parameter 6431a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6441a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t clang_type = GetClangType(); 6451a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 6461a102087f54079c25c8827afac6153a44ca535daEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 6471a102087f54079c25c8827afac6153a44ca535daEnrico Granata GetClangAST(), 6481a102087f54079c25c8827afac6153a44ca535daEnrico Granata &elem_or_pointee_clang_type)); 6491a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 6501a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 6511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6521a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExecutionContextScope *exe_scope = GetExecutionContextScope(); 6531a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (exe_scope) 6541a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6551a102087f54079c25c8827afac6153a44ca535daEnrico Granata Target *target = exe_scope->CalculateTarget(); 656979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (target == NULL) 657979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 658979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<no target to read from>"; 659979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 660979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 6611a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6621a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS; 6631a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 6641a102087f54079c25c8827afac6153a44ca535daEnrico Granata 6651a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t cstr_len = 0; 6661a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool capped_data = false; 6671a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test (ClangASTContext::eTypeIsArray)) 6681a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6691a102087f54079c25c8827afac6153a44ca535daEnrico Granata // We have an array 6701a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_len = ClangASTContext::GetArraySize (clang_type); 67186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (cstr_len > max_length) 6721a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 67386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata capped_data = true; 67486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len = max_length; 6751a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6761a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetAddressOf (cstr_address_type, true); 6771a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 6781a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 6791a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6801a102087f54079c25c8827afac6153a44ca535daEnrico Granata // We have a pointer 6811a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_address = GetPointerValue (cstr_address_type, true); 6821a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 683979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (cstr_address == LLDB_INVALID_ADDRESS) 684979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 685979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<invalid address for data>"; 686979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 687979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 6881a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6891a102087f54079c25c8827afac6153a44ca535daEnrico Granata Address cstr_so_addr (NULL, cstr_address); 6901a102087f54079c25c8827afac6153a44ca535daEnrico Granata DataExtractor data; 6911a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t bytes_read = 0; 6921a102087f54079c25c8827afac6153a44ca535daEnrico Granata std::vector<char> data_buffer; 6931a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool prefer_file_cache = false; 69486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (cstr_len > 0 && honor_array) 6951a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 6961a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.resize(cstr_len); 6971a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder()); 6981a102087f54079c25c8827afac6153a44ca535daEnrico Granata bytes_read = target->ReadMemory (cstr_so_addr, 6991a102087f54079c25c8827afac6153a44ca535daEnrico Granata prefer_file_cache, 7001a102087f54079c25c8827afac6153a44ca535daEnrico Granata &data_buffer.front(), 7011a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_len, 7021a102087f54079c25c8827afac6153a44ca535daEnrico Granata error); 7031a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (bytes_read > 0) 7041a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 7051a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7061a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.Dump (&s, 7071a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // Start offset in "data" 70886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata item_format, 7091a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1, // Size of item (1 byte for a char!) 7101a102087f54079c25c8827afac6153a44ca535daEnrico Granata bytes_read, // How many bytes to print? 7111a102087f54079c25c8827afac6153a44ca535daEnrico Granata UINT32_MAX, // num per line 7121a102087f54079c25c8827afac6153a44ca535daEnrico Granata LLDB_INVALID_ADDRESS,// base address 7131a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // bitfield bit size 7141a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0); // bitfield bit offset 7151a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (capped_data) 7161a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << "..."; 7171a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7181a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 719979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata else 720979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "\"<data not available>\""; 7211a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7221a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 7231a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 72486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len = max_length; 72586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata const size_t k_max_buf_size = 64; 7261a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.resize (k_max_buf_size + 1); 7271a102087f54079c25c8827afac6153a44ca535daEnrico Granata // NULL terminate in case we don't get the entire C string 7281a102087f54079c25c8827afac6153a44ca535daEnrico Granata data_buffer.back() = '\0'; 7291a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7301a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7311a102087f54079c25c8827afac6153a44ca535daEnrico Granata 732979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata bool any_data = false; 733979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 7341a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder()); 7351a102087f54079c25c8827afac6153a44ca535daEnrico Granata while ((bytes_read = target->ReadMemory (cstr_so_addr, 7361a102087f54079c25c8827afac6153a44ca535daEnrico Granata prefer_file_cache, 7371a102087f54079c25c8827afac6153a44ca535daEnrico Granata &data_buffer.front(), 7381a102087f54079c25c8827afac6153a44ca535daEnrico Granata k_max_buf_size, 7391a102087f54079c25c8827afac6153a44ca535daEnrico Granata error)) > 0) 7401a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 741979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata any_data = true; 7421a102087f54079c25c8827afac6153a44ca535daEnrico Granata size_t len = strlen(&data_buffer.front()); 7431a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len == 0) 7441a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 7451a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len > bytes_read) 7461a102087f54079c25c8827afac6153a44ca535daEnrico Granata len = bytes_read; 74786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (len > cstr_len) 74886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata len = cstr_len; 7491a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7501a102087f54079c25c8827afac6153a44ca535daEnrico Granata data.Dump (&s, 7511a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // Start offset in "data" 75286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata item_format, 7531a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1, // Size of item (1 byte for a char!) 7541a102087f54079c25c8827afac6153a44ca535daEnrico Granata len, // How many bytes to print? 7551a102087f54079c25c8827afac6153a44ca535daEnrico Granata UINT32_MAX, // num per line 7561a102087f54079c25c8827afac6153a44ca535daEnrico Granata LLDB_INVALID_ADDRESS,// base address 7571a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0, // bitfield bit size 7581a102087f54079c25c8827afac6153a44ca535daEnrico Granata 0); // bitfield bit offset 7591a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7601a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (len < k_max_buf_size) 7611a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 76286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (len >= cstr_len) 76386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 76486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << "..."; 76586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 76686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 76786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata cstr_len -= len; 7681a102087f54079c25c8827afac6153a44ca535daEnrico Granata cstr_so_addr.Slide (k_max_buf_size); 7691a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 770979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 771979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (any_data == false) 772979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<data not available>"; 773979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 7741a102087f54079c25c8827afac6153a44ca535daEnrico Granata s << '"'; 7751a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7761a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7771a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7781a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7791a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7801a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 7811a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 7821a102087f54079c25c8827afac6153a44ca535daEnrico Granata error.SetErrorString("impossible to read a string from this object"); 783979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<not a string object>"; 7841a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 7851a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 7861a102087f54079c25c8827afac6153a44ca535daEnrico Granata 7874ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 788fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription () 7894ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 790886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 7917dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata if (!UpdateValueIfNeeded (true)) 7924ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 793886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 794886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!m_object_desc_str.empty()) 795886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_object_desc_str.c_str(); 796886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 797fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 798fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope == NULL) 799fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return NULL; 800fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 8014ae519666628cca07c194bf677163009cc2e5a8bJim Ingham Process *process = exe_scope->CalculateProcess(); 802b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 8034ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 804b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 805b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 8064ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 807b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham lldb::LanguageType language = GetObjectRuntimeLanguage(); 808b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 8094ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 8100e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 8110e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 81270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway... 8130e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 8140e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 8150e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 81670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham bool is_signed; 81770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed) 81870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham || ClangASTContext::IsPointerType (opaque_qual_type)) 81970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham { 8200e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC); 82170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham } 8220e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 8230e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 8240e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 8250de37195f17fefb536157b3296a18999116b8125Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this)) 8264ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 8274ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 8284ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 829e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 830e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 831e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 832e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 833e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 8344ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 837fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString () 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If our byte size is zero this is an aggregate type that has children 840462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (ClangASTContext::IsAggregateType (GetClangType()) == false) 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 842afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(true)) 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Value::ContextType context_type = m_value.GetContextType(); 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (context_type) 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeClangType: 8516916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeLLDBType: 8526916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeVariable: 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 854f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type = GetClangType (); 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 857afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (m_format == lldb::eFormatDefault && m_last_value_format) 8581391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 859f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str = m_last_value_format->FormatObject(GetSP()); 8601391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 86282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 863f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata StreamString sstr; 864f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata Format format = GetFormat(); 865f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (format == eFormatDefault) 866f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata format = (m_is_bitfield_for_scalar ? eFormatUnsigned : 867f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClangASTType::GetFormat(clang_type)); 868f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 869f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata if (ClangASTType::DumpTypeValue (GetClangAST(), // The clang AST 870f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata clang_type, // The clang type to display 871f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata &sstr, 872f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata format, // Format to display this type with 873f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_data, // Data to extract from 874f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 0, // Byte offset into "m_data" 875f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetByteSize(), // Byte size of item in "m_data" 876f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetBitfieldBitSize(), // Bitfield bit size 877f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetBitfieldBitOffset())) // Bitfield bit offset 878f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.swap(sstr.GetString()); 879f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata else 880f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata { 881f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)", 882f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_data.GetByteSize(), 883f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata GetByteSize()); 884f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.clear(); 885f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 88682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8916916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case Value::eContextTypeRegisterInfo: 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString reg_sstr; 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data.Dump(®_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_str.swap(reg_sstr.GetString()); 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 90254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 90354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 90454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton 90817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_value_did_change && m_old_value_valid) 90917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton { 91017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // The value was gotten successfully, so we consider the 91117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton // value as changed if the value string differs 91217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton SetValueDidChange (m_old_value_str != m_value_str); 91317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton } 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 921afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used 922afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers 923afb7c85df796f74262917e44dd68f668dade3911Enrico Granataunsigned long long 924afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::GetValueAsUnsigned() 925afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{ 926afb7c85df796f74262917e44dd68f668dade3911Enrico Granata // If our byte size is zero this is an aggregate type that has children 927afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == false) 928afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 929afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(true)) 930afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 931afb7c85df796f74262917e44dd68f668dade3911Enrico Granata uint32_t offset = 0; 932afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return m_data.GetMaxU64(&offset, 933afb7c85df796f74262917e44dd68f668dade3911Enrico Granata m_data.GetByteSize()); 934afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 935afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 936afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return 0; 937afb7c85df796f74262917e44dd68f668dade3911Enrico Granata} 938afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 939de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// this call should only return pointers to data that needs no special memory management 940de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// (either because they are hardcoded strings, or because they are backed by some other 941de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// object); returning any new()-ed or malloc()-ed data here, will lead to leaks! 942886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granataconst char * 943886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::GetPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, 944886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata lldb::Format custom_format) 945886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 94686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 94786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata RefCounter ref(&m_dump_printable_counter); 94886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 94990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (custom_format != lldb::eFormatInvalid) 950886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata SetFormat(custom_format); 951886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 952886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata const char * return_value; 953886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 954886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata switch(val_obj_display) 955886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 956886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayValue: 957886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetValueAsCString(); 958886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 959886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplaySummary: 960886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetSummaryAsCString(); 961886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 962886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata case eDisplayLanguageSpecific: 963886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return_value = GetObjectDescription(); 964886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata break; 965f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata case eDisplayLocation: 966f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata return_value = GetLocationAsCString(); 967f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata break; 968886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 969886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 97086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // this code snippet might lead to endless recursion, thus we use a RefCounter here to 97186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // check that we are not looping endlessly 97286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!return_value && (m_dump_printable_counter < 3)) 9739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 9749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // try to pick the other choice 9759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (val_obj_display == eDisplayValue) 9769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return_value = GetSummaryAsCString(); 9779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (val_obj_display == eDisplaySummary) 978de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 979de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == true) 980de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 981de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata // this thing has no value 982de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata return_value = "<no summary defined for this datatype>"; 983de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 984de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else 985de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata return_value = GetValueAsCString(); 986de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 9879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 988886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 989de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata return (return_value ? return_value : "<no printable representation>"); 9909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 9919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 992886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 9939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 9949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s, 9959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectRepresentationStyle val_obj_display, 9969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata lldb::Format custom_format) 9979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 99886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 99986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata clang_type_t elem_or_pointee_type; 100086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type)); 10011a102087f54079c25c8827afac6153a44ca535daEnrico Granata 100286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) 100386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata && val_obj_display == ValueObject::eDisplayValue) 10041a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 100586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // when being asked to get a printable display an array or pointer type directly, 100686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // try to "do the right thing" 100786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 100886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (IsCStringContainer(true) && 100986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCString || 101086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatCharArray || 101186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatChar || 101286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata custom_format == lldb::eFormatVectorOfChar)) // print char[] & char* directly 101386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 101486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata Error error; 101586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ReadPointedString(s, 101686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata error, 101786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 0, 101886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfChar) || 101986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCharArray)); 102086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return !error.Fail(); 102186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 102286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 102386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (custom_format == lldb::eFormatEnum) 102486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return false; 102586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 102686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // this only works for arrays, because I have no way to know when 102786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata // the pointed memory ends, and no special \0 end of data marker 102886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (flags.Test(ClangASTContext::eTypeIsArray)) 102986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 103086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatBytes) || 103186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatBytesWithASCII)) 103286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 103386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t count = GetNumChildren(); 103486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 103586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << '['; 103686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata for (uint32_t low = 0; low < count; low++) 103786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 103886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 103986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (low) 104086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ','; 104186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 104286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 104386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!child.get()) 104486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1045de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata s << "<invalid child>"; 104686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata continue; 104786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 104886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, custom_format); 104986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 105086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 105186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ']'; 105286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 105386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return true; 105486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 105586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 105686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatVectorOfChar) || 105786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfFloat32) || 105886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfFloat64) || 105986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt16) || 106086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt32) || 106186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt64) || 106286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfSInt8) || 106386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt128) || 106486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt16) || 106586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt32) || 106686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt64) || 106786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly 106886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 106986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata uint32_t count = GetNumChildren(); 107086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 107186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata lldb::Format format = FormatManager::GetSingleItemFormat(custom_format); 107286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 107386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << '['; 107486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata for (uint32_t low = 0; low < count; low++) 107586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 107686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 107786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (low) 107886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ','; 107986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 108086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 108186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if (!child.get()) 108286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1083de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata s << "<invalid child>"; 108486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata continue; 108586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 108686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, format); 108786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 108886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 108986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s << ']'; 109086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 109186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return true; 109286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 109386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 109486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 109586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata if ((custom_format == lldb::eFormatBoolean) || 109686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatBinary) || 109786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatChar) || 109886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatCharPrintable) || 109986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplexFloat) || 110086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatDecimal) || 110186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatHex) || 110286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatFloat) || 110386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatOctal) || 110486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatOSType) || 110586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnicode16) || 110686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnicode32) || 110786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatUnsigned) || 110886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatPointer) || 110986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplexInteger) || 111086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatComplex) || 111186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata (custom_format == lldb::eFormatDefault)) // use the [] operator 111286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return false; 11131a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 111486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata const char *targetvalue = GetPrintableRepresentation(val_obj_display, custom_format); 111590d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (targetvalue) 111686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata s.PutCString(targetvalue); 111786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool var_success = (targetvalue != NULL); 111890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (custom_format != eFormatInvalid) 111986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata SetFormat(eFormatDefault); 112086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return var_success; 1121886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 1122886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 112303e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 1124b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address) 1125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 1126afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1127e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return LLDB_INVALID_ADDRESS; 1128e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 1130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 1132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 1133f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeLoad; 1135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1137f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 1140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 1141f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 1142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = m_value.GetValueAddressType (); 1144f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton address_type = eAddressTypeInvalid; 1149f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 1150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 1151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 1153b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address) 115403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 115503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton lldb::addr_t address = LLDB_INVALID_ADDRESS; 115603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeInvalid; 1157e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1158afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1159e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return address; 1160e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 116203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 116303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 116403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (scalar_is_load_address) 116503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 116603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 116703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 116803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 116903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 117003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 117103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 117203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 117303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeHostAddress: 117403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 117503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton uint32_t data_offset = 0; 117603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 117703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = m_value.GetValueAddressType(); 117803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (address_type == eAddressTypeInvalid) 117903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address_type = eAddressTypeLoad; 118003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 118103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 118203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 1183427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1184427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_pointers_point_to_load_addrs) 1185427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton address_type = eAddressTypeLoad; 1186427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 118703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 118803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 118903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str) 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 1195afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 1199462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *end = NULL; 1202bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingInvalid: 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingUint: 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(unsigned long long)) 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned long long ull_val = strtoull(value_str, &end, 0); 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1218801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value.GetScalar() = ull_val; 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingSint: 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > sizeof(long long)) 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long long sll_val = strtoll(value_str, &end, 0); 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end && *end != '\0') 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1234801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value.GetScalar() = sll_val; 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Limit the bytes in our m_data appropriately. 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetScalar().GetData (m_data, byte_size); 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingIEEE754: 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const off_t byte_offset = GetByteOffset(); 124354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size)); 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst != NULL) 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We are decoding a float into host byte order below, so make 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sure m_data knows what it contains. 1248cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton m_data.SetByteOrder(lldb::endian::InlHostByteOrder()); 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetClangAST(), 1251462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value_str, 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst, 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size); 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (converted_byte_size == byte_size) 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingVector: 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we have made it here the value is in m_data and we should write it 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // out to the target 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (); 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write () 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the update ID so the next time we try and read the value 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we try and read it again. 1280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetNeedsUpdate(); 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: when Value has a method to write a value back, call it from here. 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1287b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType 1288b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 1289b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 1290afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return ClangASTType::GetMinimumLanguage (GetClangAST(), 1291afb7c85df796f74262917e44dd68f668dade3911Enrico Granata GetClangType()); 1292b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 1293b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 129547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj) 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 129747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_synthetic_children[key] = valobj; 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 130447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key); 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 130647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = pos->second->GetSP(); 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1313462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131670c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool 131724b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType () 131824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 131924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return ClangASTContext::IsArrayType (GetClangType()); 132024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 132124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 132224b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool 13239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType () 13249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 13259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return ClangASTContext::IsScalarType (GetClangType()); 13269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 13279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 13289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 132970c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed) 133070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{ 133170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham return ClangASTContext::IsIntegerType (GetClangType(), is_signed); 133270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham} 1333f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 133782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPointerOrReferenceType (GetClangType()); 133882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 133982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 134082f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 134182f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType () 134282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{ 134382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType()); 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1346917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool 1347917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType () 1348917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 1349917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType()); 1350917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 1351917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create) 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(index_str, sizeof(index_str), "[%i]", index); 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *synthetic_child; 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 136947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child = CreateChildAtIndex(0, true, index); 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 137247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (synthetic_child) 137347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham { 137447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham AddSyntheticChild(index_const_str, synthetic_child); 137547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = synthetic_child->GetSP(); 1376979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 1377886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->m_is_array_item_for_pointer = true; 137847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham } 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1383642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 138424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index 138524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array. 138624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as: 138724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection 138824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// { 138924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// uint32_t item_count; 139024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Item item_array[0]; 139124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// }; 139224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice 139324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array". 139424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 139524b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP 139624b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create) 139724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 139824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP synthetic_child_sp; 139924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (IsArrayType ()) 140024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 140124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton char index_str[64]; 140224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton snprintf(index_str, sizeof(index_str), "[%i]", index); 140324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ConstString index_const_str(index_str); 140424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Check if we have already created a synthetic array member in this 140524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // valid object. If we have we will re-use it. 140624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = GetSyntheticChild (index_const_str); 140724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!synthetic_child_sp) 140824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 140924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObject *synthetic_child; 141024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // We haven't made a synthetic array member for INDEX yet, so 141124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // lets make one and cache it for any future reference. 141224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child = CreateChildAtIndex(0, true, index); 141324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 141424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Cache the value if we got one back... 141524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (synthetic_child) 141624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 141724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton AddSyntheticChild(index_const_str, synthetic_child); 141824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = synthetic_child->GetSP(); 1419979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 142024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp->m_is_array_item_for_pointer = true; 142124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 142224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 142324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 142424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return synthetic_child_sp; 142524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 142624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 14279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP 14289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create) 14299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 14309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP synthetic_child_sp; 14319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (IsScalarType ()) 14329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char index_str[64]; 14349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to); 14359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ConstString index_const_str(index_str); 14369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Check if we have already created a synthetic array member in this 14379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // valid object. If we have we will re-use it. 14389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = GetSyntheticChild (index_const_str); 14399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!synthetic_child_sp) 14409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectChild *synthetic_child; 14429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // We haven't made a synthetic array member for INDEX yet, so 14439762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // lets make one and cache it for any future reference. 14449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child = new ValueObjectChild(*this, 14459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangAST(), 14469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangType(), 14479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata index_const_str, 14489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetByteSize(), 14499762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 0, 14509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata to-from+1, 14519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata from, 14529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false, 14539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false); 14549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 14559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Cache the value if we got one back... 14569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (synthetic_child) 14579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 14589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata AddSyntheticChild(index_const_str, synthetic_child); 14599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = synthetic_child->GetSP(); 1460979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 14619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->m_is_bitfield_for_scalar = true; 14629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return synthetic_child_sp; 14669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 14679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1468979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatalldb::ValueObjectSP 1469979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create) 1470979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 1471979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1472979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectSP synthetic_child_sp; 1473979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1474979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata char name_str[64]; 1475979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata snprintf(name_str, sizeof(name_str), "@%i", offset); 1476979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ConstString name_const_str(name_str); 1477979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1478979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // Check if we have already created a synthetic array member in this 1479979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // valid object. If we have we will re-use it. 1480979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = GetSyntheticChild (name_const_str); 1481979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1482979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child_sp.get()) 1483979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 1484979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1485979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (!can_create) 1486979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return lldb::ValueObjectSP(); 1487979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1488979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectChild *synthetic_child = new ValueObjectChild(*this, 1489979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetASTContext(), 1490979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetOpaqueQualType(), 1491979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_const_str, 1492979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetTypeByteSize(), 1493979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata offset, 1494979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 1495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 1496979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata false, 1497979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata false); 1498979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child) 1499979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1500979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata AddSyntheticChild(name_const_str, synthetic_child); 1501979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = synthetic_child->GetSP(); 1502979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(name_const_str); 1503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->m_is_child_at_offset = true; 1504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 1506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 1507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1508e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or -> 1509e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has 1510e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown 1511e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means 1512e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off 1513e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char* 1514e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression) 1515e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1516e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!expression || !expression[0]) 1517e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 1518e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '.') 1519e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+1; 1520e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '-' && expression[1] == '>') 1521e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+2; 1522e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 1523e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1524e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1525e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatalldb::ValueObjectSP 1526e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create) 1527e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1528e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synthetic_child_sp; 1529e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ConstString name_const_string(expression); 1530e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Check if we have already created a synthetic array member in this 1531e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // valid object. If we have we will re-use it. 1532e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetSyntheticChild (name_const_string); 1533e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!synthetic_child_sp) 1534e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 1535e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // We haven't made a synthetic array member for expression yet, so 1536e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // lets make one and cache it for any future reference. 1537e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetValueForExpressionPath(expression); 1538e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1539e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Cache the value if we got one back... 1540e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (synthetic_child_sp.get()) 1541e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 1542e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata AddSyntheticChild(name_const_string, synthetic_child_sp.get()); 1543979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression))); 1544e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp->m_is_expression_path_child = true; 1545e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 1546e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 1547e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return synthetic_child_sp; 1548e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1549e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1550e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid 1551e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::CalculateSyntheticValue (lldb::SyntheticValueType use_synthetic) 1552e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1553e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (use_synthetic == lldb::eNoSyntheticFilter) 1554e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 1555e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1556afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateFormatsIfNeeded(m_last_format_mgr_dynamic); 1557e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1558e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get() == NULL) 1559e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 1560e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 15619ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata if (m_synthetic_value == NULL) 15629ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata m_synthetic_value = new ValueObjectSynthetic(*this, m_last_synthetic_filter); 1563e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1565e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1566e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid 156710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic) 1568642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 156910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 157010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return; 157110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 157247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (!m_dynamic_value && !IsDynamic()) 1573e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1574979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata Process *process = m_update_point.GetProcessSP().get(); 1575e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool worth_having_dynamic_value = false; 1576642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1577e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1578e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // FIXME: Process should have some kind of "map over Runtimes" so we don't have to 1579e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // hard code this everywhere. 1580e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham lldb::LanguageType known_type = GetObjectRuntimeLanguage(); 1581e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC) 1582e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1583e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime (known_type); 1584e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (runtime) 1585e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this); 1586e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1587e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham else 1588e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1589e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus); 1590e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (cpp_runtime) 1591e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this); 1592e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1593e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (!worth_having_dynamic_value) 1594e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 1595e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC); 1596e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (objc_runtime) 159710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this); 1598e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1599e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1600e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1601e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (worth_having_dynamic_value) 160210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 160347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 160447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// if (worth_having_dynamic_value) 160547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham// printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager); 1606e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1607e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 1608e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham} 1609e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 161047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 161110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic) 1612e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{ 161310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (use_dynamic == lldb::eNoDynamicValues) 161410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return ValueObjectSP(); 161510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 161610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (!IsDynamic() && m_dynamic_value == NULL) 1617e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 161810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham CalculateDynamicValue(use_dynamic); 1619e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 162047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_dynamic_value) 162147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_dynamic_value->GetSP(); 162247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 162347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 1624642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 162566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 1626e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// GetDynamicValue() returns a NULL SharedPointer if the object is not dynamic 1627e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// or we do not really want a dynamic VO. this method instead returns this object 1628e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// itself when making it synthetic has no meaning. this makes it much simpler 1629e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to replace the SyntheticValue for the ValueObject 1630e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP 1631e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticValue (SyntheticValueType use_synthetic) 1632e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 1633e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (use_synthetic == lldb::eNoSyntheticFilter) 1634e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1635e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1636afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateFormatsIfNeeded(m_last_format_mgr_dynamic); 1637e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1638e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_last_synthetic_filter.get() == NULL) 1639e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1640e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1641e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata CalculateSyntheticValue(use_synthetic); 1642e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 1643e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_synthetic_value) 1644e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return m_synthetic_value->GetSP(); 1645e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata else 1646e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return GetSP(); 1647e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 1648e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 164900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 165000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 165100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 165200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 165300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1654e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s); 165500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t clang_type = GetClangType(); 165600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 165700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name); 165800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 165900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 166000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 166100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 166200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 166300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 166400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 166500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 166600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 166700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 166800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 166900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 167000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 167100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 167200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 1673e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()) 167400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 1675e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()->IsBaseClass()) 1676e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent()->GetNonBaseClassParent(); 167700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 1678e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent(); 167900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 168000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 168100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 168266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 168366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 16841391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 1685bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 168600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 168700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 168890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (is_deref_of_parent && epformat == eDereferencePointers) { 16891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely 16901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName. 16911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // the eHonorPointers mode is meant to produce strings in this latter format 16921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("*("); 16931391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 169400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 16951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ValueObject* parent = GetParent(); 16961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 16971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (parent) 16981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat); 1699886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1700886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // if we are a deref_of_parent just because we are synthetic array 1701886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // members made up to allow ptr[%d] syntax to work in variable 1702886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // printing, then add our name ([%d]) to the expression path 170390d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (m_is_array_item_for_pointer && epformat == eHonorPointers) 1704886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(m_name.AsCString()); 17051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 170600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 170700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 170800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 1709bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 171000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 171100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 1712bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 171300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 171400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 171500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 171600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL); 171700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 171890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers) 171900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 172000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 172100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 17221391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 17231391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 17241391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer) 17251391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 17261391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("->"); 17271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 17281391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) && 17291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray)) 17301391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 17311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutChar('.'); 17321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 173300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 173400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 1735bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 173600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 173700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 173800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 1739bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 174000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 174100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 174200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 174300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 174400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 174500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 1746bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1747bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1748bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1749bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 17501391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (is_deref_of_parent && epformat == eDereferencePointers) { 175100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 17521391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1753bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1754bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1755ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP 1756ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression, 1757ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 1758ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 1759ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_value_type, 1760ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 1761ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* final_task_on_target) 1762ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 1763ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1764ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* dummy_first_unparsed; 1765ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 1766ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType dummy_final_value_type; 1767ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing; 1768ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1769ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 1770ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 1771ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 1772ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 1773ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1774ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 1775ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1776ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing) 1777ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1778ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; 1779ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1780ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects 1781ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1782ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*final_task_on_target == ValueObject::eDereference) 1783ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1784ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 1785ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 1786ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 1787ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1788ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 1789ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_value_type = ValueObject::eInvalid; 1790ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1791ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1792ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1793ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1794ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_task_on_target = ValueObject::eNothing; 1795ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 1796ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1797ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1798ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*final_task_on_target == ValueObject::eTakeAddress) 1799ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1800ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 1801ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 1802ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 1803ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1804ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eTakingAddressFailed; 1805ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_value_type = ValueObject::eInvalid; 1806ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1807ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1808ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1809ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1810ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_task_on_target = ValueObject::eNothing; 1811ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 1812ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1813ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1814ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1815ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; // final_task_on_target will still have its original value, so you know I did not do it 1816ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 1817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 18181a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 18191a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression, 18201a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectListSP& list, 18211a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 18221a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 18231a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_value_type, 18241a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 18251a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* final_task_on_target) 18261a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 18271a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* dummy_first_unparsed; 18281a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 18291a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType dummy_final_value_type; 18301a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing; 18311a102087f54079c25c8827afac6153a44ca535daEnrico Granata 18321a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 18331a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 18341a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 18351a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 18361a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 18371a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 18381a102087f54079c25c8827afac6153a44ca535daEnrico Granata 18391a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!ret_val.get()) // if there are errors, I add nothing to the list 18401a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 18411a102087f54079c25c8827afac6153a44ca535daEnrico Granata 18421a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*reason_to_stop != eArrayRangeOperatorMet) 18431a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18441a102087f54079c25c8827afac6153a44ca535daEnrico Granata // I need not expand a range, just post-process the final value and return 18451a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing) 18461a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18471a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 18481a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 18491a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects 18511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18521a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*final_task_on_target == ValueObject::eDereference) 18531a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18541a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 18551a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 18561a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 18571a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18581a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 18591a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_value_type = ValueObject::eInvalid; 18601a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 18611a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18621a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 18631a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18641a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_task_on_target = ValueObject::eNothing; 18651a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 18661a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 18671a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18681a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18691a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*final_task_on_target == ValueObject::eTakeAddress) 18701a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18711a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 18721a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 18731a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 18741a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18751a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eTakingAddressFailed; 18761a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_value_type = ValueObject::eInvalid; 18771a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 18781a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18791a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 18801a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18811a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_task_on_target = ValueObject::eNothing; 18821a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 18831a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 18841a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18851a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18861a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18871a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18881a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 18891a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 18901a102087f54079c25c8827afac6153a44ca535daEnrico Granata return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed, 18911a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 18921a102087f54079c25c8827afac6153a44ca535daEnrico Granata ret_val, 18931a102087f54079c25c8827afac6153a44ca535daEnrico Granata list, 18941a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 18951a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 18961a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 18971a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 18981a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 18991a102087f54079c25c8827afac6153a44ca535daEnrico Granata // in any non-covered case, just do the obviously right thing 19001a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 19011a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 19021a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 19031a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1904ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP 1905ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr, 1906ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 1907ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 1908ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_result, 1909ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 1910ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* what_next) 1911ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 1912ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP root = GetSP(); 1913ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1914ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 1915ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1916ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1917ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1918ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1919ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata while (true) 1920ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1921ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1922ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 1923ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1924ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata lldb::clang_type_t root_clang_type = root->GetClangType(); 19251a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t pointee_clang_type; 19261a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 19271a102087f54079c25c8827afac6153a44ca535daEnrico Granata 19281a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 19291a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 19301a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 1931ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1932ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!expression_cstr || *expression_cstr == '\0') 1933ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1934ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEndOfString; 1935ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 1936ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1937ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1938ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata switch (*expression_cstr) 1939ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1940ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '-': 1941ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1942ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && 19431a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error 1944ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1945ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1946ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrowInsteadOfDot; 1947ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1948ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1949ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 19501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) && // if yo are trying to extract an ObjC IVar when this is forbidden 19511a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && 1952ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options.m_no_fragile_ivar) 1953ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1954ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eFragileIVarNotAllowed; 1956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1958ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1959ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (expression_cstr[1] != '>') 1960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1961ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 1963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1964ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip the - 1967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '.': // or fallthrough from -> 1969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' && 19711a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error 1972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDotInsteadOfArrow; 1975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1978ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip . 1979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *next_separator = strpbrk(expression_cstr+1,"-.["); 1980ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString child_name; 1981ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!next_separator) // if no other separator just expand this last layer 1982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCString (expression_cstr); 1984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetChildMemberWithName(child_name, true); 1985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (root.get()) // we know we are done, so just return 1986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = '\0'; 1988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEndOfString; 1989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 1990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 1991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 1995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 1996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 1997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 1998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // other layers do expand 2001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2002ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr); 2003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetChildMemberWithName(child_name, true); 2004ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (root.get()) // store the new root and move on 2005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = next_separator; 2007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 2008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2011ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2018ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '[': 2021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 20221a102087f54079c25c8827afac6153a44ca535daEnrico 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* 2023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 20241a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 2025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eRangeOperatorInvalid; 2028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2031ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 2032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2033ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2034ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eRangeOperatorNotAllowed; 2035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2036ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2038ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2039ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 2040ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 20411a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2042ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2043ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2044ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 2045ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2046ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2047ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2048ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // even if something follows, we cannot expand unbounded ranges, just let the caller do it 2049ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2050ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2051ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eUnboundedRange; 2053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2054ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 2057ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 2058ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 2059ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2060ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2061ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2062ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2063ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2064ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2065ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 2066ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2067ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2068ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 2069ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2070ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2071ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2072ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2073ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2074ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2075ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2076ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 2077ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 20781a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2079ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2080ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2081ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2082ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eUnboundedRange; 2083ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2084ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2085ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2086ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2087ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2088ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 2089ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2090ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2091ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2092ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2093ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata // from here on we do have a valid index 20941a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2095ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 209624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true); 209724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!child_valobj_sp) 209824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true); 209924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (child_valobj_sp) 210024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 210124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton root = child_valobj_sp; 210224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *first_unparsed = end+1; // skip ] 210324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *final_result = ValueObject::ePlain; 210424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton continue; 210524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 210624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton else 2107ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2108ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2109ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2110ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2111ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2112ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2113ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 21141a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 2115ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2116ff78238a2ebc66a683dded02c2f99fba85077d05Enrico 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 21171a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2118ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2119ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2120ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2121ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2122ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2123ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2124ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 2125ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2126ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2127ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2128ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2129ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2130ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next = eNothing; 2131ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2132ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2133ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2134ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2135ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2136ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 2137ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2138ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2139ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2142ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2147ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::ePlain; 2148ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2149ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2150ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2151ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2152ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 2153ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2154ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 2155ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2156ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2157ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2158ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2159ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2160ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2161ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2162ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 2163ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2164ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2165ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet; 2166ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBitfield; 2167ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2168ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2169ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2170ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2171ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we have a low and a high index 2172ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2173ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2174ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 2175ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 2176ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2177ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2178ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2179ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2180ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2181ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2182ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 2183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2184ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2186ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2187ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2188ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2189ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2190ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (index_lower > index_higher) // swap indices if required 2191ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2192ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long temp = index_lower; 2193ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_lower = index_higher; 2194ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_higher = temp; 2195ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 21961a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 2197ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2198ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 2199ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2200ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2201ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2202ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 2203ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2204ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2205ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2206ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2207ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2208ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2209ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet; 2210ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBitfield; 2211ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2212ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2213ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 22141a102087f54079c25c8827afac6153a44ca535daEnrico 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 2215ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next == ValueObject::eDereference && 22161a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2217ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2218ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2219ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2220ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2221ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2222ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2223ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 2224ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2225ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2226ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2227ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2228ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2229ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *what_next = ValueObject::eNothing; 2230ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2231ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2232ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2233ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2234ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2235ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2236ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eArrayRangeOperatorMet; 2237ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eBoundedRange; 2238ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2239ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2240ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2241ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2242ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2243ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata default: // some non-separator is in the way 2244ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2245ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2246ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 2247ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *final_result = ValueObject::eInvalid; 2248ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2249ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2250ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2251ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2252ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2253ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 2254ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 22551a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 22561a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr, 22571a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 22581a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectSP root, 22591a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::ValueObjectListSP& list, 22601a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 22611a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_result, 22621a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 22631a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* what_next) 22641a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 22651a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 22661a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 22671a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22681a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22691a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22701a102087f54079c25c8827afac6153a44ca535daEnrico Granata while (true) 22711a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22721a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22731a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 22741a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22751a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t root_clang_type = root->GetClangType(); 22761a102087f54079c25c8827afac6153a44ca535daEnrico Granata lldb::clang_type_t pointee_clang_type; 22771a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 22781a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22791a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 22801a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 22811a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 22821a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22831a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!expression_cstr || *expression_cstr == '\0') 22841a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22851a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEndOfString; 22861a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 22871a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 22881a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 22891a102087f54079c25c8827afac6153a44ca535daEnrico Granata 22901a102087f54079c25c8827afac6153a44ca535daEnrico Granata switch (*expression_cstr) 22911a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22921a102087f54079c25c8827afac6153a44ca535daEnrico Granata case '[': 22931a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22941a102087f54079c25c8827afac6153a44ca535daEnrico 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* 22951a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22961a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 22971a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 22981a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 22991a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorInvalid; 23001a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23011a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23021a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23031a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 23041a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23051a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23061a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorNotAllowed; 23071a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23081a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23091a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23101a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23111a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 23121a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23131a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 23141a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23151a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23161a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 23171a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23181a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23191a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23201a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // expand this into list 23211a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23221a102087f54079c25c8827afac6153a44ca535daEnrico Granata int max_index = root->GetNumChildren() - 1; 23231a102087f54079c25c8827afac6153a44ca535daEnrico Granata for (int index = 0; index < max_index; index++) 23241a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23251a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 23261a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 23271a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 23281a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23291a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 23301a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 23311a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 23321a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 23331a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23341a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23351a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 23361a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 23371a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 23381a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23391a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23401a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 23411a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23421a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23431a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23441a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 23451a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23461a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 23471a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 23481a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 23491a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23501a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23511a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 23521a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23531a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23541a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23551a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 23561a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23571a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 23581a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23591a102087f54079c25c8827afac6153a44ca535daEnrico Granata int max_index = root->GetNumChildren() - 1; 23601a102087f54079c25c8827afac6153a44ca535daEnrico Granata for (int index = 0; index < max_index; index++) 23611a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23621a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 23631a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 23641a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 23651a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23661a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 23671a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 23681a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 23691a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 23701a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23711a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 23721a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23731a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23741a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eEmptyRangeNotAllowed; 23751a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23761a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23771a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23781a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23791a102087f54079c25c8827afac6153a44ca535daEnrico Granata // from here on we do have a valid index 23801a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 23811a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23821a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetChildAtIndex(index, true); 23831a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 23841a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23851a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 23861a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 23871a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 23881a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 23891a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23901a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 23911a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 23921a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 23931a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 23941a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 23951a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 23961a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 23971a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23981a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 23991a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 24001a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24011a102087f54079c25c8827afac6153a44ca535daEnrico 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 24021a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 24031a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24041a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 24051a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 24061a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 24071a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24081a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24091a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 24101a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24111a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24121a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24131a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24141a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24151a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next = eNothing; 24161a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 24171a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24181a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24191a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24201a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24211a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 24221a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 24231a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24241a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24251a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 24261a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24271a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24281a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24291a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24301a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24311a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 24401a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24411a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 24531a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 24561a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we have a low and a high index 24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24611a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 24631a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24691a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24701a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 24711a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 24721a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24771a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (index_lower > index_higher) // swap indices if required 24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long temp = index_lower; 24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_lower = index_higher; 24821a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_higher = temp; 24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 24881a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24891a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 24901a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eNoSuchChild; 24911a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 24921a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24931a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24941a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24951a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24961a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 24971a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 24981a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 24991a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 25001a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25011a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25021a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25031a102087f54079c25c8827afac6153a44ca535daEnrico 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 25041a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next == ValueObject::eDereference && 25051a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 25061a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25071a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 25081a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 25091a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 25101a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25111a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eDereferencingFailed; 25131a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25181a102087f54079c25c8827afac6153a44ca535daEnrico Granata *what_next = ValueObject::eNothing; 25191a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 25201a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25211a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25221a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25231a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25242bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (unsigned long index = index_lower; 25251a102087f54079c25c8827afac6153a44ca535daEnrico Granata index <= index_higher; index++) 25261a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25271a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 25281a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 25291a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 25301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25311a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; 25321a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eRangeOperatorExpanded; 25331a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eValueObjectList; 25341a102087f54079c25c8827afac6153a44ca535daEnrico Granata return index_higher-index_lower+1; // tell me number of items I added to the VOList 25351a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25361a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25371a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 25381a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25391a102087f54079c25c8827afac6153a44ca535daEnrico Granata default: // some non-[ separator, or something entirely wrong, is in the way 25401a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25411a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata *reason_to_stop = ValueObject::eUnexpectedSymbol; 25431a102087f54079c25c8827afac6153a44ca535daEnrico Granata *final_result = ValueObject::eInvalid; 25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25451a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 25461a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25471a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25481a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25491a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 25501a102087f54079c25c8827afac6153a44ca535daEnrico Granata 2551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid 255266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject 255366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton( 255466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton Stream &s, 255566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton ValueObject *valobj, 255666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton const char *root_valobj_name, 255766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t ptr_depth, 255866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t curr_depth, 255966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint32_t max_depth, 256066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_types, 256166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool show_location, 256266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton bool use_objc, 256310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham lldb::DynamicValueType use_dynamic, 2564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata bool use_synth, 2565bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool scope_already_checked, 25667f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata bool flat_output, 25677f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata uint32_t omit_summary_depth 256866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton) 256966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 257082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (valobj) 257166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2572afb7c85df796f74262917e44dd68f668dade3911Enrico Granata bool update_success = valobj->UpdateValueIfNeeded (use_dynamic, true); 257382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 257482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (update_success && use_dynamic != lldb::eNoDynamicValues) 2575e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 257610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get(); 2577e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (dynamic_value) 2578e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham valobj = dynamic_value; 2579e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 2580e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2581bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 2582bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2583f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 2584bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 2585f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 2586f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 2587bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2588bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const bool print_valobj = flat_output == false || has_value; 2589bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2590bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 259166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2592bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (show_location) 2593bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2594fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham s.Printf("%s: ", valobj->GetLocationAsCString()); 2595bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 259666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2597bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 259866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2599a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton // Always show the type for the top level items. 260000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (show_types || (curr_depth == 0 && !flat_output)) 2601afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2602441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata const char* typeName = valobj->GetTypeName().AsCString("<invalid type>"); 2603441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf("(%s", typeName); 2604441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata // only show dynamic types if the user really wants to see types 2605441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata if (show_types && use_dynamic != lldb::eNoDynamicValues && 2606441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata (/*strstr(typeName, "id") == typeName ||*/ 2607441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata ClangASTType::GetMinimumLanguage(valobj->GetClangAST(), valobj->GetClangType()) == lldb::eLanguageTypeObjC)) 2608afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2609afb7c85df796f74262917e44dd68f668dade3911Enrico Granata Process* process = valobj->GetUpdatePoint().GetProcessSP().get(); 2610afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (process == NULL) 2611441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf(", dynamic type: unknown) "); 2612afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2613afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2614afb7c85df796f74262917e44dd68f668dade3911Enrico Granata ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime(); 2615afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (runtime == NULL) 2616441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf(", dynamic type: unknown) "); 2617afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2618afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 2619afb7c85df796f74262917e44dd68f668dade3911Enrico Granata ObjCLanguageRuntime::ObjCISA isa = runtime->GetISA(*valobj); 2620afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!runtime->IsValidISA(isa)) 2621441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata s.Printf(", dynamic type: unknown) "); 2622afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2623afb7c85df796f74262917e44dd68f668dade3911Enrico Granata s.Printf(", dynamic type: %s) ", 2624afb7c85df796f74262917e44dd68f668dade3911Enrico Granata runtime->GetActualTypeName(isa).GetCString()); 2625afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 2626afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 2627afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 2628afb7c85df796f74262917e44dd68f668dade3911Enrico Granata else 2629afb7c85df796f74262917e44dd68f668dade3911Enrico Granata s.Printf(") "); 2630afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 263166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 263266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2633bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 2634bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2635b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 2636b01000fd063629facd45044f137446fb748ee179Greg Clayton const bool qualify_cxx_base_classes = show_types; 2637b01000fd063629facd45044f137446fb748ee179Greg Clayton valobj->GetExpressionPath(s, qualify_cxx_base_classes); 2638bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString(" ="); 2639bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2640bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2641bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2642bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 2643bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 2644bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2645bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2646fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!scope_already_checked && !valobj->IsInScope()) 2647bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 264882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton err_cstr = "out of scope"; 2649bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 265066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 265166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2652bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 26531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char *sum_cstr = NULL; 26541a102087f54079c25c8827afac6153a44ca535daEnrico Granata SummaryFormat* entry = valobj->GetSummaryFormat().get(); 2655bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 26567f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata if (omit_summary_depth > 0) 26577f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata entry = NULL; 26587f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata 2659bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 2660bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2661fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham val_cstr = valobj->GetValueAsCString(); 2662bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 2663bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 266466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 266566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 266666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 266782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton s.Printf (" <%s>\n", err_cstr); 266866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 266966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 267066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2671f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 2672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2673bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 26741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 26757f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL; 267666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 26771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // We must calculate this value in realtime because entry might alter this variable's value 26781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // (e.g. by saying ${var%fmt}) and render precached values useless 26791391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr)) 26801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.Printf(" %s", valobj->GetValueAsCString()); 268166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 268290d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (sum_cstr) 2683886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 2684886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // for some reason, using %@ (ObjC description) in a summary string, makes 2685886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // us believe we need to reset ourselves, thus invalidating the content of 2686886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty 2687886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // let us recalculate it! 2688886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (sum_cstr[0] == '\0') 2689886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", valobj->GetSummaryAsCString()); 2690886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata else 2691886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.Printf(" %s", sum_cstr); 2692886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 2693bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2694bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (use_objc) 2695bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2696fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const char *object_desc = valobj->GetObjectDescription(); 2697bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 2698bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf(" %s\n", object_desc); 2699bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2700e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan s.Printf (" [no Objective-C description available]\n"); 2701bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 2702886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 270366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 270466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 270566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (curr_depth < max_depth) 270666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 2708f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 2709f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 2710f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 2711f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 2712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2713f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 2714f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 2715f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 2716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2717f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 2718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 2719f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2720f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 2721f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 2722b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType ptr_address_type; 2723f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (valobj->GetPointerValue (ptr_address_type, true) == 0) 2724f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 2725f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2726f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 2727f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 2729f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 2730f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 2731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 2732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 2733f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 2736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 2737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 273866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2739886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr)) 274066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2741e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synth_vobj = valobj->GetSyntheticValue(use_synth ? 2742e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata lldb::eUseSyntheticFilter : 2743e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata lldb::eNoSyntheticFilter); 2744e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata const uint32_t num_children = synth_vobj->GetNumChildren(); 2745bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 274666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2747bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (flat_output) 274866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2749bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2750bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 2751bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2752bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2753bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2754bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 27553f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 2756bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 2757bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2758bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2759bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton for (uint32_t idx=0; idx<num_children; ++idx) 2760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2761e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP child_sp(synth_vobj->GetChildAtIndex(idx, true)); 2762bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 2763bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2764bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton DumpValueObject (s, 2765bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_sp.get(), 2766bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton NULL, 2767f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 2768bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton curr_depth + 1, 2769bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton max_depth, 2770bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_types, 2771bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton show_location, 2772bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton false, 2773e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham use_dynamic, 2774e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata use_synth, 2775bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton true, 27767f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata flat_output, 27777f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata omit_summary_depth > 1 ? omit_summary_depth - 1 : 0); 2778bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2779bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2780bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2781bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!flat_output) 2782bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2783bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 2784bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 278566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 278666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 2787bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 2788bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2789bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 2790bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2791f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 2792bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2793bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2794bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 2795bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 2796bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 2797bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2798bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 279966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 2800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2801bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 280266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 280366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 280466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 280566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 280666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2807bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 280866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 2809bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 281066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 281166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 281266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 281366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 281466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 281566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 2816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 2818fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name) 2819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 2820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 2821427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2822afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false) && m_error.Success()) 2823427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2824fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *exe_scope = GetExecutionContextScope(); 2825fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 2826fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 2827fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 2828fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 2829427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2830fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham clang::ASTContext *ast = GetClangAST (); 2831427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2832fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham DataExtractor data; 2833fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetByteOrder (m_data.GetByteOrder()); 2834fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham data.SetAddressByteSize(m_data.GetAddressByteSize()); 2835427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2836801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule()); 2837427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 283847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (exe_scope, 283947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 284047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham GetClangType(), 284147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 284247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham data); 2843fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 2844427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2845fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 2846fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!valobj_sp) 2847427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 284847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (NULL, m_error); 2849427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2850427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 2851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 2852427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2853427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP 2854bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 2855427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 285647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 285747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 2858e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2859c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 2860c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 2861427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2862427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 286324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = false; 2864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 2866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 2867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 2868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 2869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 2870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 287100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 2872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 2873427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 2874427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 2875427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 287658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 287758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext exe_ctx; 287858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham GetExecutionContextScope()->CalculateExecutionContext (exe_ctx); 287958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 288058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 288158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham clang_ast, 2882427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 2883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 2884427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 2885427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 2886427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 288724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 2888427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 2889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 2890427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 2891427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 2892427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 289300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 289400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 2895a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 2896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 2898427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 2899427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 2900427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 290147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj = new ValueObjectChild (*this, 290247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham clang_ast, 290347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_clang_type, 290447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_name, 290547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_size, 290647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_offset, 290747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_size, 290847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_offset, 290947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_base_class, 291047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_deref_of_parent); 2911427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2912427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2913c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 291447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 2915c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2916c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 291747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 2918c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2919427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 2920427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2921c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 2922b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 2923c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2924c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 2925c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 2926c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 2927c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 292847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 2929427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2930427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 2931427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2932e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP 2933c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 2934427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 2935e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_addr_of_valobj_sp) 2936e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 2937e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 2938b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeInvalid; 2939427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 2940427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address); 2941c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 2942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 2943427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2944427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 2945427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2946c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 2947427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 2948c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2949c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 2950b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 2951c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 2952c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2953427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 2954c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 2956427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 2957427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 2958427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2959427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 2960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 2961427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 2962427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 2963427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 2964427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 296547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(), 296647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 296747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ClangASTContext::CreatePointerType (ast, clang_type), 296847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ConstString (name.c_str()), 296947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham addr, 297047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeInvalid, 297147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_data.GetAddressByteSize()); 2972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2973427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2974427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 2975427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2976427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 2977e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 2978427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 2979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 29800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29810039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 29820039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type) 29830039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 29840039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 29850039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 29860039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 29870039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 29880039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29890039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 29900039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 29910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 29920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 29930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 29940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 29950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 29960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton clang_ast_type); 29970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 29980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 29990039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 30000039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30010039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP 30020039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp) 30030039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 30040039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::ValueObjectSP valobj_sp; 30050039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 30060039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton const bool scalar_is_load_address = true; 30070039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address); 30080039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30090039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 30100039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 30110039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton Address ptr_addr (NULL, ptr_value); 30120039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 30130039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(), 30140039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 30150039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 30160039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton type_sp); 30170039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 30180039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 30190039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 30200039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 3021fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () : 3022dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_thread_id (LLDB_INVALID_UID), 3023dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_stop_id (0) 3024fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3025fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3026fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3027fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected): 3028fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update (true), 3029dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update (true), 303091635093b0282d888fcde84a276ae518643c7fcaJim Ingham m_thread_id (LLDB_INVALID_THREAD_ID), 3031dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_stop_id (0) 3032dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson 3033fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3034fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext exe_ctx; 3035fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContextScope *computed_exe_scope = exe_scope; // If use_selected is true, we may find a better scope, 3036fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // and if so we want to cache that not the original. 3037fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_scope) 3038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_scope->CalculateExecutionContext(exe_ctx); 3039fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.target != NULL) 3040fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3041fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp = exe_ctx.target->GetSP(); 3042fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3043fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.process == NULL) 3044fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.target->GetProcessSP(); 3045fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3046fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp = exe_ctx.process->GetSP(); 3047fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3048fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp != NULL) 3049fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3050fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id = m_process_sp->GetStopID(); 3051fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = NULL; 3052fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3053fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.thread == NULL) 3054fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3055fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3056fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3057fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = m_process_sp->GetThreadList().GetSelectedThread().get(); 3058fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread) 3059fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = thread; 3060fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3061fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3062fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3063fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham thread = exe_ctx.thread; 3064fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3065fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 3066fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3067fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = thread->GetIndexID(); 3068fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (exe_ctx.frame == NULL) 3069fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3070fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3071fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3072fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get(); 3073fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (frame) 3074fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3075fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = frame->GetStackID(); 3076fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham computed_exe_scope = frame; 3077fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3078fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3079fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3080fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3081fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = exe_ctx.frame->GetStackID(); 3082fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3083fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3084fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3085fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = computed_exe_scope; 3086fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3087fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3088fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) : 3089fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope (rhs.m_exe_scope), 3090dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_needs_update(true), 3091dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_first_update(true), 3092fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp (rhs.m_target_sp), 3093fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp (rhs.m_process_sp), 3094fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id (rhs.m_thread_id), 3095fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id (rhs.m_stack_id), 3096fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id (0) 3097fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3098fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3099fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint () 3101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope * 3105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope () 3106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // We have to update before giving out the scope, or we could be handing out stale pointers. 3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SyncWithProcessState(); 3109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return m_exe_scope; 3111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state. If the current 3114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return 3115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change". If the current state is different, we update our state, and return 3116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change". If we did see a change, we also set m_needs_update to true, so 3117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true. 3118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState() 3121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we're already invalid, we don't need to do anything, and nothing has changed: 3123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_stop_id == LLDB_INVALID_UID) 3124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Can't update with an invalid state. 3126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = false; 3127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we don't have a process nothing can change. 3131fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_process_sp) 3132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If our stop id is the current stop ID, nothing has changed: 3135e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham uint32_t cur_stop_id = m_process_sp->GetStopID(); 3136e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_stop_id == cur_stop_id) 3137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3139e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // If the current stop id is 0, either we haven't run yet, or the process state has been cleared. 3140e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // In either case, we aren't going to be able to sync with the process state. 3141e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (cur_stop_id == 0) 3142e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return false; 3143e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3144e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham m_stop_id = cur_stop_id; 3145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = true; 3146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = m_process_sp.get(); 3147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Something has changed, so we will return true. Now make sure the thread & frame still exist, and if either 3149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // doesn't, mark ourselves as invalid. 3150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_THREAD_ID) 3152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get(); 3154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_thread == NULL) 3155bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton { 315691635093b0282d888fcde84a276ae518643c7fcaJim Ingham SetInvalid(); 3157bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton } 3158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_thread; 3161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_stack_id.IsValid()) 3163fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get(); 3165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (our_frame == NULL) 3166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetInvalid(); 3167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = our_frame; 3169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return true; 3173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3175ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid 3176ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated () 3177ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{ 3178ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_first_update = false; 3179ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_needs_update = false; 3180ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham if (m_process_sp) 3181ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_stop_id = m_process_sp->GetStopID(); 3182ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham} 3183ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3184ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope) 3187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!IsValid()) 3189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 3190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool needs_update = false; 3192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_exe_scope = NULL; 3193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // The target has to be non-null, and the 3195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *target = exe_scope->CalculateTarget(); 3196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (target != NULL) 3197fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Target *old_target = m_target_sp.get(); 3199fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (target == old_target); 3200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *process = exe_scope->CalculateProcess(); 3201fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (process != NULL) 3202fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // FOR NOW - assume you can't update variable objects across process boundaries. 3204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Process *old_process = m_process_sp.get(); 3205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (process == old_process); 3206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::user_id_t stop_id = process->GetStopID(); 3208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (stop_id != m_stop_id) 3209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3211fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stop_id = stop_id; 3212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3213fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // See if we're switching the thread or stack context. If no thread is given, this is 3214fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // being evaluated in a global context. 3215fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham Thread *thread = exe_scope->CalculateThread(); 3216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (thread != NULL) 3217fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3218fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham lldb::user_id_t new_thread_index = thread->GetIndexID(); 3219fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_thread_index != m_thread_id) 3220fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3222fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = new_thread_index; 3223fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3224fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3225fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham StackFrame *new_frame = exe_scope->CalculateStackFrame(); 3227fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame != NULL) 3228fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3229fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (new_frame->GetStackID() != m_stack_id) 3230fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3231fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3232fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id = new_frame->GetStackID(); 3233fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3234fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3235fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3236fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3237fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3238fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3239fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3240fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3241fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3242fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3243fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If this had been given a thread, and now there is none, we should update. 3244fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Otherwise we don't have to do anything. 3245fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_thread_id != LLDB_INVALID_UID) 3246fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3247fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3248fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3249fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3251fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3252fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3253fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3254fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3255fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there is no process, then we don't need to update anything. 3256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a process to not, we should try to update. 3257fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_process_sp.get() != NULL) 3258fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3259fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3260fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 3261fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3262fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3263fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3264fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3265fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3266fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 3267fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3268fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If there's no target, nothing can change so we don't need to update anything. 3269fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // But if we're switching from having a target to not, we should try to update. 3270fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_target_sp.get() != NULL) 3271fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3272fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham needs_update = true; 3273fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_target_sp.reset(); 3274fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_process_sp.reset(); 3275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_thread_id = LLDB_INVALID_UID; 3276fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_stack_id.Clear(); 3277fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3278fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3279fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_needs_update) 3280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update = needs_update; 3281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3282fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return needs_update; 3283fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3284f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 3285f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid 3286f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico GranataValueObject::ClearUserVisibleData() 3287f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{ 3288f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_location_str.clear(); 3289f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_value_str.clear(); 3290f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_summary_str.clear(); 3291f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata m_object_desc_str.clear(); 32922bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen} 3293