ValueObject.cpp revision ab8e00e51475b9148626bfdf99549b7ffc3d046d
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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObject.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 15eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include <stdlib.h> 16eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "llvm/Support/raw_ostream.h" 20b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "clang/AST/Type.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h" 241391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/Debugger.h" 25979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata#include "lldb/Core/Log.h" 2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 2889fda00f52b06b1cfe994c0320a04562b8cc1144Enrico Granata#include "lldb/Core/ValueObjectCast.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h" 30427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h" 31e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectDynamicValue.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h" 330039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/ValueObjectMemory.h" 34e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata#include "lldb/Core/ValueObjectSyntheticFilter.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/DataVisualization.h" 37f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 38cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 39cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton 40db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata#include "lldb/Interpreter/CommandInterpreter.h" 41f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata#include "lldb/Interpreter/ScriptInterpreterPython.h" 42f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 474ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h" 48b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h" 49afb7c85df796f74262917e44dd68f668dade3911Enrico Granata#include "lldb/Target/ObjCLanguageRuntime.h" 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 52eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h" 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granatausing namespace lldb_utility; 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 595c3861df62fde02d610a5ed92927a2d89333358bGreg Claytonstatic user_id_t g_value_obj_uid = 0; 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 64fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) : 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (++g_value_obj_uid), // Unique identifier for every value object 66fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (&parent), 673b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata m_root (NULL), 68dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (parent.GetUpdatePoint ()), 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name (), 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data (), 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value (), 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error (), 7317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str (), 7417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str (), 7517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_location_str (), 7617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_summary_str (), 774ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str (), 7847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(parent.GetManager()), 7917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children (), 8017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_synthetic_children (), 8147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 82e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 8347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 8411730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format (eFormatDefault), 8523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_summary_sp(), 873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_format_sp(), 883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_synthetic_children_sp(), 8921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 9097c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_address_type_of_ptr_or_ref_children(eAddressTypeInvalid), 9117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid (false), 9217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change (false), 9317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid (false), 94427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_old_value_valid (false), 951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 96886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 98979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 99931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_is_getting_summary(false), 100931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type(false) 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject(this); 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 108915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::ValueObject (ExecutionContextScope *exe_scope, 109915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata AddressType child_ptr_or_ref_addr_type) : 110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UserID (++g_value_obj_uid), // Unique identifier for every value object 111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (NULL), 1123b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata m_root (NULL), 113dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (exe_scope), 114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_name (), 115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_data (), 116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value (), 117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error (), 118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str (), 119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str (), 120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_location_str (), 121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str (), 122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_object_desc_str (), 12347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(), 124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children (), 125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_synthetic_children (), 12647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 127e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 12847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_format (eFormatDefault), 13023ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 1313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_summary_sp(), 1323069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_format_sp(), 1333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_synthetic_children_sp(), 13421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 13597c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type), 136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_is_valid (false), 137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_did_change (false), 138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children_count_valid (false), 139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid (false), 1401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 141886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 1429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 143979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 144931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_is_getting_summary(false), 145931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type(false) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager = new ValueObjectManager(); 14847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject (this); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor 153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject () 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 159886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 162915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool did_change_formats = false; 163915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 164886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (update_format) 165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata did_change_formats = UpdateFormatsIfNeeded(); 1661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 167d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 168d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 169d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 170915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 171915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // if you were asked to update your formatters, but did not get a chance to do it 172915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // clear your own values (this serves the purpose of faking a stop-id for frozen 173915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // objects (which are regarded as constant, but could have changes behind their backs 174915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // because of the frozen-pointer depth limit) 175915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // TODO: decouple summary from value and then remove this code and only force-clear the summary 176915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (update_format && !did_change_formats) 177cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsSummary); 178d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 179915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 180d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool first_update = m_update_point.IsFirstEvaluation(); 182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_update_point.NeedsUpdating()) 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetUpdated(); 186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Save the old value using swap to avoid a string copy which 188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // also will clear our m_value_str 189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_value_str.empty()) 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = false; 192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = true; 196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str.swap (m_value_str); 197cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsValue); 198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClearUserVisibleData(); 201f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 20221c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton if (IsInScope()) 20321c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton { 20421c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton const bool value_was_valid = GetValueIsValid(); 205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 20621c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 20721c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton m_error.Clear(); 20821c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 20921c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // Call the pure virtual function to update the value 21021c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton bool success = UpdateValue (); 21121c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 21221c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueIsValid (success); 21321c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 21421c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton if (first_update) 21521c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueDidChange (false); 21621c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton else if (!m_value_did_change && success == false) 21721c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton { 21821c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // The value wasn't gotten successfully, so we mark this 21921c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // as changed if the value used to be valid and now isn't 22021c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueDidChange (value_was_valid); 22121c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton } 22221c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton } 22321c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton else 224fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 22521c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton m_error.SetErrorString("out of scope"); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 231915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatabool 232f509c5ec066599a3399fced39ea36996184939e8Enrico GranataValueObject::UpdateFormatsIfNeeded() 2331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{ 234952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 235979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (log) 2367b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[%s %p] checking for FormatManager revisions. ValueObject rev: %d - Global rev: %d", 237979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata GetName().GetCString(), 2387b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata this, 2391391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision, 2401c61743af946076e988d88baf725382e99d905deEnrico Granata DataVisualization::GetCurrentRevision()); 241915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 242915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool any_change = false; 243915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 244f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if ( (m_last_format_mgr_revision != DataVisualization::GetCurrentRevision())) 2451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 2463b23d2097b526c6326b7b7c56d5fc84884d4e08bEnrico Granata SetValueFormat(DataVisualization::ValueFormats::GetFormat (*this, eNoDynamicValues)); 247f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSummaryFormat(DataVisualization::GetSummaryFormat (*this, GetDynamicValueType())); 24845c47aabcb6b1b3861fd15e8cbe2fc7d7d44a71fJason Molenda#ifndef LLDB_DISABLE_PYTHON 249f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSyntheticChildren(DataVisualization::GetSyntheticChildren (*this, GetDynamicValueType())); 25045c47aabcb6b1b3861fd15e8cbe2fc7d7d44a71fJason Molenda#endif 2518a717e596312951672ecd8c54df2d255e6da20baEnrico Granata 2521c61743af946076e988d88baf725382e99d905deEnrico Granata m_last_format_mgr_revision = DataVisualization::GetCurrentRevision(); 253716a6286f8fd6d5d0e5da218c34317a16f5baa50Enrico Granata 254716a6286f8fd6d5d0e5da218c34317a16f5baa50Enrico Granata any_change = true; 2551391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 256915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 257915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return any_change; 258915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 2591391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata} 2601391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 261574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Inghamvoid 262574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim InghamValueObject::SetNeedsUpdate () 263574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham{ 264574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_update_point.SetNeedsUpdate(); 265574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // We have to clear the value string here so ConstResult children will notice if their values are 266574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // changed by hand (i.e. with SetValueAsCString). 267cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsValue); 268574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham} 269574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 2700b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granatavoid 2713d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico GranataValueObject::ClearDynamicTypeInformation () 2720b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata{ 2730b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata m_did_calculate_complete_objc_class_type = false; 2743d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata m_last_format_mgr_revision = 0; 2750b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata m_override_type = ClangASTType(); 2763d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetValueFormat(lldb::TypeFormatImplSP()); 2773d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetSummaryFormat(lldb::TypeSummaryImplSP()); 2783d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetSyntheticChildren(lldb::SyntheticChildrenSP()); 2790b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata} 2800b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata 281931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananClangASTType 282931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::MaybeCalculateCompleteType () 283931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 284931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType ret(GetClangASTImpl(), GetClangTypeImpl()); 285940dd18789f83f28a618a9b588376c8bae557347Sean Callanan 286931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (m_did_calculate_complete_objc_class_type) 287931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 288931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (m_override_type.IsValid()) 289931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return m_override_type; 290931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 291931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 292931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 293931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 294931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan clang_type_t ast_type(GetClangTypeImpl()); 295931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan clang_type_t class_type; 296931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan bool is_pointer_type; 297931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 298931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (ClangASTContext::IsObjCObjectPointerType(ast_type, &class_type)) 299931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 300931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan is_pointer_type = true; 301931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 302931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else if (ClangASTContext::IsObjCClassType(ast_type)) 303931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 304931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan is_pointer_type = false; 305931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan class_type = ast_type; 306931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 307931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 308931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 309931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 310931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 311931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 312931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type = true; 313931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 314931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!class_type) 315931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 316931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 317931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan std::string class_name; 318931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 319931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!ClangASTContext::GetObjCClassName(class_type, class_name)) 320931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 321931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 322931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ProcessSP process_sp(GetUpdatePoint().GetExecutionContextRef().GetProcessSP()); 323931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 324931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!process_sp) 325931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 326931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 327931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ObjCLanguageRuntime *objc_language_runtime(process_sp->GetObjCLanguageRuntime()); 328931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 329931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!objc_language_runtime) 330931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 331931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 332931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ConstString class_name_cs(class_name.c_str()); 333931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 334931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan TypeSP complete_objc_class_type_sp = objc_language_runtime->LookupInCompleteClassCache(class_name_cs); 335931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 336931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!complete_objc_class_type_sp) 337931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 338931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 339931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType complete_class(complete_objc_class_type_sp->GetClangAST(), 340931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan complete_objc_class_type_sp->GetClangFullType()); 341931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 342931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!ClangASTContext::GetCompleteType(complete_class.GetASTContext(), 343931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan complete_class.GetOpaqueQualType())) 344931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 345931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 346931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (is_pointer_type) 347931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 348931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan clang_type_t pointer_type = ClangASTContext::CreatePointerType(complete_class.GetASTContext(), 349931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan complete_class.GetOpaqueQualType()); 350931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 351931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_override_type = ClangASTType(complete_class.GetASTContext(), 352931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan pointer_type); 353931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 354931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 355931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 356931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_override_type = complete_class; 357931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 358931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 359940dd18789f83f28a618a9b588376c8bae557347Sean Callanan if (m_override_type.IsValid()) 360940dd18789f83f28a618a9b588376c8bae557347Sean Callanan return m_override_type; 361940dd18789f83f28a618a9b588376c8bae557347Sean Callanan else 362940dd18789f83f28a618a9b588376c8bae557347Sean Callanan return ret; 363931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 364931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 365931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananclang::ASTContext * 366931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::GetClangAST () 367931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 368931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType type = MaybeCalculateCompleteType(); 369931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 370931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return type.GetASTContext(); 371931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 372931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 373931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananlldb::clang_type_t 374931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::GetClangType () 375931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 376931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType type = MaybeCalculateCompleteType(); 377931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 378931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return type.GetOpaqueQualType(); 379931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 380931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 384afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 389bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError() 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 391afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 402fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString () 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 404afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false)) 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value.GetValueType()) 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 4137c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 4146916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterInfo *reg_info = m_value.GetRegisterInfo(); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 4237c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton 4247c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton m_location_str = (reg_info->encoding == lldb::eEncodingVector) ? "vector" : "scalar"; 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2; 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 457fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar) 4580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 459c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything 460c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata { 461b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 462574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Value tmp_value(m_value); 463574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham scalar = tmp_value.ResolveValue(&exe_ctx, GetClangAST ()); 4641716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton if (scalar.IsValid()) 4651716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton { 4661716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton const uint32_t bitfield_bit_size = GetBitfieldBitSize(); 4671716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton if (bitfield_bit_size) 4681716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return scalar.ExtractBitfield (bitfield_bit_size, GetBitfieldBitOffset()); 4691716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return true; 4701716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton } 471c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata } 4721716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return false; 4730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 4740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 4750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 47617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 489fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange () 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 491fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham GetValueAsCString (); 49217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 50236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndex (size_t idx, bool can_create) 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 507afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (idx < GetNumChildren()) 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check if we have already made the child value object? 51106cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata if (can_create && !m_children.HasChildAtIndex(idx)) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // No we haven't created the child at this index, so lets have our 514917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // subclass do it and cache the result for quick future access. 51506cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata m_children.SetChildAtIndex(idx,CreateChildAtIndex (idx, false, 0)); 516e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 517917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 51806cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata ValueObject* child = m_children.GetChildAtIndex(idx); 51906cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata if (child != NULL) 52006cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata return child->GetSP(); 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 525b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataValueObjectSP 52636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::initializer_list<size_t>& idxs, 52736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 528b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 529b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 530b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 531b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 53236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx : idxs) 533b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 534b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx, true); 535b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 536b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 537b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 538b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx; 539b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 540b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 541b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 542b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 543b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 544b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 545b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataValueObjectSP 54636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::initializer_list< std::pair<size_t, bool> >& idxs, 54736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 548b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 549b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 550b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 551b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 55236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (std::pair<size_t, bool> idx : idxs) 553b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 554b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx.first, idx.second); 555b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 556b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 557b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 558b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx.first; 559b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 560b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 561b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 562b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 563b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 564b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 565b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb::ValueObjectSP 56636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::vector<size_t> &idxs, 56736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 568b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 569b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 570b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 571b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 57236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx : idxs) 573b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 574b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx, true); 575b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 576b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 577b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 578b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx; 579b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 580b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 581b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 582b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 583b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 584b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 585b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb::ValueObjectSP 58636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::vector< std::pair<size_t, bool> > &idxs, 58736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 588b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 589b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 590b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 591b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 59236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (std::pair<size_t, bool> idx : idxs) 593b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 594b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx.first, idx.second); 595b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 596b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 597b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 598b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx.first; 599b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 600b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 601b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 602b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 603b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 604b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 60536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 610462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 611427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6185d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 623917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 624917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 625afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 626917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 627917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t> child_indexes; 628917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 629917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton void *clang_type = GetClangType(); 630917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 631917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 632917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 633917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton name.GetCString(), 634917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 635917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_indexes); 636917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (num_child_indexes > 0) 637e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 638917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 639917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator end = child_indexes.end (); 640e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 641917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = GetChildAtIndex(*pos, can_create); 642917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton for (++pos; pos != end; ++pos) 643917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 644917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_sp) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 646917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 647917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = new_child_sp; 648917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 649917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 650917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 651917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp.reset(); 652e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 653917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 663dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata UpdateValueIfNeeded(); 66417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66806cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata return m_children.GetChildrenCount(); 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67054037b1488e3344575714d8358728e042fa801c7Greg Clayton 67154037b1488e3344575714d8358728e042fa801c7Greg Claytonbool 67254037b1488e3344575714d8358728e042fa801c7Greg ClaytonValueObject::MightHaveChildren() 67354037b1488e3344575714d8358728e042fa801c7Greg Clayton{ 674b8080cb01bb09038eaab15b34be058611c3e7885Enrico Granata bool has_children = false; 675940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo(); 676940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (type_info) 67754037b1488e3344575714d8358728e042fa801c7Greg Clayton { 67854037b1488e3344575714d8358728e042fa801c7Greg Clayton if (type_info & (ClangASTContext::eTypeHasChildren | 67954037b1488e3344575714d8358728e042fa801c7Greg Clayton ClangASTContext::eTypeIsPointer | 68054037b1488e3344575714d8358728e042fa801c7Greg Clayton ClangASTContext::eTypeIsReference)) 68154037b1488e3344575714d8358728e042fa801c7Greg Clayton has_children = true; 68254037b1488e3344575714d8358728e042fa801c7Greg Clayton } 68354037b1488e3344575714d8358728e042fa801c7Greg Clayton else 68454037b1488e3344575714d8358728e042fa801c7Greg Clayton { 68554037b1488e3344575714d8358728e042fa801c7Greg Clayton has_children = GetNumChildren () > 0; 68654037b1488e3344575714d8358728e042fa801c7Greg Clayton } 68754037b1488e3344575714d8358728e042fa801c7Greg Clayton return has_children; 68854037b1488e3344575714d8358728e042fa801c7Greg Clayton} 68954037b1488e3344575714d8358728e042fa801c7Greg Clayton 69054037b1488e3344575714d8358728e042fa801c7Greg Clayton// Should only be called by ValueObject::GetNumChildren() 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 69236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::SetNumChildren (size_t num_children) 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 69506cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata m_children.SetChildrenCount(num_children); 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70447da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 70536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index) 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 707bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham ValueObject *valobj = NULL; 708e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 709917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 71024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = synthetic_array_member; 711917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::string child_name_str; 712917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_byte_size = 0; 713917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton int32_t child_byte_offset = 0; 714917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_size = 0; 715917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_offset = 0; 716917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_base_class = false; 717917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_deref_of_parent = false; 718917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 719917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool transparent_pointers = synthetic_array_member == false; 720917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 721917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t clang_type = GetClangType(); 722917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t child_clang_type; 723917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 724b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 725917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 726917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 727917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 728917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetName().GetCString(), 729917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 730917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton idx, 731917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton transparent_pointers, 732917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 73324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 734917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name_str, 735917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 736917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 737917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 738917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 739917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 740917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 741b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton if (child_clang_type) 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 743917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (synthetic_index) 744917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset += child_byte_size * synthetic_index; 745917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 746917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ConstString child_name; 747917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!child_name_str.empty()) 748917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name.SetCString (child_name_str.c_str()); 749917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 750917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj = new ValueObjectChild (*this, 751917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 752917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type, 753917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name, 754917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 755917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 756917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 757917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 758917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 759915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata child_is_deref_of_parent, 760915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 761915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata //if (valobj) 762915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // valobj->SetAddressTypeOfChildren(eAddressTypeInvalid); 763915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 764e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 76547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatabool 7693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetSummaryAsCString (TypeSummaryImpl* summary_ptr, 7703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string& destination) 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.clear(); 7733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 7743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // ideally we would like to bail out if passing NULL, but if we do so 7753069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // we end up not providing the summary for function pointers anymore 7763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (/*summary_ptr == NULL ||*/ m_is_getting_summary) 7773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return false; 778ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton 779ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton m_is_getting_summary = true; 78063aa63418b3444bf7dd6e32e8320533390124402Enrico Granata 78163aa63418b3444bf7dd6e32e8320533390124402Enrico Granata // this is a hot path in code and we prefer to avoid setting this string all too often also clearing out other 78263aa63418b3444bf7dd6e32e8320533390124402Enrico Granata // information that we might care to see in a crash log. might be useful in very specific situations though. 78363aa63418b3444bf7dd6e32e8320533390124402Enrico Granata /*Host::SetCrashDescriptionWithFormat("Trying to fetch a summary for %s %s. Summary provider's description is %s", 78463aa63418b3444bf7dd6e32e8320533390124402Enrico Granata GetTypeName().GetCString(), 78563aa63418b3444bf7dd6e32e8320533390124402Enrico Granata GetName().GetCString(), 78663aa63418b3444bf7dd6e32e8320533390124402Enrico Granata summary_ptr->GetDescription().c_str());*/ 78763aa63418b3444bf7dd6e32e8320533390124402Enrico Granata 7883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded (false)) 7893069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 7903069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (summary_ptr) 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 792cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (HasSyntheticValue()) 793cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value->UpdateValueIfNeeded(); // the summary might depend on the synthetic children being up-to-date (e.g. ${svar%#}) 794cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata summary_ptr->FormatObject(this, destination); 7953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 7963069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 7973069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 7983069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t clang_type = GetClangType(); 7993069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8003069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // Do some default printout for function pointers 8013069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (clang_type) 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata StreamString sstr; 8043069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t elem_or_pointee_clang_type; 8053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 8063069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata GetClangAST(), 8073069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata &elem_or_pointee_clang_type)); 8083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8093069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (ClangASTContext::IsFunctionPointerType (clang_type)) 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8113069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata AddressType func_ptr_address_type = eAddressTypeInvalid; 8123069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata addr_t func_ptr_address = GetPointerValue (&func_ptr_address_type); 8133069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8153069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata switch (func_ptr_address_type) 816fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 817b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeInvalid: 818b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeFile: 819b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 8203069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 821b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeLoad: 8223069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8233069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 8243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8253069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address so_addr; 8263069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 8273069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (target && target->GetSectionLoadList().IsEmpty() == false) 82803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 8293069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 83003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 8313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata so_addr.Dump (&sstr, 8323069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata exe_ctx.GetBestExecutionContextScope(), 8333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address::DumpStyleResolvedDescription, 8343069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address::DumpStyleSectionNameOffset); 83503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 836f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 8373069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 838b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 8393069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 840b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeHost: 841b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 842b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (sstr.GetSize() > 0) 8453069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8463069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.assign (1, '('); 8473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.append (sstr.GetData(), sstr.GetSize()); 8483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.append (1, ')'); 8493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 854ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton m_is_getting_summary = false; 8553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return !destination.empty(); 8563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 8573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granataconst char * 8593069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetSummaryAsCString () 8603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 8613069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded(true) && m_summary_str.empty()) 8623069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata GetSummaryAsCString(GetSummaryFormat().get(), 8643069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_summary_str); 8653069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8711a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool 8721a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer) 8731a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 8741a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 875940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const Flags type_flags (GetTypeInfo (&elem_or_pointee_clang_type)); 8761a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 877940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton ClangASTContext::IsCharType (elem_or_pointee_clang_type)); 8781a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!is_char_arr_ptr) 8791a102087f54079c25c8827afac6153a44ca535daEnrico Granata return false; 8801a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!check_pointer) 8811a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 8821a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test(ClangASTContext::eTypeIsArray)) 8831a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 8845c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton addr_t cstr_address = LLDB_INVALID_ADDRESS; 8851a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 886915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata cstr_address = GetAddressOf (true, &cstr_address_type); 8871a102087f54079c25c8827afac6153a44ca535daEnrico Granata return (cstr_address != LLDB_INVALID_ADDRESS); 8881a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 8891a102087f54079c25c8827afac6153a44ca535daEnrico Granata 890915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatasize_t 891915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetPointeeData (DataExtractor& data, 892915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t item_idx, 893915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t item_count) 894915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 895940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton clang_type_t pointee_or_element_clang_type; 896940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo (&pointee_or_element_clang_type); 897940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const bool is_pointer_type = type_info & ClangASTContext::eTypeIsPointer; 898940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const bool is_array_type = type_info & ClangASTContext::eTypeIsArray; 899940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (!(is_pointer_type || is_array_type)) 900915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 901915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 902915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (item_count == 0) 903915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 904915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 905940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton clang::ASTContext *ast = GetClangAST(); 906940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton ClangASTType pointee_or_element_type(ast, pointee_or_element_clang_type); 907915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 908940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint64_t item_type_size = pointee_or_element_type.GetClangTypeByteSize(); 909915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 910915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata const uint64_t bytes = item_count * item_type_size; 911915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 912915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata const uint64_t offset = item_idx * item_type_size; 913915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 914915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (item_idx == 0 && item_count == 1) // simply a deref 915915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 916940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (is_pointer_type) 917915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 918915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Error error; 919915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata ValueObjectSP pointee_sp = Dereference(error); 920915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Fail() || pointee_sp.get() == NULL) 921915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 922915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return pointee_sp->GetDataExtractor().Copy(data); 923915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 924915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata else 925915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 926915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata ValueObjectSP child_sp = GetChildAtIndex(0, true); 927915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (child_sp.get() == NULL) 928915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 929915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return child_sp->GetDataExtractor().Copy(data); 930915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 931915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return true; 932915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 933915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata else /* (items > 1) */ 934915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 935915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Error error; 936915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata lldb_private::DataBufferHeap* heap_buf_ptr = NULL; 937915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata lldb::DataBufferSP data_sp(heap_buf_ptr = new lldb_private::DataBufferHeap()); 938915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 939915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata AddressType addr_type; 940940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton lldb::addr_t addr = is_pointer_type ? GetPointerValue(&addr_type) : GetAddressOf(true, &addr_type); 941915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 942915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata switch (addr_type) 943915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 944915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeFile: 945915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 9463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (GetModule()); 9473508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 948915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 949f4b54c8cd1523da2fa70d7397b2bb93a49421a34Enrico Granata addr = addr + offset; 950915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Address so_addr; 9513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton module_sp->ResolveFileAddress(addr, so_addr); 952b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 953b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target* target = exe_ctx.GetTargetPtr(); 954b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target) 955915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 956b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton heap_buf_ptr->SetByteSize(bytes); 957b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton size_t bytes_read = target->ReadMemory(so_addr, false, heap_buf_ptr->GetBytes(), bytes, error); 958b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (error.Success()) 959915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 960b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetData(data_sp); 961b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton return bytes_read; 962915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 963915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 964915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 965915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 966915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 967915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeLoad: 968915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 969b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 970b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 971915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (process) 972915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 973915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata heap_buf_ptr->SetByteSize(bytes); 974915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata size_t bytes_read = process->ReadMemory(addr + offset, heap_buf_ptr->GetBytes(), bytes, error); 975915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Success()) 976915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 977915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetData(data_sp); 978915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return bytes_read; 979915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 980915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 981915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 982915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 983915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeHost: 984915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 985940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton ClangASTType valobj_type(ast, GetClangType()); 986940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton uint64_t max_bytes = valobj_type.GetClangTypeByteSize(); 987940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (max_bytes > offset) 988940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton { 989940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton size_t bytes_read = std::min<uint64_t>(max_bytes - offset, bytes); 990940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton heap_buf_ptr->CopyData((uint8_t*)(addr + offset), bytes_read); 991940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton data.SetData(data_sp); 992940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return bytes_read; 993940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton } 994915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 995915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 996915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeInvalid: 997915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 998915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 999915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 1000915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 1001915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 1002915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1003fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t 1004915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetData (DataExtractor& data) 1005915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 1006915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata UpdateValueIfNeeded(false); 1007b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 10083508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Error error = m_value.GetValueAsData(&exe_ctx, GetClangAST(), data, 0, GetModule().get()); 1009915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Fail()) 1010915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 1011915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetAddressByteSize(m_data.GetAddressByteSize()); 1012915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetByteOrder(m_data.GetByteOrder()); 1013915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return data.GetByteSize(); 1014915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 1015915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1016ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananbool 1017ab8e00e51475b9148626bfdf99549b7ffc3d046dSean CallananValueObject::SetData (DataExtractor &data, Error &error) 1018ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan{ 1019ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.Clear(); 1020ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // Make sure our value is up to date first so that our location and location 1021ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // type is valid. 1022ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (!UpdateValueIfNeeded(false)) 1023ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1024ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.SetErrorString("unable to read value"); 1025ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1026ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1027ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1028ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan uint64_t count = 0; 1029ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 1030ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1031ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan const size_t byte_size = GetByteSize(); 1032ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1033ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan Value::ValueType value_type = m_value.GetValueType(); 1034ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1035ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan switch (value_type) 1036ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1037ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeScalar: 1038ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1039ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan Error set_error = m_value.GetScalar().SetValueFromData(data, encoding, byte_size); 1040ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1041ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (!set_error.Success()) 1042ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1043ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.SetErrorStringWithFormat("unable to set scalar value: %s", set_error.AsCString()); 1044ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1045ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1046ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1047ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1048ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeLoadAddress: 1049ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1050ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // If it is a load address, then the scalar value is the storage location 1051ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // of the data, and we have to shove this value down to that load location. 1052ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan ExecutionContext exe_ctx (GetExecutionContextRef()); 1053ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan Process *process = exe_ctx.GetProcessPtr(); 1054ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (process) 1055ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1056ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan addr_t target_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1057ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan size_t bytes_written = process->WriteMemory(target_addr, 1058ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan data.GetDataStart(), 1059ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan byte_size, 1060ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error); 1061ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (!error.Success()) 1062ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1063ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (bytes_written != byte_size) 1064ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1065ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.SetErrorString("unable to write value to memory"); 1066ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1067ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1068ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1069ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1070ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1071ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeHostAddress: 1072ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1073ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // If it is a host address, then we stuff the scalar as a DataBuffer into the Value's data. 1074ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan DataBufferSP buffer_sp (new DataBufferHeap(byte_size, 0)); 1075ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan m_data.SetData(buffer_sp, 0); 1076ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan data.CopyByteOrderedData (0, 1077ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan byte_size, 1078ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan const_cast<uint8_t *>(m_data.GetDataStart()), 1079ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan byte_size, 1080ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan m_data.GetByteOrder()); 1081ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); 1082ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1083ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1084ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeFileAddress: 1085ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeVector: 1086ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1087ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1088ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1089ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // If we have reached this point, then we have successfully changed the value. 1090ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan SetNeedsUpdate(); 1091ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return true; 1092ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan} 1093ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1094915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// will compute strlen(str), but without consuming more than 1095915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// maxlen bytes out of str (this serves the purpose of reading 1096915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// chunks of a string without having to worry about 1097915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// missing NULL terminators in the chunk) 1098915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// of course, if strlen(str) > maxlen, the function will return 1099915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// maxlen_value (which should be != maxlen, because that allows you 1100915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// to know whether strlen(str) == maxlen or strlen(str) > maxlen) 1101915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatastatic uint32_t 1102915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatastrlen_or_inf (const char* str, 1103915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t maxlen, 1104915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t maxlen_value) 1105915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 1106915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t len = 0; 1107103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton if (str) 1108915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 1109103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton while(*str) 1110103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton { 1111103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton len++;str++; 1112940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (len >= maxlen) 1113103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton return maxlen_value; 1114103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton } 1115915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 1116915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return len; 1117915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 1118915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 111932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatasize_t 1120b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg ClaytonValueObject::ReadPointedString (Stream& s, 1121b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Error& error, 1122b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_length, 1123b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton bool honor_array, 1124b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Format item_format) 11251a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 1126b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1127b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target* target = exe_ctx.GetTargetPtr(); 1128b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 112915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (!target) 113015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 113115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "<no target to read from>"; 113215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("no target to read from"); 113315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata return 0; 113415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 113515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 113615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (max_length == 0) 1137b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton max_length = target->GetMaximumSizeOfStringSummary(); 11381a102087f54079c25c8827afac6153a44ca535daEnrico Granata 113932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata size_t bytes_read = 0; 114032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata size_t total_bytes_read = 0; 114132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 11421a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t clang_type = GetClangType(); 11431a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 1144940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const Flags type_flags (GetTypeInfo (&elem_or_pointee_clang_type)); 11451a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 11461a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 11471a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 114815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata addr_t cstr_address = LLDB_INVALID_ADDRESS; 114915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 115015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 115115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t cstr_len = 0; 115215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bool capped_data = false; 115315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (type_flags.Test (ClangASTContext::eTypeIsArray)) 1154b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 115515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // We have an array 115615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len = ClangASTContext::GetArraySize (clang_type); 115715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len > max_length) 115815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 115915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata capped_data = true; 116015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len = max_length; 116115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 116215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_address = GetAddressOf (true, &cstr_address_type); 1163b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 1164b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton else 1165b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 116615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // We have a pointer 116715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_address = GetPointerValue (&cstr_address_type); 116815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 116915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 117015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_address == 0 || cstr_address == LLDB_INVALID_ADDRESS) 117115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 117215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "<invalid address>"; 117315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("invalid address"); 117415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata return 0; 117515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 117615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 117715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata Address cstr_so_addr (cstr_address); 117815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata DataExtractor data; 117915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len > 0 && honor_array) 118015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 118115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host 118215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this 118315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata GetPointeeData(data, 0, cstr_len); 118415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 118515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if ((bytes_read = data.GetByteSize()) > 0) 1186b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 118715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata total_bytes_read = bytes_read; 118815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 118915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata data.Dump (&s, 119015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // Start offset in "data" 119115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata item_format, 119215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 1, // Size of item (1 byte for a char!) 119315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bytes_read, // How many bytes to print? 119415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata UINT32_MAX, // num per line 119515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata LLDB_INVALID_ADDRESS,// base address 119615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // bitfield bit size 119715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0); // bitfield bit offset 119815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (capped_data) 119915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "..."; 120015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 1201b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 120215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 120315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata else 120415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 120515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len = max_length; 120615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata const size_t k_max_buf_size = 64; 120715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 120815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t offset = 0; 120915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 121015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata int cstr_len_displayed = -1; 121115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bool capped_cstr = false; 121215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host 121315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this 121415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata while ((bytes_read = GetPointeeData(data, offset, k_max_buf_size)) > 0) 12151a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 121615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata total_bytes_read += bytes_read; 121715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata const char *cstr = data.PeekCStr(0); 121815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t len = strlen_or_inf (cstr, k_max_buf_size, k_max_buf_size+1); 121915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > k_max_buf_size) 122015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = k_max_buf_size; 122115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr && cstr_len_displayed < 0) 122215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 122315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 122415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len_displayed < 0) 122515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len_displayed = len; 122615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 122715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len == 0) 122815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 122915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len_displayed += len; 123015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > bytes_read) 123115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = bytes_read; 123215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > cstr_len) 123315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = cstr_len; 123415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 123515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata data.Dump (&s, 123615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // Start offset in "data" 123715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata item_format, 123815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 1, // Size of item (1 byte for a char!) 123915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len, // How many bytes to print? 124015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata UINT32_MAX, // num per line 124115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata LLDB_INVALID_ADDRESS,// base address 124215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // bitfield bit size 124315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0); // bitfield bit offset 124415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 124515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len < k_max_buf_size) 124615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 124715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 124815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len >= cstr_len) 1249979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 125015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata capped_cstr = true; 125115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 1252979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1253b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 125415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len -= len; 125515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata offset += len; 125615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 125715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 125815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len_displayed >= 0) 125915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 126015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 126115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (capped_cstr) 126215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "..."; 12631a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 1264b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 12651a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 12661a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 12671a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 126815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("not a string object"); 1269979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<not a string object>"; 12701a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 127132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return total_bytes_read; 12721a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 12731a102087f54079c25c8827afac6153a44ca535daEnrico Granata 12744ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 1275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription () 12764ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 1277886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 12787dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata if (!UpdateValueIfNeeded (true)) 12794ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 1280886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1281886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!m_object_desc_str.empty()) 1282886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_object_desc_str.c_str(); 1283886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1284b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1285b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 1286b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 12874ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 1288b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1289b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 12904ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 12915c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton LanguageType language = GetObjectRuntimeLanguage(); 1292b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 12934ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 12940e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 12950e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 129670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway... 12970e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 12980e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 12990e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 130070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham bool is_signed; 130170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed) 130270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham || ClangASTContext::IsPointerType (opaque_qual_type)) 130370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham { 13045c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton runtime = process->GetLanguageRuntime(eLanguageTypeObjC); 130570c55622e15857e232cf4777a502fa5fe40e785bJim Ingham } 13060e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 13070e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 13080e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 13090de37195f17fefb536157b3296a18999116b8125Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this)) 13104ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 13114ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 13124ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 1313e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 1314e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 1315e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 1316e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 1317e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 13184ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13203069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatabool 13213069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetValueAsCString (lldb::Format format, 13223069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string& destination) 13233069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 13243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == false && 13253069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata UpdateValueIfNeeded(false)) 13263069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13273069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const Value::ContextType context_type = m_value.GetContextType(); 13283069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 13293069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata switch (context_type) 13303069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeClangType: 13323069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeLLDBType: 13333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeVariable: 13343069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13353069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t clang_type = GetClangType (); 13363069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (clang_type) 13373069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 133860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata // put custom bytes to display in this DataExtractor to override the default value logic 133960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata lldb_private::DataExtractor special_format_data; 134060dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata clang::ASTContext* ast = GetClangAST(); 13416aac8440da7f1548de96ea897ba9b7fe38268f3fEnrico Granata if (format == eFormatCString) 134260dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 1343dcb6c43aab268e9a5196cf0be239f1946d968680Enrico Granata Flags type_flags(ClangASTContext::GetTypeInfo(clang_type, ast, NULL)); 13446aac8440da7f1548de96ea897ba9b7fe38268f3fEnrico Granata if (type_flags.Test(ClangASTContext::eTypeIsPointer) && !type_flags.Test(ClangASTContext::eTypeIsObjC)) 134560dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 134660dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata // if we are dumping a pointer as a c-string, get the pointee data as a string 134760dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata TargetSP target_sp(GetTargetSP()); 134860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata if (target_sp) 134960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 135060dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata size_t max_len = target_sp->GetMaximumSizeOfStringSummary(); 135160dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata Error error; 135260dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata DataBufferSP buffer_sp(new DataBufferHeap(max_len+1,0)); 135360dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata Address address(GetPointerValue()); 135460dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata if (target_sp->ReadCStringFromMemory(address, (char*)buffer_sp->GetBytes(), max_len, error) && error.Success()) 135560dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata special_format_data.SetData(buffer_sp); 135660dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 135760dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 135860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 135960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata 13603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata StreamString sstr; 13613069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 136260dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata ClangASTType::DumpTypeValue (ast, // The clang AST 136360dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata clang_type, // The clang type to display 136460dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata &sstr, // The stream to use for display 136560dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata format, // Format to display this type with 136660dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata special_format_data.GetByteSize() ? 136760dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata special_format_data: m_data, // Data to extract from 136860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata 0, // Byte offset into "m_data" 136960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata GetByteSize(), // Byte size of item in "m_data" 137060dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata GetBitfieldBitSize(), // Bitfield bit size 137160dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata GetBitfieldBitOffset(), // Bitfield bit offset 13723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata exe_ctx.GetBestExecutionContextScope()); 13733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // Don't set the m_error to anything here otherwise 13743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // we won't be able to re-format as anything else. The 13753069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // code for ClangASTType::DumpTypeValue() should always 13763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // return something, even if that something contains 13773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // an error messsage. "m_error" is used to detect errors 13783069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // when reading the valid object, not for formatting errors. 13793069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (sstr.GetString().empty()) 13803069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.clear(); 13813069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 13823069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.swap(sstr.GetString()); 13833069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13843069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13853069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata break; 13863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 13873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeRegisterInfo: 13883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13893069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 13903069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (reg_info) 13913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 13933069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 13943069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata StreamString reg_sstr; 13953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_data.Dump (®_sstr, 13963069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 13973069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata format, 13983069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata reg_info->byte_size, 13993069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 1, 14003069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata UINT32_MAX, 14013069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata LLDB_INVALID_ADDRESS, 14023069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 14033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 14043069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata exe_ctx.GetBestExecutionContextScope()); 14053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.swap(reg_sstr.GetString()); 14063069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 14073069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 14083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata break; 14093069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 14103069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata default: 14113069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata break; 14123069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 14133069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return !destination.empty(); 14143069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 14153069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 14163069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return false; 14173069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 14183069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 1420fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString () 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14223069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded(true) && m_value_str.empty()) 142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata lldb::Format my_format = GetFormat(); 14254f5b299c1f5daf4cce9aad01471a6b558e5b13d2Enrico Granata if (my_format == lldb::eFormatDefault) 142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14273069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_type_format_sp) 14283069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = m_type_format_sp->GetFormat(); 14293069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_is_bitfield_for_scalar) 14323069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = eFormatUnsigned; 14333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14353069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 14393069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = reg_info->format; 14403069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 14413069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 14423069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 14433069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t clang_type = GetClangType (); 14443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = ClangASTType::GetFormat(clang_type); 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144980e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata if (GetValueAsCString(my_format, m_value_str)) 145080e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata { 145180e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata if (!m_value_did_change && m_old_value_valid) 145280e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata { 145380e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata // The value was gotten successfully, so we consider the 145480e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata // value as changed if the value string differs 145580e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata SetValueDidChange (m_old_value_str != m_value_str); 145680e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata } 145780e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata } 145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1464afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used 1465afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers 146637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonuint64_t 1467e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny ChenValueObject::GetValueAsUnsigned (uint64_t fail_value, bool *success) 1468afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{ 1469afb7c85df796f74262917e44dd68f668dade3911Enrico Granata // If our byte size is zero this is an aggregate type that has children 1470afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == false) 1471afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 147237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton Scalar scalar; 147337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (ResolveValue (scalar)) 1474e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen { 1475e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen if (success) 1476e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen *success = true; 14774a0a1252629a807d37ac252b0239f10204eddedcEnrico Granata return scalar.ULongLong(fail_value); 1478e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen } 1479e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen // fallthrough, otherwise... 1480afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 1481e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen 1482e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen if (success) 1483e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen *success = false; 148437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return fail_value; 1485afb7c85df796f74262917e44dd68f668dade3911Enrico Granata} 1486afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 14876f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// if any more "special cases" are added to ValueObject::DumpPrintableRepresentation() please keep 14886f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// this call up to date by returning true for your new special cases. We will eventually move 14896f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// to checking this call result before trying to display special cases 14906f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granatabool 1491cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, 1492cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Format custom_format) 14936f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata{ 14946f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata clang_type_t elem_or_pointee_type; 1495940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton Flags flags(GetTypeInfo(&elem_or_pointee_type)); 14966f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 14976f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) 1498cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) 14996f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15006f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (IsCStringContainer(true) && 15015c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatCString || 15025c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatCharArray || 15035c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatChar || 15045c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatVectorOfChar)) 15056f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 15066f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15076f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (flags.Test(ClangASTContext::eTypeIsArray)) 15086f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15095c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if ((custom_format == eFormatBytes) || 15105c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatBytesWithASCII)) 15116f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 15126f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15135c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if ((custom_format == eFormatVectorOfChar) || 15145c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfFloat32) || 15155c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfFloat64) || 15165c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt16) || 15175c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt32) || 15185c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt64) || 15195c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt8) || 15205c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt128) || 15215c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt16) || 15225c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt32) || 15235c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt64) || 15245c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt8)) 15256f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 15266f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 15276f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 15286f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return false; 15296f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 15306f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 15329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s, 15339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectRepresentationStyle val_obj_display, 15345c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton Format custom_format, 1535cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata PrintableRepresentationSpecialCases special) 15369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 153786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 153886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata clang_type_t elem_or_pointee_type; 1539940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton Flags flags(GetTypeInfo(&elem_or_pointee_type)); 15401a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1541cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool allow_special = ((special & ePrintableRepresentationSpecialCasesAllow) == ePrintableRepresentationSpecialCasesAllow); 1542cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool only_special = ((special & ePrintableRepresentationSpecialCasesOnly) == ePrintableRepresentationSpecialCasesOnly); 1543cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1544cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (allow_special) 15451a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 1546cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) 1547cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) 154886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1549cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // when being asked to get a printable display an array or pointer type directly, 1550cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // try to "do the right thing" 1551cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1552cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (IsCStringContainer(true) && 1553cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCString || 1554cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatCharArray || 1555cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatChar || 1556cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatVectorOfChar)) // print char[] & char* directly 155786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1558cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Error error; 1559cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ReadPointedString(s, 1560cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata error, 1561cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 0, 1562cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfChar) || 1563cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCharArray)); 1564cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return !error.Fail(); 1565cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1566cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1567cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format == eFormatEnum) 1568cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1569cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1570cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // this only works for arrays, because I have no way to know when 1571cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // the pointed memory ends, and no special \0 end of data marker 1572cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (flags.Test(ClangASTContext::eTypeIsArray)) 1573cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1574cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatBytes) || 1575cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatBytesWithASCII)) 157686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 157736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t count = GetNumChildren(); 1578cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1579cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << '['; 158036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t low = 0; low < count; low++) 1581cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1582cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1583cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (low) 1584cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ','; 1585cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1586cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 1587cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!child.get()) 1588cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1589cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << "<invalid child>"; 1590cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata continue; 1591cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1592cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, custom_format); 1593cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 159486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1595cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ']'; 159686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1597cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return true; 1598cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 159986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1600cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatVectorOfChar) || 1601cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfFloat32) || 1602cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfFloat64) || 1603cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt16) || 1604cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt32) || 1605cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt64) || 1606cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt8) || 1607cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt128) || 1608cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt16) || 1609cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt32) || 1610cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt64) || 1611cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly 1612cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 161336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t count = GetNumChildren(); 1614cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1615cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Format format = FormatManager::GetSingleItemFormat(custom_format); 1616cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1617cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << '['; 161836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t low = 0; low < count; low++) 1619cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1620cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1621cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (low) 1622cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ','; 1623cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1624cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 1625cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!child.get()) 1626cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1627cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << "<invalid child>"; 1628cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata continue; 1629cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1630cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, format); 1631cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1632cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1633cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ']'; 1634cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1635cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return true; 1636cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 163786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 163886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1639cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatBoolean) || 1640cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatBinary) || 1641cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatChar) || 1642cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCharPrintable) || 1643cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplexFloat) || 1644cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatDecimal) || 1645cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatHex) || 1646535543d6104ee45b4503db6bb6c175e66d0e093bEnrico Granata (custom_format == eFormatHexUppercase) || 1647cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatFloat) || 1648cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatOctal) || 1649cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatOSType) || 1650cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnicode16) || 1651cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnicode32) || 1652cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnsigned) || 1653cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatPointer) || 1654cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplexInteger) || 1655cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplex) || 1656cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatDefault)) // use the [] operator 1657cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1658cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1659cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1660cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1661cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (only_special) 1662cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1663cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1664cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool var_success = false; 1665cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1666cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 166736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const char *cstr = NULL; 166836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton StreamString strm; 166986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1670cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format != eFormatInvalid) 1671cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata SetFormat(custom_format); 1672cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1673cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata switch(val_obj_display) 1674cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1675cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleValue: 167636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetValueAsCString(); 1677cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1678cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1679cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleSummary: 168036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetSummaryAsCString(); 1681cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 168286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1683cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleLanguageSpecific: 168436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetObjectDescription(); 1685cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1686cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1687cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleLocation: 168836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetLocationAsCString(); 1689cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1690cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1691cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleChildrenCount: 169236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%zu", GetNumChildren()); 169336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = strm.GetString().c_str(); 1694cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1695cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1696cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleType: 169736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetTypeName().AsCString(); 1698cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1699cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1700cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 170136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (!cstr) 1702cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1703cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (val_obj_display == eValueObjectRepresentationStyleValue) 170436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetSummaryAsCString(); 1705cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleSummary) 1706cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1707cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == true) 170886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 170936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%s @ %s", GetTypeName().AsCString(), GetLocationAsCString()); 171036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = strm.GetString().c_str(); 1711cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1712cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 171336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetValueAsCString(); 171486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 171586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 171686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 171736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (cstr) 171836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton s.PutCString(cstr); 1719cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 1720cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1721cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_error.Fail()) 1722cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.Printf("<%s>", m_error.AsCString()); 1723cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleSummary) 1724cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no summary available>"); 1725cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleValue) 1726cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no value available>"); 1727cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleLanguageSpecific) 1728cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<not a valid Objective-C object>"); // edit this if we have other runtimes that support a description 1729cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 1730cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no printable representation>"); 1731cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1732cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1733cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // we should only return false here if we could not do *anything* 1734cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // even if we have an error message as output, that's a success 1735cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // from our callers' perspective, so return true 1736cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata var_success = true; 1737cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1738cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format != eFormatInvalid) 1739cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata SetFormat(eFormatDefault); 17401a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 17411c61743af946076e988d88baf725382e99d905deEnrico Granata 174286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return var_success; 1743886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 1744886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 174503e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 1746915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetAddressOf (bool scalar_is_load_address, AddressType *address_type) 1747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 1748afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1749e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return LLDB_INVALID_ADDRESS; 1750e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1751f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 1752f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 17547c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 1755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 1756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1757915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1758915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeLoad; 1759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1760f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1761f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1762f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1763f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 1764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 1765f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 1766f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1767915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1768915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = m_value.GetValueAddressType (); 1769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1770f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1771f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1772f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1773915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (address_type) 1774915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeInvalid; 1775f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 1776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 1777f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1778f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 1779915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetPointerValue (AddressType *address_type) 178003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 17815c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton addr_t address = LLDB_INVALID_ADDRESS; 1782915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1783915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeInvalid; 1784e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1785afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1786e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return address; 1787e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 178903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 179003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 17917c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 1792915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 179303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 179403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 1795915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case Value::eValueTypeHostAddress: 179603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 179703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 179803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 179936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t data_offset = 0; 180003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 180103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 180203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 180303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 1804427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1805915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (address_type) 1806915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = GetAddressTypeOfChildren(); 1807427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 180803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 180903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 181003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1812651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico GranataValueObject::SetValueFromCString (const char *value_str, Error& error) 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1814651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.Clear(); 181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 1817afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1818651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata { 1819651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to read value"); 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1821651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata } 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1823fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton uint64_t count = 0; 18245c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1826bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1828574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Value::ValueType value_type = m_value.GetValueType(); 1829574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1830574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (value_type == Value::eValueTypeScalar) 1831574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1832574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If the value is already a scalar, then let the scalar change itself: 1833574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_value.GetScalar().SetValueFromCString (value_str, encoding, byte_size); 1834574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1835574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else if (byte_size <= Scalar::GetMaxByteSize()) 1836574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1837574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If the value fits in a scalar, then make a new scalar and again let the 1838574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // scalar code do the conversion, then figure out where to put the new value. 1839574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Scalar new_scalar; 1840574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham error = new_scalar.SetValueFromCString (value_str, encoding, byte_size); 1841574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (error.Success()) 184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 184321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (value_type) 184421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 1845b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeLoadAddress: 1846574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1847574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If it is a load address, then the scalar value is the storage location 1848574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // of the data, and we have to shove this value down to that load location. 1849b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1850b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 1851b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process) 1852574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 18534a0a1252629a807d37ac252b0239f10204eddedcEnrico Granata addr_t target_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1854b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton size_t bytes_written = process->WriteScalarToMemory (target_addr, 1855b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton new_scalar, 1856b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1857b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton error); 1858651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata if (!error.Success()) 1859651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata return false; 1860651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata if (bytes_written != byte_size) 1861651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata { 1862651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to write value to memory"); 1863651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata return false; 1864651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata } 1865574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1866574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 186721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 1868b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeHostAddress: 1869574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1870574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If it is a host address, then we stuff the scalar as a DataBuffer into the Value's data. 1871574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham DataExtractor new_data; 1872574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham new_data.SetByteOrder (m_data.GetByteOrder()); 1873574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1874574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham DataBufferSP buffer_sp (new DataBufferHeap(byte_size, 0)); 1875574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_data.SetData(buffer_sp, 0); 1876574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham bool success = new_scalar.GetData(new_data); 1877574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (success) 1878574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1879b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton new_data.CopyByteOrderedData (0, 1880b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1881b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton const_cast<uint8_t *>(m_data.GetDataStart()), 1882b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1883b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_data.GetByteOrder()); 1884574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1885574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); 1886574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1887574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 188821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 1889b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeFileAddress: 1890b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeScalar: 18917c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 18927c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton break; 189321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1897574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return false; 189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1899574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1900574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else 1901574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1902574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // We don't support setting things bigger than a scalar at present. 1903651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to write aggregate data type"); 190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1906574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1907574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If we have reached this point, then we have successfully changed the value. 1908574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham SetNeedsUpdate(); 1909574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return true; 191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19120a19a1b9c25117854f226256805239d95153ed2dGreg Claytonbool 19130a19a1b9c25117854f226256805239d95153ed2dGreg ClaytonValueObject::GetDeclaration (Declaration &decl) 19140a19a1b9c25117854f226256805239d95153ed2dGreg Clayton{ 19150a19a1b9c25117854f226256805239d95153ed2dGreg Clayton decl.Clear(); 19160a19a1b9c25117854f226256805239d95153ed2dGreg Clayton return false; 19170a19a1b9c25117854f226256805239d95153ed2dGreg Clayton} 19180a19a1b9c25117854f226256805239d95153ed2dGreg Clayton 1919dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString 1920dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonValueObject::GetTypeName() 1921dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 1922dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return ClangASTType::GetConstTypeName (GetClangAST(), GetClangType()); 1923dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 1924dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 1925dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString 1926dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonValueObject::GetQualifiedTypeName() 1927dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 1928dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return ClangASTType::GetConstQualifiedTypeName (GetClangAST(), GetClangType()); 1929dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 1930dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 1931dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 19325c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonLanguageType 1933b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 1934b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 1935afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return ClangASTType::GetMinimumLanguage (GetClangAST(), 1936afb7c85df796f74262917e44dd68f668dade3911Enrico Granata GetClangType()); 1937b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 1938b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 194047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj) 194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 194247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_synthetic_children[key] = valobj; 194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 194947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key); 195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 195147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = pos->second->GetSP(); 195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1955940ca9447d84a08883d2ce77a765475f09243fc5Greg Claytonuint32_t 1956940ca9447d84a08883d2ce77a765475f09243fc5Greg ClaytonValueObject::GetTypeInfo (clang_type_t *pointee_or_element_clang_type) 1957940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton{ 1958940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return ClangASTContext::GetTypeInfo (GetClangType(), GetClangAST(), pointee_or_element_clang_type); 1959940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton} 1960940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1964462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 196770c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool 196824b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType () 196924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 1970b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton return ClangASTContext::IsArrayType (GetClangType(), NULL, NULL, NULL); 197124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 197224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 197324b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool 19749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType () 19759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 19769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return ClangASTContext::IsScalarType (GetClangType()); 19779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 19789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 19799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 198070c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed) 198170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{ 198270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham return ClangASTContext::IsIntegerType (GetClangType(), is_signed); 198370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham} 1984f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 198882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPointerOrReferenceType (GetClangType()); 198982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 199082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 199182f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 1992917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType () 1993917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 19946b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 19956b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 19966b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (process) 19976b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata return process->IsPossibleDynamicValue(*this); 19986b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata else 19999b90e87380cfafd7e746252588c314bcfefa4fe4Greg Clayton return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType(), NULL, true, true); 2000917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 2001917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 20023ce94041919b44e247c134663281acf3f696b094Enrico Granatabool 20033ce94041919b44e247c134663281acf3f696b094Enrico GranataValueObject::IsObjCNil () 20043ce94041919b44e247c134663281acf3f696b094Enrico Granata{ 2005a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata const uint32_t mask = ClangASTContext::eTypeIsObjC | ClangASTContext::eTypeIsPointer; 2006a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata bool isObjCpointer = ( ((ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), NULL)) & mask) == mask); 2007a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata if (!isObjCpointer) 2008a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata return false; 20093ce94041919b44e247c134663281acf3f696b094Enrico Granata bool canReadValue = true; 20103ce94041919b44e247c134663281acf3f696b094Enrico Granata bool isZero = GetValueAsUnsigned(0,&canReadValue) == 0; 2011a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata return canReadValue && isZero; 20123ce94041919b44e247c134663281acf3f696b094Enrico Granata} 20133ce94041919b44e247c134663281acf3f696b094Enrico Granata 20145c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 201536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMember (size_t index, bool can_create) 20166f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata{ 2017940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo (); 2018940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (type_info & ClangASTContext::eTypeIsArray) 20196f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return GetSyntheticArrayMemberFromArray(index, can_create); 20206f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 2021940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (type_info & ClangASTContext::eTypeIsPointer) 20226f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return GetSyntheticArrayMemberFromPointer(index, can_create); 20236f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 20246f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return ValueObjectSP(); 20256f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 20266f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 20276f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 202936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMemberFromPointer (size_t index, bool can_create) 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 203536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton snprintf(index_str, sizeof(index_str), "[%zu]", index); 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 204247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *synthetic_child; 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 204547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child = CreateChildAtIndex(0, true, index); 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 204847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (synthetic_child) 204947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham { 205047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham AddSyntheticChild(index_const_str, synthetic_child); 205147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = synthetic_child->GetSP(); 2052979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 2053886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->m_is_array_item_for_pointer = true; 205447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham } 205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2059642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 206024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index 206124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array. 206224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as: 206324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection 206424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// { 206524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// uint32_t item_count; 206624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Item item_array[0]; 206724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// }; 206824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice 206924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array". 207024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 207124b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP 207236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMemberFromArray (size_t index, bool can_create) 207324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 207424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP synthetic_child_sp; 207524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (IsArrayType ()) 207624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 207724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton char index_str[64]; 207836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton snprintf(index_str, sizeof(index_str), "[%zu]", index); 207924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ConstString index_const_str(index_str); 208024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Check if we have already created a synthetic array member in this 208124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // valid object. If we have we will re-use it. 208224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = GetSyntheticChild (index_const_str); 208324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!synthetic_child_sp) 208424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 208524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObject *synthetic_child; 208624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // We haven't made a synthetic array member for INDEX yet, so 208724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // lets make one and cache it for any future reference. 208824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child = CreateChildAtIndex(0, true, index); 208924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 209024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Cache the value if we got one back... 209124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (synthetic_child) 209224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 209324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton AddSyntheticChild(index_const_str, synthetic_child); 209424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = synthetic_child->GetSP(); 2095979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 209624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp->m_is_array_item_for_pointer = true; 209724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 209824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 209924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 210024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return synthetic_child_sp; 210124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 210224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 21039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP 21049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create) 21059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 21069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP synthetic_child_sp; 21079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (IsScalarType ()) 21089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 21099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char index_str[64]; 21109762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to); 21119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ConstString index_const_str(index_str); 21129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Check if we have already created a synthetic array member in this 21139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // valid object. If we have we will re-use it. 21149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = GetSyntheticChild (index_const_str); 21159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!synthetic_child_sp) 21169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 21179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectChild *synthetic_child; 21189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // We haven't made a synthetic array member for INDEX yet, so 21199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // lets make one and cache it for any future reference. 21209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child = new ValueObjectChild(*this, 21219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangAST(), 21229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangType(), 21239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata index_const_str, 21249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetByteSize(), 21259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 0, 21269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata to-from+1, 21279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata from, 21289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false, 2129915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata false, 2130915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 21319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 21329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Cache the value if we got one back... 21339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (synthetic_child) 21349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 21359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata AddSyntheticChild(index_const_str, synthetic_child); 21369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = synthetic_child->GetSP(); 2137979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 21389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->m_is_bitfield_for_scalar = true; 21399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 21409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 21419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 21429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return synthetic_child_sp; 21436f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 21446f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 21455c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2146979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create) 2147979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 2148979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2149979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectSP synthetic_child_sp; 2150979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2151979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata char name_str[64]; 2152979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata snprintf(name_str, sizeof(name_str), "@%i", offset); 2153979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ConstString name_const_str(name_str); 2154979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2155979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // Check if we have already created a synthetic array member in this 2156979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // valid object. If we have we will re-use it. 2157979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = GetSyntheticChild (name_const_str); 2158979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2159979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child_sp.get()) 2160979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 2161979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2162979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (!can_create) 21635c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton return ValueObjectSP(); 2164979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2165979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectChild *synthetic_child = new ValueObjectChild(*this, 2166979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetASTContext(), 2167979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetOpaqueQualType(), 2168979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_const_str, 2169979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetTypeByteSize(), 2170979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata offset, 2171979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 2172979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 2173979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata false, 2174915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata false, 2175915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 2176979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child) 2177979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 2178979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata AddSyntheticChild(name_const_str, synthetic_child); 2179979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = synthetic_child->GetSP(); 2180979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(name_const_str); 2181979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->m_is_child_at_offset = true; 2182979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 2183979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 2184979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 2185979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2186e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or -> 2187e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has 2188e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown 2189e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means 2190e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off 2191e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char* 2192e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression) 2193e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2194e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!expression || !expression[0]) 2195e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 2196e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '.') 2197e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+1; 2198e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '-' && expression[1] == '>') 2199e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+2; 2200e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 2201e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2202e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 22035c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2204e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create) 2205e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2206e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synthetic_child_sp; 2207e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ConstString name_const_string(expression); 2208e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Check if we have already created a synthetic array member in this 2209e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // valid object. If we have we will re-use it. 2210e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetSyntheticChild (name_const_string); 2211e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!synthetic_child_sp) 2212e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 2213e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // We haven't made a synthetic array member for expression yet, so 2214e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // lets make one and cache it for any future reference. 2215b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata synthetic_child_sp = GetValueForExpressionPath(expression, 2216b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata NULL, NULL, NULL, 2217b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata GetValueForExpressionPathOptions().DontAllowSyntheticChildren()); 2218e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2219e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Cache the value if we got one back... 2220e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (synthetic_child_sp.get()) 2221e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 222232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata // FIXME: this causes a "real" child to end up with its name changed to the contents of expression 2223e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata AddSyntheticChild(name_const_string, synthetic_child_sp.get()); 2224979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression))); 2225e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 2226e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 2227e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return synthetic_child_sp; 2228e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2229e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2230e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid 2231cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::CalculateSyntheticValue (bool use_synthetic) 2232e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2233cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (use_synthetic == false) 2234e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 2235e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2236dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata TargetSP target_sp(GetTargetSP()); 2237dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata if (target_sp && (target_sp->GetEnableSyntheticValue() == false || target_sp->GetSuppressSyntheticValue() == true)) 2238dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata { 2239dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata m_synthetic_value = NULL; 2240dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata return; 2241dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata } 2242dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata 22433d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp); 22443d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata 2245f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!UpdateFormatsIfNeeded() && m_synthetic_value) 2246cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return; 2247e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 22483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_synthetic_children_sp.get() == NULL) 2249e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 2250e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 22513d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata if (current_synth_sp == m_synthetic_children_sp && m_synthetic_value) 22523d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata return; 22533d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata 2254cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp); 2255e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2256e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2257e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid 22585c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObject::CalculateDynamicValue (DynamicValueType use_dynamic) 2259642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 22605c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if (use_dynamic == eNoDynamicValues) 226110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return; 226210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 226347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (!m_dynamic_value && !IsDynamic()) 2264e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 2265b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 2266b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 22676b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (process && process->IsPossibleDynamicValue(*this)) 22683d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata { 22693d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata ClearDynamicTypeInformation (); 22706b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 22713d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata } 2272e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 2273e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham} 2274e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 227547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 227610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic) 2277e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{ 22785c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if (use_dynamic == eNoDynamicValues) 227910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return ValueObjectSP(); 228010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 228110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (!IsDynamic() && m_dynamic_value == NULL) 2282e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 228310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham CalculateDynamicValue(use_dynamic); 2284e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 228547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_dynamic_value) 228647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_dynamic_value->GetSP(); 228747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 228847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 2289642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 229066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 22911b42575189379cb0c1441f74a48127e9ab7335e3Jim InghamValueObjectSP 22921b42575189379cb0c1441f74a48127e9ab7335e3Jim InghamValueObject::GetStaticValue() 22931b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham{ 22941b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham return GetSP(); 22951b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham} 22961b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham 22974758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granatalldb::ValueObjectSP 22984758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico GranataValueObject::GetNonSyntheticValue () 22994758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata{ 23004758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata return GetSP(); 23014758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata} 23024758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata 2303e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP 2304cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::GetSyntheticValue (bool use_synthetic) 2305e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2306cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (use_synthetic == false) 2307cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2308cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 2309e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata CalculateSyntheticValue(use_synthetic); 2310e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2311e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_synthetic_value) 2312e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return m_synthetic_value->GetSP(); 2313e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata else 2314cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2315e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2316e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 231700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 2318f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico GranataValueObject::HasSyntheticValue() 2319f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata{ 2320f509c5ec066599a3399fced39ea36996184939e8Enrico Granata UpdateFormatsIfNeeded(); 2321f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 23223069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_synthetic_children_sp.get() == NULL) 2323f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 2324f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2325cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata CalculateSyntheticValue(true); 2326f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2327f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (m_synthetic_value) 2328f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return true; 2329f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2330f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 2331f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata} 2332f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2333f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granatabool 233400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 233500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 233600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 233700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 2338e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s); 233900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t clang_type = GetClangType(); 234000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 234100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name); 234200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 234300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 234400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 234500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 234600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 234700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 234800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 234900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 235000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 235100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 235200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 235300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 235400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 235500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 235600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 2357e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()) 235800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 2359e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()->IsBaseClass()) 2360e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent()->GetNonBaseClassParent(); 236100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 2362e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent(); 236300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 236400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 236500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 236666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 236766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 23681391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 2369bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 237000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 237100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 2372cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers) 23731c61743af946076e988d88baf725382e99d905deEnrico Granata { 23741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely 23751391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName. 23761391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // the eHonorPointers mode is meant to produce strings in this latter format 23771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("*("); 23781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 237900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 23801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ValueObject* parent = GetParent(); 23811391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 23821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (parent) 23831391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat); 2384886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 2385886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // if we are a deref_of_parent just because we are synthetic array 2386886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // members made up to allow ptr[%d] syntax to work in variable 2387886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // printing, then add our name ([%d]) to the expression path 2388cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_is_array_item_for_pointer && epformat == eGetExpressionPathFormatHonorPointers) 2389886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(m_name.AsCString()); 23901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 239100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 239200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 239300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 2394bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 239500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 239600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 2397bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 239800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 239900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 240000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 240100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL); 240200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 2403cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (parent && parent->IsDereferenceOfParent() && epformat == eGetExpressionPathFormatHonorPointers) 240400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 240500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 240600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 24071391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 24081391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 24091391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer) 24101391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 24111391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("->"); 24121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 24131391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) && 24141391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray)) 24151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 24161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutChar('.'); 24171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 241800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 241900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 2420bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 242100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 242200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 242300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 2424bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 242500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 242600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 242700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 242800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 242900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 243000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 2431bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2432bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2433bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2434bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2435cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers) 24361c61743af946076e988d88baf725382e99d905deEnrico Granata { 243700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 24381391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 2439bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 2440bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 24415c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2442ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression, 2443ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 2444ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 2445ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_value_type, 2446ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 2447ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* final_task_on_target) 2448ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 2449ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2450ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* dummy_first_unparsed; 245132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ExpressionPathScanEndReason dummy_reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnknown; 245232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ExpressionPathEndResultType dummy_final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2453cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2454ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2455ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 2456ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 2457ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 2458ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 2459ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 2460ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 2461ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2462cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing) 2463ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; 2464de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata 2465cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (ret_val.get() && ((final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain)) // I can only deref and takeaddress of plain objects 2466ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2467cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ( (final_task_on_target ? *final_task_on_target : dummy_final_task_on_target) == ValueObject::eExpressionPathAftermathDereference) 2468ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2469ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2470ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 2471ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 2472ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2473de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (reason_to_stop) 2474cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 2475de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_value_type) 2476cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2477ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2478ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2479ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2480ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2481de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_task_on_target) 2482cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2483ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 2484ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2485ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2486cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress) 2487ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2488ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2489ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 2490ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 2491ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2492de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (reason_to_stop) 2493cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed; 2494de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_value_type) 2495cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2496ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2497ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2498ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2499ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2500de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_task_on_target) 2501cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2502ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 2503ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2504ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2505ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2506ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; // final_task_on_target will still have its original value, so you know I did not do it 2507ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 2508ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 25091a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 25101a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression, 25115c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectListSP& list, 25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 25131a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_value_type, 25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* final_task_on_target) 25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 25181a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* dummy_first_unparsed; 25191a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 25201a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType dummy_final_value_type; 2521cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 25221a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25231a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 25241a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 25251a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 25261a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 25271a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 25281a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 25291a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25301a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!ret_val.get()) // if there are errors, I add nothing to the list 25311a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25321a102087f54079c25c8827afac6153a44ca535daEnrico Granata 253380731ec9368b8e1cbfe093fb9ec257457ef29133Enrico Granata if ( (reason_to_stop ? *reason_to_stop : dummy_reason_to_stop) != eExpressionPathScanEndReasonArrayRangeOperatorMet) 25341a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25351a102087f54079c25c8827afac6153a44ca535daEnrico Granata // I need not expand a range, just post-process the final value and return 2536cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing) 25371a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25381a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 25391a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25401a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 254180731ec9368b8e1cbfe093fb9ec257457ef29133Enrico Granata if (ret_val.get() && (final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain) // I can only deref and takeaddress of plain objects 25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2543cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathDereference) 25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25451a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 25461a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 25471a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 25481a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25494a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (reason_to_stop) 25504a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 25514a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (final_value_type) 25524a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 25531a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25541a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25551a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25561a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2557cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 25581a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 25591a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25601a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25611a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 2562cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress) 25631a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25641a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 25651a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 25661a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 25671a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25684a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (reason_to_stop) 25694a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed; 25704a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (final_value_type) 25714a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 25721a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25731a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25741a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25751a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2576cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 25771a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 25781a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25791a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25811a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25821a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25831a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25841a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25851a102087f54079c25c8827afac6153a44ca535daEnrico Granata return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed, 25861a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 25871a102087f54079c25c8827afac6153a44ca535daEnrico Granata ret_val, 25881a102087f54079c25c8827afac6153a44ca535daEnrico Granata list, 25891a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 25901a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 25911a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 25921a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 25931a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25941a102087f54079c25c8827afac6153a44ca535daEnrico Granata // in any non-covered case, just do the obviously right thing 25951a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 25961a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25971a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 25981a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25995c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2600ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr, 2601ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 2602ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 2603ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_result, 2604ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 2605ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* what_next) 2606ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 2607ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP root = GetSP(); 2608ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2609ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2610ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2611ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2612ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2613ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2614ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata while (true) 2615ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2616ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2617ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 2618ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 26195c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t root_clang_type = root->GetClangType(); 26205c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t pointee_clang_type; 26211a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 26221a102087f54079c25c8827afac6153a44ca535daEnrico Granata 26231a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 26241a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 26251a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 2626ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2627ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!expression_cstr || *expression_cstr == '\0') 2628ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2629cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2630ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2631ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2632ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2633ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata switch (*expression_cstr) 2634ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2635ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '-': 2636ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2637ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && 26381a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error 2639ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2640ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2641cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot; 2642cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2643ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2644ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 26451a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) && // if yo are trying to extract an ObjC IVar when this is forbidden 26461a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && 2647ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options.m_no_fragile_ivar) 2648ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2649ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2650cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed; 2651cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2652ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2653ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2654ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (expression_cstr[1] != '>') 2655ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2656ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2657cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2658cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2659ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2660ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2661ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip the - 2662ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2663ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '.': // or fallthrough from -> 2664ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2665ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' && 26661a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error 2667ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2668ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2669cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow; 2670cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2671ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2672ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2673ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip . 2674ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *next_separator = strpbrk(expression_cstr+1,"-.["); 2675ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString child_name; 2676ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!next_separator) // if no other separator just expand this last layer 2677ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2678ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCString (expression_cstr); 26799c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); 26809c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 26819c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if (child_valobj_sp.get()) // we know we are done, so just return 2682ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2683b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea *first_unparsed = ""; 2684cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2685cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 26869c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata return child_valobj_sp; 26879c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 26889c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else if (options.m_no_synthetic_children == false) // let's try with synthetic children 26899c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2690cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->IsSynthetic()) 2691b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata { 2692b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *first_unparsed = expression_cstr; 2693b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2694b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2695b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata return ValueObjectSP(); 2696b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata } 2697b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata 2698b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata child_valobj_sp = root->GetSyntheticValue(); 2699cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (child_valobj_sp.get()) 2700cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true); 27019c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 27029c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 27039c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP, 27049c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // so we hit the "else" branch, and return an error 27059c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if(child_valobj_sp.get()) // if it worked, just return 27069c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2707b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea *first_unparsed = ""; 2708cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2709cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 27109c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata return child_valobj_sp; 2711ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2712ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2713ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2714ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2715cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2716cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2717ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2718ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2719ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2720ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // other layers do expand 2721ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2722ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr); 27239c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); 27249c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if (child_valobj_sp.get()) // store the new root and move on 27259c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 27269c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata root = child_valobj_sp; 27279c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata *first_unparsed = next_separator; 2728cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 27299c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata continue; 27309c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 27319c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else if (options.m_no_synthetic_children == false) // let's try with synthetic children 27329c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2733b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata if (root->IsSynthetic()) 2734b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata { 2735b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *first_unparsed = expression_cstr; 2736b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2737b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2738b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata return ValueObjectSP(); 2739b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata } 2740b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata 2741cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = root->GetSyntheticValue(true); 2742cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (child_valobj_sp) 2743cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true); 27449c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 27459c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 27469c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP, 27479c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // so we hit the "else" branch, and return an error 27489c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if(child_valobj_sp.get()) // if it worked, move on 2749ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 27509c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata root = child_valobj_sp; 2751ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = next_separator; 2752cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 2753ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2754ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2755ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2756ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2757ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2758cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2759cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2760ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2761ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2762ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2763ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2764ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2765ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '[': 2766ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 27671a102087f54079c25c8827afac6153a44ca535daEnrico 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* 2768ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2769f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar... 2770ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2771f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (options.m_no_synthetic_children) // ...only chance left is synthetic 2772f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2773f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2774cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; 2775cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2776f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2777f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2778ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2779ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 2780ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2781ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2782cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; 2783cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2784ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2785ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2786ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2787ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 2788ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 27891a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2790ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2791ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2792cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 2793cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2794ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2795ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2796ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // even if something follows, we cannot expand unbounded ranges, just let the caller do it 2797ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2798ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2799cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 2800cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange; 2801ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2802ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2803ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2804ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 2805ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 2806ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 2807ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2808ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2809cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2810cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2811ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2812ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2813ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 2814ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2815ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2816ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 2817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2818ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2819ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2820cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2821cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2822ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2823ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2824ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 2825ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 28261a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2827ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2828ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2829cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 2830cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange; 2831ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2832ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2833ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2834ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2835ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2836cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 2837cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2838ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2839ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2840ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata // from here on we do have a valid index 28421a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2843ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 284424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true); 284524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!child_valobj_sp) 284624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true); 2847f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!child_valobj_sp) 2848cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->HasSyntheticValue() && root->GetSyntheticValue()->GetNumChildren() > index) 2849cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = root->GetSyntheticValue()->GetChildAtIndex(index, true); 285024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (child_valobj_sp) 285124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 285224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton root = child_valobj_sp; 285324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *first_unparsed = end+1; // skip ] 2854cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 285524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton continue; 285624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 285724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton else 2858ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2859ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2860cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2861cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2862ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2863ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2864ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 28651a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 2866ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2867cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*what_next == ValueObject::eExpressionPathAftermathDereference && // 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 28681a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2869ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2870ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2871ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2872ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2873ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2874ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2875cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 2876cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2877ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2878ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2879ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2880ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2881cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = eExpressionPathAftermathNothing; 2882ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2883ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2884ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2885ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2886ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2887f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (ClangASTType::GetMinimumLanguage(root->GetClangAST(), 2888dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton root->GetClangType()) == eLanguageTypeObjC 2889dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && ClangASTContext::IsPointerType(ClangASTType::GetPointeeType(root->GetClangType())) == false 2890dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && root->HasSyntheticValue() 2891dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && options.m_no_synthetic_children == false) 2892f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2893cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetSyntheticValue()->GetChildAtIndex(index, true); 2894f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2895f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2896f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 2897ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2898ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2899ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2900cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2901cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2902ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2903ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2904ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2905ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2906ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2907cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 2908ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2909ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2910ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2911ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2912f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else if (ClangASTContext::IsScalarType(root_clang_type)) 2913ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2914ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 2915ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2916ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2917ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2918cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2919cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2920ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2921ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2922ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 2923ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2924ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2925cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet; 2926cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; 2927ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2928ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2929ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2930cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (options.m_no_synthetic_children == false) 2931f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2932cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->HasSyntheticValue()) 2933cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetSyntheticValue(); 2934cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (!root->IsSynthetic()) 2935cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 2936cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *first_unparsed = expression_cstr; 2937cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; 2938cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2939cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2940cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 2941cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // if we are here, then root itself is a synthetic VO.. should be good to go 2942cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 2943cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!root.get()) 2944cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 2945cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *first_unparsed = expression_cstr; 2946cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; 2947cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2948cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2949cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 2950cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetChildAtIndex(index, true); 2951f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!root.get()) 2952f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2953f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2954cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2955cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2956f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2957f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 29589c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else 29599c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 29609c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata *first_unparsed = end+1; // skip ] 2961cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 29629c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata continue; 29639c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 2964f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2965f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2966f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2967f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2968cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2969cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2970f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2971f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we have a low and a high index 2974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 2977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 2978ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2980cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2981cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 2985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2988cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2989cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (index_lower > index_higher) // swap indices if required 2993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long temp = index_lower; 2995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_lower = index_higher; 2996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_higher = temp; 2997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 29981a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 2999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 3001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 3002ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 3004cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3005cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 3006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 3007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 3009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 3011cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet; 3012cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; 3013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 3014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 30161a102087f54079c25c8827afac6153a44ca535daEnrico 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 3017cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next == ValueObject::eExpressionPathAftermathDereference && 30181a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 3019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 3021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 3022ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 3023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3024ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 3025cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3026cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 3027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 3028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 3030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3031cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = ValueObject::eExpressionPathAftermathNothing; 3032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 3033ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3034ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 3036ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 3038cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 3039cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange; 3040ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 3041ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3042ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3043ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 3044ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3045ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata default: // some non-separator is in the way 3046ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3047ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 3048cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3049cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 3050ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 3051ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 3052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3054ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 3056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 30571a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 30581a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr, 30591a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 30605c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP root, 30615c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectListSP& list, 30621a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 30631a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_result, 30641a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 30651a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* what_next) 30661a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 30671a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 30681a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30691a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30701a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 30711a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30721a102087f54079c25c8827afac6153a44ca535daEnrico Granata while (true) 30731a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30741a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30751a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 30761a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30775c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t root_clang_type = root->GetClangType(); 30785c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t pointee_clang_type; 30791a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 30801a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30811a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 30821a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 30831a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 30841a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30851a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!expression_cstr || *expression_cstr == '\0') 30861a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3087cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 30881a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 30891a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 30901a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30911a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30921a102087f54079c25c8827afac6153a44ca535daEnrico Granata switch (*expression_cstr) 30931a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30941a102087f54079c25c8827afac6153a44ca535daEnrico Granata case '[': 30951a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30961a102087f54079c25c8827afac6153a44ca535daEnrico 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* 30971a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30981a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 30991a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31001a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3101cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; 3102cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31031a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31041a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31051a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 31061a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31071a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3108cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; 3109cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31101a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31111a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31121a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31131a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 31141a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31151a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 31161a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31171a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3118cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 3119cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31201a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31211a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31221a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // expand this into list 31231a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 312436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_index = root->GetNumChildren() - 1; 312536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t index = 0; index < max_index; index++) 31261a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31271a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 31281a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 31291a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 31301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31311a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 3132cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3133cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31341a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 31351a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31361a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31371a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 31381a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 31391a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 31401a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31411a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3142cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3143cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31441a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31451a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31461a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 31471a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31481a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 31491a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 31501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 31511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31521a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3153cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3154cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31551a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31561a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31571a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 31581a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31591a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 31601a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 316136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_index = root->GetNumChildren() - 1; 316236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t index = 0; index < max_index; index++) 31631a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31641a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 31651a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 31661a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 31671a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31681a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 3169cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3170cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31711a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 31721a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31731a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31741a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31751a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3176cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 3177cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31781a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31791a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31811a102087f54079c25c8827afac6153a44ca535daEnrico Granata // from here on we do have a valid index 31821a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 31831a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31841a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetChildAtIndex(index, true); 31851a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 31861a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31871a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3188cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3189cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31901a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31911a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31921a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31931a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31941a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 31951a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3196cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3197cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31981a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 31991a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32001a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32011a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 32021a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3203cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*what_next == ValueObject::eExpressionPathAftermathDereference && // 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 32041a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 32051a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32061a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 32071a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 32081a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 32091a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32101a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3211cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3212cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32131a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32141a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32151a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32161a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3217cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = eExpressionPathAftermathNothing; 32181a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 32191a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32201a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32211a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32221a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32231a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 32241a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 32251a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32261a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3227cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3228cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32291a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32311a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32321a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32331a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 32341a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3235cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3236cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 32371a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 32381a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32391a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32401a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32411a102087f54079c25c8827afac6153a44ca535daEnrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 32421a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32431a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 32441a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 32451a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32461a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3247cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3248cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32491a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32501a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32511a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 32521a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32531a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 32541a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3255cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3256cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 32571a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 32581a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32591a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32601a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32611a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we have a low and a high index 32621a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32631a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 32641a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 32651a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 32661a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32671a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3268cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3269cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32701a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32711a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32721a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 32731a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 32741a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32751a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3276cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3277cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32781a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32791a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32801a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (index_lower > index_higher) // swap indices if required 32811a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32821a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long temp = index_lower; 32831a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_lower = index_higher; 32841a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_higher = temp; 32851a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32861a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 32871a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32881a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 32891a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 32901a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32911a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3292cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3293cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32941a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32951a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32961a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32971a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32981a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 32991a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3300cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3301cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 33021a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 33031a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33041a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33051a102087f54079c25c8827afac6153a44ca535daEnrico 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 3306cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next == ValueObject::eExpressionPathAftermathDereference && 33071a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 33081a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33091a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 33101a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 33111a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 33121a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33131a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3314cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3315cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 33161a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 33171a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33181a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 33191a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3320cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = ValueObject::eExpressionPathAftermathNothing; 33211a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 33221a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33231a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33241a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 33251a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33262bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (unsigned long index = index_lower; 33271a102087f54079c25c8827afac6153a44ca535daEnrico Granata index <= index_higher; index++) 33281a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33291a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 33301a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 33311a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 33321a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33331a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; 3334cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3335cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 33361a102087f54079c25c8827afac6153a44ca535daEnrico Granata return index_higher-index_lower+1; // tell me number of items I added to the VOList 33371a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33381a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33391a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 33401a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33411a102087f54079c25c8827afac6153a44ca535daEnrico Granata default: // some non-[ separator, or something entirely wrong, is in the way 33421a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33431a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3344cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3345cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 33461a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 33471a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 33481a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33491a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33501a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33511a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 33521a102087f54079c25c8827afac6153a44ca535daEnrico Granata 33533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatastatic void 33543069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataDumpValueObject_Impl (Stream &s, 33553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj, 33563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const ValueObject::DumpValueObjectOptions& options, 33573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata uint32_t ptr_depth, 33583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata uint32_t curr_depth) 335966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 336082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (valobj) 336166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3362f509c5ec066599a3399fced39ea36996184939e8Enrico Granata bool update_success = valobj->UpdateValueIfNeeded (true); 336382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 33643069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const char *root_valobj_name = 33653069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_root_valobj_name.empty() ? 33663069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetName().AsCString() : 33673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_root_valobj_name.c_str(); 33683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 33693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (update_success && options.m_use_dynamic != eNoDynamicValues) 3370e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 33713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *dynamic_value = valobj->GetDynamicValue(options.m_use_dynamic).get(); 3372e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (dynamic_value) 3373e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham valobj = dynamic_value; 3374e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 3375e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3376bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 3377bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3378f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 3379bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 3380f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 3381f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 3382bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 33833069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const bool print_valobj = options.m_flat_output == false || has_value; 3384bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3385bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 338666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 33873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_show_location) 3388bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3389fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham s.Printf("%s: ", valobj->GetLocationAsCString()); 3390bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 339166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3392bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 339312213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata 339412213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata bool show_type = true; 339512213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata // if we are at the root-level and been asked to hide the root's type, then hide it 339612213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata if (curr_depth == 0 && options.m_hide_root_type) 339712213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata show_type = false; 339812213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata else 339912213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata // otherwise decide according to the usual rules (asked to show types - always at the root level) 340012213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata show_type = options.m_show_types || (curr_depth == 0 && !options.m_flat_output); 340112213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata 340212213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata if (show_type) 34031a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata s.Printf("(%s) ", valobj->GetQualifiedTypeName().AsCString("<invalid type>")); 340466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 34053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_flat_output) 3406bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3407b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 34083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const bool qualify_cxx_base_classes = options.m_show_types; 34094ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata if (!options.m_hide_name) 34104ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata { 34114ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata valobj->GetExpressionPath(s, qualify_cxx_base_classes); 34124ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.PutCString(" ="); 34134ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata } 3414bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 34154ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata else if (!options.m_hide_name) 3416bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3417bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 3418bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 3419bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3420bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34213069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!options.m_scope_already_checked && !valobj->IsInScope()) 3422bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 342382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton err_cstr = "out of scope"; 3424bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 342566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 342666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 34273069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string summary_str; 3428ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton std::string value_str; 3429bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 34301391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char *sum_cstr = NULL; 34313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata TypeSummaryImpl* entry = options.m_summary_sp ? options.m_summary_sp.get() : valobj->GetSummaryFormat().get(); 3432bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_omit_summary_depth > 0) 34347f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata entry = NULL; 34357f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata 34363ce94041919b44e247c134663281acf3f696b094Enrico Granata bool is_nil = valobj->IsObjCNil(); 34373ce94041919b44e247c134663281acf3f696b094Enrico Granata 3438bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 3439bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34403069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_format != eFormatDefault && options.m_format != valobj->GetFormat()) 3441ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton { 34423069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetValueAsCString(options.m_format, 34433069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata value_str); 3444ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton } 34453069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 3446ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton { 34473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata val_cstr = valobj->GetValueAsCString(); 34483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (val_cstr) 34493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata value_str = val_cstr; 3450ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton } 3451bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 3452bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 345366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 345466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 345566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 345682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton s.Printf (" <%s>\n", err_cstr); 345766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 345866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 345966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3460f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 3461bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3462bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34633ce94041919b44e247c134663281acf3f696b094Enrico Granata if (is_nil) 34643ce94041919b44e247c134663281acf3f696b094Enrico Granata sum_cstr = "nil"; 34653ce94041919b44e247c134663281acf3f696b094Enrico Granata else if (options.m_omit_summary_depth == 0) 34663069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 34673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_summary_sp) 34683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 34693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetSummaryAsCString(entry, summary_str); 34703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata sum_cstr = summary_str.c_str(); 34713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 34723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 34733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata sum_cstr = valobj->GetSummaryAsCString(); 34743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 347566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3476ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton // Make sure we have a value and make sure the summary didn't 34773ce94041919b44e247c134663281acf3f696b094Enrico Granata // specify that the value should not be printed - and do not print 34783ce94041919b44e247c134663281acf3f696b094Enrico Granata // the value if this thing is nil 34790c074cb9aa11e9da82058f4412281ddac706226fEnrico Granata // (but show the value if the user passes a format explicitly) 34800c074cb9aa11e9da82058f4412281ddac706226fEnrico Granata if (!is_nil && !value_str.empty() && (entry == NULL || (entry->DoesPrintValue() || options.m_format != eFormatDefault) || sum_cstr == NULL) && !options.m_hide_value) 3481ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton s.Printf(" %s", value_str.c_str()); 348266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 348390d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (sum_cstr) 34843069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata s.Printf(" %s", sum_cstr); 3485bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34863ce94041919b44e247c134663281acf3f696b094Enrico Granata // let's avoid the overly verbose no description error for a nil thing 34873ce94041919b44e247c134663281acf3f696b094Enrico Granata if (options.m_use_objc && !is_nil) 3488bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34894ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata if (!options.m_hide_value || !options.m_hide_name) 34904ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf(" "); 3491fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const char *object_desc = valobj->GetObjectDescription(); 3492bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 34934ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf("%s\n", object_desc); 3494bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 34954ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf ("[no Objective-C description available]\n"); 3496bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 3497886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 349866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 349966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 35003069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (curr_depth < options.m_max_depth) 350166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3502f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 3503f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 3504f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 3505f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 3506f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 3507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 3509f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 3510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 3511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 3513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 3514f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3515f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 3516f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 3517b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType ptr_address_type; 3518915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (valobj->GetPointerValue (&ptr_address_type) == 0) 3519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 3520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 3522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 3524f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 3525f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 3526f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 3527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 3528f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 3529f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3530f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 3531f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 3532f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 353366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3534886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr)) 353566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3536cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject* synth_valobj; 3537cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP synth_valobj_sp = valobj->GetSyntheticValue (options.m_use_synthetic); 3538cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata synth_valobj = (synth_valobj_sp ? synth_valobj_sp.get() : valobj); 3539dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata 354036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_children = synth_valobj->GetNumChildren(); 3541018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata bool print_dotdotdot = false; 3542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 354366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 35443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_flat_output) 354566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 3548bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 35523f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 3553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 3554bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3555018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 355636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_num_children = valobj->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 3557018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 35583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (num_children > max_num_children && !options.m_ignore_cap) 3559018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 3560018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata num_children = max_num_children; 3561018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata print_dotdotdot = true; 3562018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 3563bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 35643069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject::DumpValueObjectOptions child_options(options); 35654f5b299c1f5daf4cce9aad01471a6b558e5b13d2Enrico Granata child_options.SetFormat(options.m_format).SetSummary().SetRootValueObjectName(); 35664ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata child_options.SetScopeChecked(true).SetHideName(options.m_hide_name).SetHideValue(options.m_hide_value) 35673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata .SetOmitSummaryDepth(child_options.m_omit_summary_depth > 1 ? child_options.m_omit_summary_depth - 1 : 0); 356836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx=0; idx<num_children; ++idx) 3569bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3570f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObjectSP child_sp(synth_valobj->GetChildAtIndex(idx, true)); 3571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 3572bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 35733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl (s, 35743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata child_sp.get(), 35753069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata child_options, 35763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 35773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata curr_depth + 1); 3578bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3579bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3580bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 35813069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!options.m_flat_output) 3582bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3583018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (print_dotdotdot) 3584db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata { 3585b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (valobj->GetExecutionContextRef()); 3586b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target *target = exe_ctx.GetTargetPtr(); 3587b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target) 3588b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton target->GetDebugger().GetCommandInterpreter().ChildrenTruncated(); 3589018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.Indent("...\n"); 3590db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata } 3591bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 3592bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 359366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 359466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 3595bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 3596bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3597bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 3598bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3599f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 3600bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3601bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3602bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3603bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3604bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 3605bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3606bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 360766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 3608bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3609bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 361066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 361166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 361266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 361366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 361466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3615bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 361666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3617bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 361866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 361966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 362066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 362166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 362266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 362366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 36243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatavoid 36252aaf59d0bae48c120b0b04028c2a6d125777a708Greg ClaytonValueObject::LogValueObject (Log *log, 36262aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject *valobj) 36272aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton{ 36282aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (log && valobj) 36292aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton return LogValueObject (log, valobj, DumpValueObjectOptions::DefaultOptions()); 36302aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton} 36312aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton 36322aaf59d0bae48c120b0b04028c2a6d125777a708Greg Claytonvoid 36332aaf59d0bae48c120b0b04028c2a6d125777a708Greg ClaytonValueObject::LogValueObject (Log *log, 36342aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject *valobj, 36352aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton const DumpValueObjectOptions& options) 36362aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton{ 36372aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (log && valobj) 36382aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton { 36392aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton StreamString s; 36402aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject::DumpValueObject (s, valobj, options); 36412aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (s.GetSize()) 36422aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton log->PutCString(s.GetData()); 36432aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton } 36442aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton} 36452aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton 36462aaf59d0bae48c120b0b04028c2a6d125777a708Greg Claytonvoid 36473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::DumpValueObject (Stream &s, 36483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj) 36493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 36503069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 36513069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!valobj) 36523069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return; 36533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 36543069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl(s, 36553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj, 36563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObjectOptions::DefaultOptions(), 36573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 36583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0); 36593069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 36603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 36613069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatavoid 36623069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::DumpValueObject (Stream &s, 36633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj, 36643069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const DumpValueObjectOptions& options) 36653069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 36663069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl(s, 36673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj, 36683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options, 36693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_max_ptr_depth, // max pointer depth allowed, we will go down from here 36703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0 // current object depth is 0 since we are just starting 36713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ); 36723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 3673427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3674427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 3675fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name) 3676427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3677427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 3678427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3679afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false) && m_error.Success()) 3680427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3681b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3682b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton clang::ASTContext *ast = GetClangAST (); 3683b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 3684b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton DataExtractor data; 3685b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetByteOrder (m_data.GetByteOrder()); 3686b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetAddressByteSize(m_data.GetAddressByteSize()); 3687b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 36884d609c92183905881daf1a601474a20e6949cc9aEnrico Granata if (IsBitfield()) 36894d609c92183905881daf1a601474a20e6949cc9aEnrico Granata { 36904d609c92183905881daf1a601474a20e6949cc9aEnrico Granata Value v(Scalar(GetValueAsUnsigned(UINT64_MAX))); 36914d609c92183905881daf1a601474a20e6949cc9aEnrico Granata m_error = v.GetValueAsData (&exe_ctx, ast, data, 0, GetModule().get()); 36924d609c92183905881daf1a601474a20e6949cc9aEnrico Granata } 36934d609c92183905881daf1a601474a20e6949cc9aEnrico Granata else 36944d609c92183905881daf1a601474a20e6949cc9aEnrico Granata m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule().get()); 3695b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 3696b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 3697b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ast, 3698b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetClangType(), 3699b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton name, 3700b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data, 3701b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetAddressOf()); 3702427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3703fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3704fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!valobj_sp) 3705427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 370647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (NULL, m_error); 3707427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3708427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 3709427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3710427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 37115c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 3712bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 3713427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 371447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 371547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 3716e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3717c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 3718c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 3719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3720427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 372124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = false; 3722427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3723427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 3724427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 3725427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 3726427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 3727427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 3728427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 372900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 3730427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 3731427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 3732427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 3733427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 373458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 3735b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 373658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 373758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 373858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham clang_ast, 3739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 3740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 3741427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 3742427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 3743427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 374424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 3745427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 3746427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 3747427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 3748427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 3749427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 375000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 375100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 3752a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 3753427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3754427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 3755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 3756427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 3757427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 375847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj = new ValueObjectChild (*this, 375947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham clang_ast, 376047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_clang_type, 376147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_name, 376247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_size, 376347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_offset, 376447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_size, 376547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_offset, 376647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_base_class, 3767915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata child_is_deref_of_parent, 3768915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 3769427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3770427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3771c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 377247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 3773c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3774c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 377547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 3776c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3777427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 3778427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3779c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 3780b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 3781c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3782c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 3783c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 3784c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 3785c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 378647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 3787427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3788427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3789427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 37905c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 3791c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 3792427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3793e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_addr_of_valobj_sp) 3794e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3795e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3796b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeInvalid; 3797427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 3798915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t addr = GetAddressOf (scalar_is_load_address, &address_type); 3799c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 3800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 3801427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3802427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 3803427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3804427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 3805c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3806c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 3807b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 3808c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 3809c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3810427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3811c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3812427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 3813427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 3814427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 3815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 3817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 3818427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 3819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 3821427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 3822b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3823b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_addr_of_valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 382447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 382547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ClangASTContext::CreatePointerType (ast, clang_type), 382647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ConstString (name.c_str()), 382747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham addr, 382847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeInvalid, 382947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_data.GetAddressByteSize()); 3830427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3831427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3832427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3833427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3834427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3835e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3836427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3837427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 38384e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg ClaytonValueObjectSP 38394e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg ClaytonValueObject::Cast (const ClangASTType &clang_ast_type) 38404e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg Clayton{ 38410a19a1b9c25117854f226256805239d95153ed2dGreg Clayton return ValueObjectCast::Create (*this, GetName(), clang_ast_type); 38424e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg Clayton} 38430039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38445c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 38450039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type) 38460039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 38475c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP valobj_sp; 38480039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 3849915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t ptr_value = GetPointerValue (&address_type); 38500039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38510039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 38520039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 38533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address ptr_addr (ptr_value); 3854b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3855b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(), 38560039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 38570039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 38580039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton clang_ast_type); 38590039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 38600039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 38610039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 38620039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38635c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 38640039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp) 38650039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 38665c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP valobj_sp; 38670039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 3868915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t ptr_value = GetPointerValue (&address_type); 38690039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38700039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 38710039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 38723508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address ptr_addr (ptr_value); 3873b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3874b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(), 38750039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 38760039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 38770039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton type_sp); 38780039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 38790039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 38800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 38810039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 3882fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () : 3883b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3884b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(), 3885b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_needs_update (true), 3886b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3887fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3888fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3889fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3890fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected): 3891b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3892b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(), 3893fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update (true), 3894b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3895fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3896b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(exe_scope); 3897b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton TargetSP target_sp (exe_ctx.GetTargetSP()); 3898b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target_sp) 3899fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3900b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetTargetSP (target_sp); 3901b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessSP process_sp (exe_ctx.GetProcessSP()); 3902b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!process_sp) 3903b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton process_sp = target_sp->GetProcessSP(); 3904fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3905b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process_sp) 3906fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3907b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id = process_sp->GetModID(); 3908b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetProcessSP (process_sp); 390921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 3910b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 3911fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3912b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!thread_sp) 3913fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3914fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3915b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 3916fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3917fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3918b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (thread_sp) 3919fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3920b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetThreadSP(thread_sp); 3921567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3922b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrameSP frame_sp (exe_ctx.GetFrameSP()); 3923b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!frame_sp) 3924fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3925fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3926b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton frame_sp = thread_sp->GetSelectedFrame(); 3927fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3928b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (frame_sp) 3929b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetFrameSP(frame_sp); 3930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3931fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3932fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3933fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3934fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3935fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) : 3936b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3937b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(rhs.m_exe_ctx_ref), 3938b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_needs_update (true), 3939b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3940fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3941fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3942fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3943fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint () 3944fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3945fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3947fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state. If the current 3948fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return 3949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change". If the current state is different, we update our state, and return 3950fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change". If we did see a change, we also set m_needs_update to true, so 3951fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true. 39527c53768e700f9181082072017976472e3ad9cc37Jim Ingham// exe_scope will be set to the current execution context scope. 3953fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3954fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3955b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg ClaytonValueObject::EvaluationPoint::SyncWithProcessState() 3956fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 39571586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 39581586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // Start with the target, if it is NULL, then we're obviously not going to get any further: 3959b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(m_exe_ctx_ref.Lock()); 39601586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3961b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (exe_ctx.GetTargetPtr() == NULL) 39621586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham return false; 39631586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3964fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we don't have a process nothing can change. 3965b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 3966b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process == NULL) 3967fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 39681586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3969fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If our stop id is the current stop ID, nothing has changed: 3970b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessModID current_mod_id = process->GetModID(); 397121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 3972e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // If the current stop id is 0, either we haven't run yet, or the process state has been cleared. 3973e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // In either case, we aren't going to be able to sync with the process state. 397421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (current_mod_id.GetStopID() == 0) 3975e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return false; 39767c53768e700f9181082072017976472e3ad9cc37Jim Ingham 39774a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton bool changed = false; 39784a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton const bool was_valid = m_mod_id.IsValid(); 39794a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (was_valid) 3980c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton { 3981c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_mod_id == current_mod_id) 3982c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton { 39839175f662273509b1260cff1e077a3a398ccc07d5Jim Ingham // Everything is already up to date in this object, no need to 3984c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton // update the execution context scope. 39857c53768e700f9181082072017976472e3ad9cc37Jim Ingham changed = false; 3986c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton } 39877c53768e700f9181082072017976472e3ad9cc37Jim Ingham else 39887c53768e700f9181082072017976472e3ad9cc37Jim Ingham { 39897c53768e700f9181082072017976472e3ad9cc37Jim Ingham m_mod_id = current_mod_id; 39907c53768e700f9181082072017976472e3ad9cc37Jim Ingham m_needs_update = true; 39917c53768e700f9181082072017976472e3ad9cc37Jim Ingham changed = true; 39927c53768e700f9181082072017976472e3ad9cc37Jim Ingham } 3993c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton } 3994fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 39951586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // Now re-look up the thread and frame in case the underlying objects have gone away & been recreated. 39961586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // That way we'll be sure to return a valid exe_scope. 39971586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // If we used to have a thread or a frame but can't find it anymore, then mark ourselves as invalid. 3998fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3999b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (m_exe_ctx_ref.HasThreadRef()) 4000fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 4001b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP()); 4002b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (thread_sp) 4003fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 4004b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (m_exe_ctx_ref.HasFrameRef()) 4005fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 4006b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP()); 4007b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!frame_sp) 4008b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 4009b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton // We used to have a frame, but now it is gone 4010fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetInvalid(); 40114a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton changed = was_valid; 4012b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 4013fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 4014fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 4015b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton else 4016b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 4017b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton // We used to have a thread, but now it is gone 4018b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton SetInvalid(); 40194a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton changed = was_valid; 4020b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 4021b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 4022fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 40237c53768e700f9181082072017976472e3ad9cc37Jim Ingham return changed; 4024fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 4025fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 4026ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid 4027ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated () 4028ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{ 4029b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); 4030b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process_sp) 4031b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id = process_sp->GetModID(); 4032ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_first_update = false; 4033ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_needs_update = false; 4034ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham} 4035ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 4036ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 4037b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//bool 4038b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//ValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope) 4039b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//{ 4040b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (!IsValid()) 4041b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// return false; 4042b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 4043b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// bool needs_update = false; 4044b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 4045b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // The target has to be non-null, and the 4046b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Target *target = exe_scope->CalculateTarget(); 4047b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (target != NULL) 4048b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4049b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Target *old_target = m_target_sp.get(); 4050b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// assert (target == old_target); 4051b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Process *process = exe_scope->CalculateProcess(); 4052b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (process != NULL) 4053b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4054b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // FOR NOW - assume you can't update variable objects across process boundaries. 4055b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Process *old_process = m_process_sp.get(); 4056b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// assert (process == old_process); 4057b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// ProcessModID current_mod_id = process->GetModID(); 4058b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_mod_id != current_mod_id) 4059b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4060b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4061b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_mod_id = current_mod_id; 4062b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4063b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // See if we're switching the thread or stack context. If no thread is given, this is 4064b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // being evaluated in a global context. 4065b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Thread *thread = exe_scope->CalculateThread(); 4066b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (thread != NULL) 4067b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4068b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// user_id_t new_thread_index = thread->GetIndexID(); 4069b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (new_thread_index != m_thread_id) 4070b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4071b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4072b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = new_thread_index; 4073b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4074b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4075b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 4076b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// StackFrame *new_frame = exe_scope->CalculateStackFrame(); 4077b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (new_frame != NULL) 4078b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4079b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (new_frame->GetStackID() != m_stack_id) 4080b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4081b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4082b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id = new_frame->GetStackID(); 4083b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4084b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4085b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4086b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4087b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4088b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4089b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4090b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4091b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4092b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4093b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // If this had been given a thread, and now there is none, we should update. 4094b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // Otherwise we don't have to do anything. 4095b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_thread_id != LLDB_INVALID_UID) 4096b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4097b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = LLDB_INVALID_UID; 4098b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4099b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4100b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4101b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4102b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4103b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4104b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4105b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // If there is no process, then we don't need to update anything. 4106b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // But if we're switching from having a process to not, we should try to update. 4107b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_process_sp.get() != NULL) 4108b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4109b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4110b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_process_sp.reset(); 4111b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = LLDB_INVALID_UID; 4112b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4113b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4114b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4115b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4116b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4117b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4118b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // If there's no target, nothing can change so we don't need to update anything. 4119b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // But if we're switching from having a target to not, we should try to update. 4120b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_target_sp.get() != NULL) 4121b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4122b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4123b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_target_sp.reset(); 4124b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_process_sp.reset(); 4125b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = LLDB_INVALID_UID; 4126b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4127b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4128b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4129b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (!m_needs_update) 4130b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_needs_update = needs_update; 4131b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 4132b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// return needs_update; 4133b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//} 4134f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 4135f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid 4136cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::ClearUserVisibleData(uint32_t clear_mask) 4137f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{ 4138cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsValue) == eClearUserVisibleDataItemsValue) 4139cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_value_str.clear(); 4140cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4141cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsLocation) == eClearUserVisibleDataItemsLocation) 4142cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_location_str.clear(); 4143cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4144cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsSummary) == eClearUserVisibleDataItemsSummary) 4145cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 4146cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_summary_str.clear(); 4147cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 4148cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4149cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsDescription) == eClearUserVisibleDataItemsDescription) 4150cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_object_desc_str.clear(); 4151cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4152cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) == eClearUserVisibleDataItemsSyntheticChildren) 4153cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 4154cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_synthetic_value) 4155cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value = NULL; 4156cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 41572bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen} 4158915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 4159915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataSymbolContextScope * 4160915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetSymbolContextScope() 4161915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 4162915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (m_parent) 4163915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 4164915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (!m_parent->IsPointerOrReferenceType()) 4165915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_parent->GetSymbolContextScope(); 4166915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 4167915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return NULL; 4168915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 4169f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4170f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4171f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromExpression (const char* name, 4172f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* expression, 4173f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx) 4174f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4175f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP retval_sp; 4176f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::TargetSP target_sp(exe_ctx.GetTargetSP()); 4177f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target_sp) 4178f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4179f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!expression || !*expression) 4180f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4181f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target_sp->EvaluateExpression (expression, 4182f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata exe_ctx.GetFrameSP().get(), 4183f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata retval_sp); 4184f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (retval_sp && name && *name) 4185f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata retval_sp->SetName(ConstString(name)); 4186f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4187f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 4188f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4189f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4190f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromAddress (const char* name, 4191f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t address, 4192f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx, 4193f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType type) 4194f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4195f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType pointer_type(type.GetASTContext(),type.GetPointerType()); 4196f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); 4197f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 4198f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata pointer_type.GetASTContext(), 4199f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata pointer_type.GetOpaqueQualType(), 4200f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ConstString(name), 4201f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata buffer, 4202f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::endian::InlHostByteOrder(), 4203f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata exe_ctx.GetAddressByteSize())); 4204f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (ptr_result_valobj_sp) 4205f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 4206f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress); 4207f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Error err; 4208f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err); 4209f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (ptr_result_valobj_sp && name && *name) 4210f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ptr_result_valobj_sp->SetName(ConstString(name)); 4211f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 4212f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return ptr_result_valobj_sp; 4213f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 4214f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4215f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4216f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromData (const char* name, 4217f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata DataExtractor& data, 4218f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx, 4219f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType type) 4220f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4221f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP new_value_sp; 4222f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 4223f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata type.GetASTContext() , 4224f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata type.GetOpaqueQualType(), 4225f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ConstString(name), 4226f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata data, 4227f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata LLDB_INVALID_ADDRESS); 4228f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad); 4229f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (new_value_sp && name && *name) 4230f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp->SetName(ConstString(name)); 4231f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return new_value_sp; 4232f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 42333b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 42343b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataModuleSP 42353b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetModule () 42363b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 42373b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* root(GetRoot()); 42383b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (root != this) 42393b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return root->GetModule(); 42403b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return lldb::ModuleSP(); 42413b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 42423b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 42433b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject* 42443b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetRoot () 42453b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 42463b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (m_root) 42473b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return m_root; 42483b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* parent = m_parent; 42493b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (!parent) 42503b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return (m_root = this); 42513b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata while (parent->m_parent) 42523b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 42533b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (parent->m_root) 42543b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return (m_root = parent->m_root); 42553b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata parent = parent->m_parent; 42563b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 42573b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return (m_root = parent); 42583b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 42593b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 42603b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataAddressType 42613b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetAddressTypeOfChildren() 42623b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 42633b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid) 42643b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 42653b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* root(GetRoot()); 42663b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (root != this) 42673b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return root->GetAddressTypeOfChildren(); 42683b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 42693b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return m_address_type_of_ptr_or_ref_children; 42703b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 42713b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 42723b83055d13d30e8b10a15d04cd0619265e029158Enrico Granatalldb::DynamicValueType 42733b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetDynamicValueType () 42743b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 42753b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* with_dv_info = this; 42763b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata while (with_dv_info) 42773b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 42783b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (with_dv_info->HasDynamicValueTypeInfo()) 42793b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return with_dv_info->GetDynamicValueTypeImpl(); 42803b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata with_dv_info = with_dv_info->m_parent; 42813b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 42823b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return lldb::eNoDynamicValues; 42833b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 42843b83055d13d30e8b10a15d04cd0619265e029158Enrico Granatalldb::Format 42853b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetFormat () const 42863b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 42873b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata const ValueObject* with_fmt_info = this; 42883b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata while (with_fmt_info) 42893b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 42903b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (with_fmt_info->m_format != lldb::eFormatDefault) 42913b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return with_fmt_info->m_format; 42923b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata with_fmt_info = with_fmt_info->m_parent; 42933b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 42943b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return m_format; 42953b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 4296