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), 857ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata m_last_format (eFormatDefault), 8623ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_summary_sp(), 883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_format_sp(), 893069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_synthetic_children_sp(), 9021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 9197c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_address_type_of_ptr_or_ref_children(eAddressTypeInvalid), 9217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid (false), 9317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change (false), 9417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid (false), 95427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_old_value_valid (false), 961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 97886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 99979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 100931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_is_getting_summary(false), 101931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type(false) 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject(this); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 109915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::ValueObject (ExecutionContextScope *exe_scope, 110915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata AddressType child_ptr_or_ref_addr_type) : 111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UserID (++g_value_obj_uid), // Unique identifier for every value object 112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (NULL), 1133b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata m_root (NULL), 114dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (exe_scope), 115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_name (), 116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_data (), 117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value (), 118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error (), 119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str (), 120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str (), 121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_location_str (), 122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str (), 123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_object_desc_str (), 12447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(), 125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children (), 126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_synthetic_children (), 12747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 128e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 12947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_format (eFormatDefault), 1317ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata m_last_format (eFormatDefault), 13223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 1333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_summary_sp(), 1343069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_format_sp(), 1353069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_synthetic_children_sp(), 13621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 13797c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type), 138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_is_valid (false), 139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_did_change (false), 140fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children_count_valid (false), 141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid (false), 1421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 143886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 1449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 145979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 146931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_is_getting_summary(false), 147931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type(false) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager = new ValueObjectManager(); 15047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject (this); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor 155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject () 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 161886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format) 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 164915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool did_change_formats = false; 165915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 166886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (update_format) 167f509c5ec066599a3399fced39ea36996184939e8Enrico Granata did_change_formats = UpdateFormatsIfNeeded(); 1681391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 169d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 170d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 171d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 172915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 173915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // if you were asked to update your formatters, but did not get a chance to do it 174915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // clear your own values (this serves the purpose of faking a stop-id for frozen 175915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // objects (which are regarded as constant, but could have changes behind their backs 176915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // because of the frozen-pointer depth limit) 177915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // TODO: decouple summary from value and then remove this code and only force-clear the summary 178915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (update_format && !did_change_formats) 179cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsSummary); 180d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 181915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 182d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool first_update = m_update_point.IsFirstEvaluation(); 184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_update_point.NeedsUpdating()) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetUpdated(); 188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Save the old value using swap to avoid a string copy which 190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // also will clear our m_value_str 191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_value_str.empty()) 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = false; 194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 197fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = true; 198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str.swap (m_value_str); 199cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsValue); 200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClearUserVisibleData(); 203f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 20421c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton if (IsInScope()) 20521c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton { 20621c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton const bool value_was_valid = GetValueIsValid(); 207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 20821c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 20921c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton m_error.Clear(); 21021c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 21121c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // Call the pure virtual function to update the value 21221c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton bool success = UpdateValue (); 21321c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 21421c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueIsValid (success); 21521c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 21621c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton if (first_update) 21721c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueDidChange (false); 21821c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton else if (!m_value_did_change && success == false) 21921c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton { 22021c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // The value wasn't gotten successfully, so we mark this 22121c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // as changed if the value used to be valid and now isn't 22221c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueDidChange (value_was_valid); 22321c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton } 22421c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton } 22521c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton else 226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 22721c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton m_error.SetErrorString("out of scope"); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 233915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatabool 234f509c5ec066599a3399fced39ea36996184939e8Enrico GranataValueObject::UpdateFormatsIfNeeded() 2351391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{ 236952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 237979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (log) 2387b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[%s %p] checking for FormatManager revisions. ValueObject rev: %d - Global rev: %d", 239979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata GetName().GetCString(), 2407b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata this, 2411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision, 2421c61743af946076e988d88baf725382e99d905deEnrico Granata DataVisualization::GetCurrentRevision()); 243915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 244915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool any_change = false; 245915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 246f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if ( (m_last_format_mgr_revision != DataVisualization::GetCurrentRevision())) 2471391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 2483b23d2097b526c6326b7b7c56d5fc84884d4e08bEnrico Granata SetValueFormat(DataVisualization::ValueFormats::GetFormat (*this, eNoDynamicValues)); 249f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSummaryFormat(DataVisualization::GetSummaryFormat (*this, GetDynamicValueType())); 25045c47aabcb6b1b3861fd15e8cbe2fc7d7d44a71fJason Molenda#ifndef LLDB_DISABLE_PYTHON 251f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSyntheticChildren(DataVisualization::GetSyntheticChildren (*this, GetDynamicValueType())); 25245c47aabcb6b1b3861fd15e8cbe2fc7d7d44a71fJason Molenda#endif 2538a717e596312951672ecd8c54df2d255e6da20baEnrico Granata 2541c61743af946076e988d88baf725382e99d905deEnrico Granata m_last_format_mgr_revision = DataVisualization::GetCurrentRevision(); 255716a6286f8fd6d5d0e5da218c34317a16f5baa50Enrico Granata 256716a6286f8fd6d5d0e5da218c34317a16f5baa50Enrico Granata any_change = true; 2571391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 258915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 259915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return any_change; 260915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 2611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata} 2621391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 263574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Inghamvoid 264574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim InghamValueObject::SetNeedsUpdate () 265574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham{ 266574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_update_point.SetNeedsUpdate(); 267574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // We have to clear the value string here so ConstResult children will notice if their values are 268574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // changed by hand (i.e. with SetValueAsCString). 269cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsValue); 270574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham} 271574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 2720b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granatavoid 2733d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico GranataValueObject::ClearDynamicTypeInformation () 2740b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata{ 2750b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata m_did_calculate_complete_objc_class_type = false; 2763d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata m_last_format_mgr_revision = 0; 2770b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata m_override_type = ClangASTType(); 2783d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetValueFormat(lldb::TypeFormatImplSP()); 2793d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetSummaryFormat(lldb::TypeSummaryImplSP()); 2803d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetSyntheticChildren(lldb::SyntheticChildrenSP()); 2810b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata} 2820b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata 283931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananClangASTType 284931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::MaybeCalculateCompleteType () 285931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 28652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type(GetClangTypeImpl()); 287940dd18789f83f28a618a9b588376c8bae557347Sean Callanan 288931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (m_did_calculate_complete_objc_class_type) 289931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 290931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (m_override_type.IsValid()) 291931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return m_override_type; 292931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 29352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return clang_type; 294931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 295931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 29652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType class_type; 29752f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_pointer_type = false; 298931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 29952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsObjCObjectPointerType(&class_type)) 300931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 301931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan is_pointer_type = true; 302931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 30352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (clang_type.IsObjCObjectOrInterfaceType()) 304931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 30552f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_type = clang_type; 306931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 307931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 308931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 30952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return clang_type; 310931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 311931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 312931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type = true; 313931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 31452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_type) 315931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 31652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ConstString class_name (class_type.GetConstTypeName()); 317931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 31852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_name) 31952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 32052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ProcessSP process_sp(GetUpdatePoint().GetExecutionContextRef().GetProcessSP()); 32152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 32252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (process_sp) 32352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 32452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCLanguageRuntime *objc_language_runtime(process_sp->GetObjCLanguageRuntime()); 32552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 32652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_language_runtime) 32752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 32852f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeSP complete_objc_class_type_sp = objc_language_runtime->LookupInCompleteClassCache(class_name); 32952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 33052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (complete_objc_class_type_sp) 33152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 33252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType complete_class(complete_objc_class_type_sp->GetClangFullType()); 33352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 33452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (complete_class.GetCompleteType()) 33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 33652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_pointer_type) 33752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 33852f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_override_type = complete_class.GetPointerType(); 33952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 34052f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 34152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 34252f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_override_type = complete_class; 34352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 34452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 34552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_override_type.IsValid()) 34652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return m_override_type; 34752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 34852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 34952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 35052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 35152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 352931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 35352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return clang_type; 354931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 355931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 35652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 357931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::GetClangType () 358931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 35952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return MaybeCalculateCompleteType(); 360931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 361931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 365afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 370bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError() 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 372afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 383fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString () 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata return GetLocationAsCStringImpl(m_value, 38610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata m_data); 38710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata} 38810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata 38910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granataconst char * 39010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico GranataValueObject::GetLocationAsCStringImpl (const Value& value, 39110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata const DataExtractor& data) 39210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata{ 393afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false)) 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 39810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata 39910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata Value::ValueType value_type = value.GetValueType(); 40010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata 40110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata switch (value_type) 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 4047c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 40510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata if (value.GetContextType() == Value::eContextTypeRegisterInfo) 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata RegisterInfo *reg_info = value.GetRegisterInfo(); 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 41410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata if (m_location_str.empty()) 41510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata m_location_str = (reg_info->encoding == lldb::eEncodingVector) ? "vector" : "scalar"; 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata if (m_location_str.empty()) 41910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata m_location_str = (value_type == Value::eValueTypeVector) ? "vector" : "scalar"; 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata uint32_t addr_nibble_size = data.GetAddressByteSize() * 2; 42710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 450fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar) 4510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 452c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything 453c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata { 454b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 455574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Value tmp_value(m_value); 45652f792329be5db8e38961350589e97e8f2823acdGreg Clayton scalar = tmp_value.ResolveValue(&exe_ctx); 4571716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton if (scalar.IsValid()) 4581716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton { 4591716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton const uint32_t bitfield_bit_size = GetBitfieldBitSize(); 4601716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton if (bitfield_bit_size) 4611716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return scalar.ExtractBitfield (bitfield_bit_size, GetBitfieldBitOffset()); 4621716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return true; 4631716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton } 464c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata } 4651716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return false; 4660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 4670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 4680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 46917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 482fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange () 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 484fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham GetValueAsCString (); 48517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 49536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndex (size_t idx, bool can_create) 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 498917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 500afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (idx < GetNumChildren()) 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 503917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check if we have already made the child value object? 50406cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata if (can_create && !m_children.HasChildAtIndex(idx)) 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // No we haven't created the child at this index, so lets have our 507917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // subclass do it and cache the result for quick future access. 50806cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata m_children.SetChildAtIndex(idx,CreateChildAtIndex (idx, false, 0)); 509e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 51106cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata ValueObject* child = m_children.GetChildAtIndex(idx); 51206cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata if (child != NULL) 51306cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata return child->GetSP(); 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 518b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataValueObjectSP 51936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::initializer_list<size_t>& idxs, 52036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 521b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 522b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 523b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 524b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 52536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx : idxs) 526b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 527b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx, true); 528b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 529b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 530b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 531b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx; 532b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 533b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 534b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 535b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 536b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 537b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 538b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataValueObjectSP 53936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::initializer_list< std::pair<size_t, bool> >& idxs, 54036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 541b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 542b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 543b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 544b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 54536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (std::pair<size_t, bool> idx : idxs) 546b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 547b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx.first, idx.second); 548b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 549b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 550b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 551b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx.first; 552b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 553b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 554b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 555b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 556b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 557b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 558b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb::ValueObjectSP 55936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::vector<size_t> &idxs, 56036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 561b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 562b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 563b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 564b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 56536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx : idxs) 566b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 567b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx, true); 568b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 569b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 570b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 571b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx; 572b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 573b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 574b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 575b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 576b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 577b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 578b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb::ValueObjectSP 57936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::vector< std::pair<size_t, bool> > &idxs, 58036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 581b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 582b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 583b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 584b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 58536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (std::pair<size_t, bool> idx : idxs) 586b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 587b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx.first, idx.second); 588b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 589b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 590b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 591b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx.first; 592b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 593b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 594b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 595b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 596b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 597b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 59836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 60252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().GetIndexOfChildWithName (name.GetCString(), omit_empty_base_classes); 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6085d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 613917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 614917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 615afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 616917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 617917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t> child_indexes; 618917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 61952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const size_t num_child_indexes = GetClangType().GetIndexOfChildMemberWithName (name.GetCString(), 62052f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 62152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes); 622917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (num_child_indexes > 0) 623e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 624917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 625917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator end = child_indexes.end (); 626e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 627917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = GetChildAtIndex(*pos, can_create); 628917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton for (++pos; pos != end; ++pos) 629917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 630917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_sp) 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 632917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 633917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = new_child_sp; 634917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 635917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 636917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 637917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp.reset(); 638e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 639917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 649dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata UpdateValueIfNeeded(); 65017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65406cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata return m_children.GetChildrenCount(); 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65654037b1488e3344575714d8358728e042fa801c7Greg Clayton 65754037b1488e3344575714d8358728e042fa801c7Greg Claytonbool 65854037b1488e3344575714d8358728e042fa801c7Greg ClaytonValueObject::MightHaveChildren() 65954037b1488e3344575714d8358728e042fa801c7Greg Clayton{ 660b8080cb01bb09038eaab15b34be058611c3e7885Enrico Granata bool has_children = false; 661940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo(); 662940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (type_info) 66354037b1488e3344575714d8358728e042fa801c7Greg Clayton { 66452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_info & (ClangASTType::eTypeHasChildren | 66552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType::eTypeIsPointer | 66652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType::eTypeIsReference)) 66754037b1488e3344575714d8358728e042fa801c7Greg Clayton has_children = true; 66854037b1488e3344575714d8358728e042fa801c7Greg Clayton } 66954037b1488e3344575714d8358728e042fa801c7Greg Clayton else 67054037b1488e3344575714d8358728e042fa801c7Greg Clayton { 67154037b1488e3344575714d8358728e042fa801c7Greg Clayton has_children = GetNumChildren () > 0; 67254037b1488e3344575714d8358728e042fa801c7Greg Clayton } 67354037b1488e3344575714d8358728e042fa801c7Greg Clayton return has_children; 67454037b1488e3344575714d8358728e042fa801c7Greg Clayton} 67554037b1488e3344575714d8358728e042fa801c7Greg Clayton 67654037b1488e3344575714d8358728e042fa801c7Greg Clayton// Should only be called by ValueObject::GetNumChildren() 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 67836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::SetNumChildren (size_t num_children) 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 68106cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata m_children.SetChildrenCount(num_children); 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 69136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index) 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 693bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham ValueObject *valobj = NULL; 694e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 695917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 69624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = synthetic_array_member; 697917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::string child_name_str; 698917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_byte_size = 0; 699917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton int32_t child_byte_offset = 0; 700917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_size = 0; 701917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_offset = 0; 702917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_base_class = false; 703917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_deref_of_parent = false; 704917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 705917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool transparent_pointers = synthetic_array_member == false; 70652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType child_clang_type; 707917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 708b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 709917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 71052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_clang_type = GetClangType().GetChildClangTypeAtIndex (&exe_ctx, 71152f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetName().GetCString(), 71252f792329be5db8e38961350589e97e8f2823acdGreg Clayton idx, 71352f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 71452f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 71552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 71652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name_str, 71752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 71852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 71952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 72052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 72152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 72252f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent); 723b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton if (child_clang_type) 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 725917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (synthetic_index) 726917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset += child_byte_size * synthetic_index; 727917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 728917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ConstString child_name; 729917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!child_name_str.empty()) 730917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name.SetCString (child_name_str.c_str()); 731917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 732917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj = new ValueObjectChild (*this, 733917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type, 734917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name, 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, 740915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata child_is_deref_of_parent, 741915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 742915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata //if (valobj) 743915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // valobj->SetAddressTypeOfChildren(eAddressTypeInvalid); 744915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 745e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 74647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatabool 7503069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetSummaryAsCString (TypeSummaryImpl* summary_ptr, 7513069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string& destination) 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.clear(); 7543069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 7553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // ideally we would like to bail out if passing NULL, but if we do so 7563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // we end up not providing the summary for function pointers anymore 7573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (/*summary_ptr == NULL ||*/ m_is_getting_summary) 7583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return false; 759ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton 760ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton m_is_getting_summary = true; 76163aa63418b3444bf7dd6e32e8320533390124402Enrico Granata 76263aa63418b3444bf7dd6e32e8320533390124402Enrico Granata // this is a hot path in code and we prefer to avoid setting this string all too often also clearing out other 76363aa63418b3444bf7dd6e32e8320533390124402Enrico Granata // information that we might care to see in a crash log. might be useful in very specific situations though. 76463aa63418b3444bf7dd6e32e8320533390124402Enrico Granata /*Host::SetCrashDescriptionWithFormat("Trying to fetch a summary for %s %s. Summary provider's description is %s", 76563aa63418b3444bf7dd6e32e8320533390124402Enrico Granata GetTypeName().GetCString(), 76663aa63418b3444bf7dd6e32e8320533390124402Enrico Granata GetName().GetCString(), 76763aa63418b3444bf7dd6e32e8320533390124402Enrico Granata summary_ptr->GetDescription().c_str());*/ 76863aa63418b3444bf7dd6e32e8320533390124402Enrico Granata 7693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded (false)) 7703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 7713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (summary_ptr) 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 773cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (HasSyntheticValue()) 774cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value->UpdateValueIfNeeded(); // the summary might depend on the synthetic children being up-to-date (e.g. ${svar%#}) 775cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata summary_ptr->FormatObject(this, destination); 7763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 7773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 7783069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 77952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = GetClangType(); 7803069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 7813069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // Do some default printout for function pointers 7823069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (clang_type) 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsFunctionPointerType ()) 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78652f792329be5db8e38961350589e97e8f2823acdGreg Clayton StreamString sstr; 7873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata AddressType func_ptr_address_type = eAddressTypeInvalid; 7883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata addr_t func_ptr_address = GetPointerValue (&func_ptr_address_type); 7893069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata switch (func_ptr_address_type) 792fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 793b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeInvalid: 794b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeFile: 795b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 7963069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 797b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeLoad: 7983069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 7993069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 8003069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8013069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address so_addr; 8023069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 8033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (target && target->GetSectionLoadList().IsEmpty() == false) 80403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 8053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 80603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 8073069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata so_addr.Dump (&sstr, 8083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata exe_ctx.GetBestExecutionContextScope(), 8093069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address::DumpStyleResolvedDescription, 8103069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address::DumpStyleSectionNameOffset); 81103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 812f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 8133069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 814b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 8153069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 816b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeHost: 817b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 818b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8203069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (sstr.GetSize() > 0) 8213069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8223069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.assign (1, '('); 8233069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.append (sstr.GetData(), sstr.GetSize()); 8243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.append (1, ')'); 8253069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 830ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton m_is_getting_summary = false; 8313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return !destination.empty(); 8323069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 8333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8343069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granataconst char * 8353069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetSummaryAsCString () 8363069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 8373069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded(true) && m_summary_str.empty()) 8383069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8393069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata GetSummaryAsCString(GetSummaryFormat().get(), 8403069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_summary_str); 8413069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8471a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool 8481a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer) 8491a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 85052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_or_element_clang_type; 85152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const Flags type_flags (GetTypeInfo (&pointee_or_element_clang_type)); 85252f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_char_arr_ptr (type_flags.AnySet (ClangASTType::eTypeIsArray | ClangASTType::eTypeIsPointer) && 85352f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type.IsCharType ()); 8541a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!is_char_arr_ptr) 8551a102087f54079c25c8827afac6153a44ca535daEnrico Granata return false; 8561a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!check_pointer) 8571a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 85852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_flags.Test(ClangASTType::eTypeIsArray)) 8591a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 8605c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton addr_t cstr_address = LLDB_INVALID_ADDRESS; 8611a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 862915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata cstr_address = GetAddressOf (true, &cstr_address_type); 8631a102087f54079c25c8827afac6153a44ca535daEnrico Granata return (cstr_address != LLDB_INVALID_ADDRESS); 8641a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 8651a102087f54079c25c8827afac6153a44ca535daEnrico Granata 866915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatasize_t 867915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetPointeeData (DataExtractor& data, 868915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t item_idx, 869915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t item_count) 870915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 87152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_or_element_clang_type; 872940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo (&pointee_or_element_clang_type); 87352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool is_pointer_type = type_info & ClangASTType::eTypeIsPointer; 87452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool is_array_type = type_info & ClangASTType::eTypeIsArray; 875940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (!(is_pointer_type || is_array_type)) 876915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 877915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 878915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (item_count == 0) 879915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 880915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 88152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t item_type_size = pointee_or_element_clang_type.GetByteSize(); 882915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata const uint64_t bytes = item_count * item_type_size; 883915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata const uint64_t offset = item_idx * item_type_size; 884915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 885915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (item_idx == 0 && item_count == 1) // simply a deref 886915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 887940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (is_pointer_type) 888915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 889915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Error error; 890915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata ValueObjectSP pointee_sp = Dereference(error); 891915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Fail() || pointee_sp.get() == NULL) 892915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 893915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return pointee_sp->GetDataExtractor().Copy(data); 894915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 895915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata else 896915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 897915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata ValueObjectSP child_sp = GetChildAtIndex(0, true); 898915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (child_sp.get() == NULL) 899915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 900915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return child_sp->GetDataExtractor().Copy(data); 901915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 902915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return true; 903915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 904915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata else /* (items > 1) */ 905915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 906915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Error error; 907915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata lldb_private::DataBufferHeap* heap_buf_ptr = NULL; 908915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata lldb::DataBufferSP data_sp(heap_buf_ptr = new lldb_private::DataBufferHeap()); 909915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 910915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata AddressType addr_type; 911940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton lldb::addr_t addr = is_pointer_type ? GetPointerValue(&addr_type) : GetAddressOf(true, &addr_type); 912915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 913915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata switch (addr_type) 914915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 915915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeFile: 916915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 9173508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (GetModule()); 9183508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 919915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 920f4b54c8cd1523da2fa70d7397b2bb93a49421a34Enrico Granata addr = addr + offset; 921915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Address so_addr; 9223508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton module_sp->ResolveFileAddress(addr, so_addr); 923b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 924b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target* target = exe_ctx.GetTargetPtr(); 925b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target) 926915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 927b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton heap_buf_ptr->SetByteSize(bytes); 928b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton size_t bytes_read = target->ReadMemory(so_addr, false, heap_buf_ptr->GetBytes(), bytes, error); 929b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (error.Success()) 930915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 931b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetData(data_sp); 932b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton return bytes_read; 933915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 934915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 935915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 936915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 937915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 938915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeLoad: 939915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 940b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 941b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 942915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (process) 943915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 944915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata heap_buf_ptr->SetByteSize(bytes); 945915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata size_t bytes_read = process->ReadMemory(addr + offset, heap_buf_ptr->GetBytes(), bytes, error); 946915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Success()) 947915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 948915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetData(data_sp); 949915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return bytes_read; 950915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 951915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 952915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 953915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 954915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeHost: 955915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 95652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t max_bytes = GetClangType().GetByteSize(); 957940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (max_bytes > offset) 958940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton { 959940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton size_t bytes_read = std::min<uint64_t>(max_bytes - offset, bytes); 960940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton heap_buf_ptr->CopyData((uint8_t*)(addr + offset), bytes_read); 961940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton data.SetData(data_sp); 962940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return bytes_read; 963940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton } 964915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 965915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 966915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeInvalid: 967915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 968915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 969915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 970915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 971915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 972915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 973fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t 974915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetData (DataExtractor& data) 975915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 976915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata UpdateValueIfNeeded(false); 977b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 97852f792329be5db8e38961350589e97e8f2823acdGreg Clayton Error error = m_value.GetValueAsData(&exe_ctx, data, 0, GetModule().get()); 979915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Fail()) 9802c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan { 9812c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan if (m_data.GetByteSize()) 9822c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan { 9832c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan data = m_data; 9842c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan return data.GetByteSize(); 9852c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan } 9862c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan else 9872c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan { 9882c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan return 0; 9892c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan } 9902c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan } 991915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetAddressByteSize(m_data.GetAddressByteSize()); 992915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetByteOrder(m_data.GetByteOrder()); 993915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return data.GetByteSize(); 994915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 995915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 996ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananbool 997ab8e00e51475b9148626bfdf99549b7ffc3d046dSean CallananValueObject::SetData (DataExtractor &data, Error &error) 998ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan{ 999ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.Clear(); 1000ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // Make sure our value is up to date first so that our location and location 1001ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // type is valid. 1002ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (!UpdateValueIfNeeded(false)) 1003ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1004ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.SetErrorString("unable to read value"); 1005ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1006ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1007ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1008ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan uint64_t count = 0; 100952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const Encoding encoding = GetClangType().GetEncoding(count); 1010ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1011ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan const size_t byte_size = GetByteSize(); 1012ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1013ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan Value::ValueType value_type = m_value.GetValueType(); 1014ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1015ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan switch (value_type) 1016ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1017ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeScalar: 1018ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1019ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan Error set_error = m_value.GetScalar().SetValueFromData(data, encoding, byte_size); 1020ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1021ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (!set_error.Success()) 1022ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1023ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.SetErrorStringWithFormat("unable to set scalar value: %s", set_error.AsCString()); 1024ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1025ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1026ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1027ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1028ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeLoadAddress: 1029ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1030ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // If it is a load address, then the scalar value is the storage location 1031ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // of the data, and we have to shove this value down to that load location. 1032ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan ExecutionContext exe_ctx (GetExecutionContextRef()); 1033ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan Process *process = exe_ctx.GetProcessPtr(); 1034ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (process) 1035ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1036ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan addr_t target_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1037ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan size_t bytes_written = process->WriteMemory(target_addr, 1038ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan data.GetDataStart(), 1039ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan byte_size, 1040ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error); 1041ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (!error.Success()) 1042ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1043ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (bytes_written != byte_size) 1044ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1045ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error.SetErrorString("unable to write value to memory"); 1046ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 1047ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1048ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1049ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1050ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1051ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeHostAddress: 1052ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 1053ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // If it is a host address, then we stuff the scalar as a DataBuffer into the Value's data. 1054ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan DataBufferSP buffer_sp (new DataBufferHeap(byte_size, 0)); 1055ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan m_data.SetData(buffer_sp, 0); 1056ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan data.CopyByteOrderedData (0, 1057ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan byte_size, 1058ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan const_cast<uint8_t *>(m_data.GetDataStart()), 1059ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan byte_size, 1060ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan m_data.GetByteOrder()); 1061ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); 1062ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1063ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1064ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeFileAddress: 1065ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan case Value::eValueTypeVector: 1066ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan break; 1067ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 1068ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1069ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan // If we have reached this point, then we have successfully changed the value. 1070ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan SetNeedsUpdate(); 1071ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return true; 1072ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan} 1073ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 1074915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// will compute strlen(str), but without consuming more than 1075915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// maxlen bytes out of str (this serves the purpose of reading 1076915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// chunks of a string without having to worry about 1077915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// missing NULL terminators in the chunk) 1078915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// of course, if strlen(str) > maxlen, the function will return 1079915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// maxlen_value (which should be != maxlen, because that allows you 1080915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// to know whether strlen(str) == maxlen or strlen(str) > maxlen) 1081915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatastatic uint32_t 1082915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatastrlen_or_inf (const char* str, 1083915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t maxlen, 1084915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t maxlen_value) 1085915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 1086915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t len = 0; 1087103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton if (str) 1088915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 1089103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton while(*str) 1090103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton { 1091103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton len++;str++; 1092940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (len >= maxlen) 1093103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton return maxlen_value; 1094103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton } 1095915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 1096915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return len; 1097915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 1098915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 109932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatasize_t 1100b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg ClaytonValueObject::ReadPointedString (Stream& s, 1101b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Error& error, 1102b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_length, 1103b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton bool honor_array, 1104b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Format item_format) 11051a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 1106b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1107b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target* target = exe_ctx.GetTargetPtr(); 1108b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 110915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (!target) 111015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 111115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "<no target to read from>"; 111215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("no target to read from"); 111315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata return 0; 111415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 111515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 111615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (max_length == 0) 1117b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton max_length = target->GetMaximumSizeOfStringSummary(); 11181a102087f54079c25c8827afac6153a44ca535daEnrico Granata 111932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata size_t bytes_read = 0; 112032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata size_t total_bytes_read = 0; 112132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 112252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = GetClangType(); 112352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType elem_or_pointee_clang_type; 1124940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const Flags type_flags (GetTypeInfo (&elem_or_pointee_clang_type)); 112552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_flags.AnySet (ClangASTType::eTypeIsArray | ClangASTType::eTypeIsPointer) && 112652f792329be5db8e38961350589e97e8f2823acdGreg Clayton elem_or_pointee_clang_type.IsCharType ()) 11271a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 112815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata addr_t cstr_address = LLDB_INVALID_ADDRESS; 112915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 113015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 113115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t cstr_len = 0; 113215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bool capped_data = false; 113352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_flags.Test (ClangASTType::eTypeIsArray)) 1134b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 113515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // We have an array 113652f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t array_size = 0; 113752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsArrayType(NULL, &array_size, NULL)) 113815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 113952f792329be5db8e38961350589e97e8f2823acdGreg Clayton cstr_len = array_size; 114052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cstr_len > max_length) 114152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 114252f792329be5db8e38961350589e97e8f2823acdGreg Clayton capped_data = true; 114352f792329be5db8e38961350589e97e8f2823acdGreg Clayton cstr_len = max_length; 114452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 114515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 114615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_address = GetAddressOf (true, &cstr_address_type); 1147b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 1148b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton else 1149b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 115015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // We have a pointer 115115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_address = GetPointerValue (&cstr_address_type); 115215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 115315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 115415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_address == 0 || cstr_address == LLDB_INVALID_ADDRESS) 115515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 115615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "<invalid address>"; 115715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("invalid address"); 115815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata return 0; 115915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 116015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 116115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata Address cstr_so_addr (cstr_address); 116215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata DataExtractor data; 116315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len > 0 && honor_array) 116415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 116515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host 116615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this 116715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata GetPointeeData(data, 0, cstr_len); 116815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 116915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if ((bytes_read = data.GetByteSize()) > 0) 1170b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 117115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata total_bytes_read = bytes_read; 117215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 117315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata data.Dump (&s, 117415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // Start offset in "data" 117515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata item_format, 117615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 1, // Size of item (1 byte for a char!) 117715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bytes_read, // How many bytes to print? 117815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata UINT32_MAX, // num per line 117915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata LLDB_INVALID_ADDRESS,// base address 118015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // bitfield bit size 118115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0); // bitfield bit offset 118215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (capped_data) 118315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "..."; 118415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 1185b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 118615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 118715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata else 118815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 118915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len = max_length; 119015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata const size_t k_max_buf_size = 64; 119115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 119215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t offset = 0; 119315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 119415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata int cstr_len_displayed = -1; 119515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bool capped_cstr = false; 119615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host 119715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this 119815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata while ((bytes_read = GetPointeeData(data, offset, k_max_buf_size)) > 0) 11991a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 120015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata total_bytes_read += bytes_read; 120115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata const char *cstr = data.PeekCStr(0); 120215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t len = strlen_or_inf (cstr, k_max_buf_size, k_max_buf_size+1); 120315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > k_max_buf_size) 120415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = k_max_buf_size; 120515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr && cstr_len_displayed < 0) 120615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 120715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 120815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len_displayed < 0) 120915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len_displayed = len; 121015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 121115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len == 0) 121215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 121315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len_displayed += len; 121415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > bytes_read) 121515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = bytes_read; 121615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > cstr_len) 121715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = cstr_len; 121815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 121915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata data.Dump (&s, 122015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // Start offset in "data" 122115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata item_format, 122215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 1, // Size of item (1 byte for a char!) 122315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len, // How many bytes to print? 122415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata UINT32_MAX, // num per line 122515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata LLDB_INVALID_ADDRESS,// base address 122615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // bitfield bit size 122715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0); // bitfield bit offset 122815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 122915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len < k_max_buf_size) 123015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 123115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 123215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len >= cstr_len) 1233979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 123415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata capped_cstr = true; 123515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 1236979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1237b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 123815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len -= len; 123915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata offset += len; 124015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 124115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 124215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len_displayed >= 0) 124315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 124415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 124515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (capped_cstr) 124615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "..."; 12471a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 1248b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 12491a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 12501a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 12511a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 125215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("not a string object"); 1253979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<not a string object>"; 12541a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 125532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return total_bytes_read; 12561a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 12571a102087f54079c25c8827afac6153a44ca535daEnrico Granata 12584ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 1259fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription () 12604ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 1261886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 12627dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata if (!UpdateValueIfNeeded (true)) 12634ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 1264886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1265886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!m_object_desc_str.empty()) 1266886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_object_desc_str.c_str(); 1267886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1268b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1269b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 1270b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 12714ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 1272b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1273b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 12744ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 12755c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton LanguageType language = GetObjectRuntimeLanguage(); 1276b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 12774ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 12780e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 12790e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 128070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway... 128152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = GetClangType(); 128252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type) 12830e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 128470c55622e15857e232cf4777a502fa5fe40e785bJim Ingham bool is_signed; 128552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsIntegerType (is_signed) || clang_type.IsPointerType ()) 128670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham { 12875c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton runtime = process->GetLanguageRuntime(eLanguageTypeObjC); 128870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham } 12890e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 12900e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 12910e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 12920de37195f17fefb536157b3296a18999116b8125Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this)) 12934ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 12944ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 12954ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 1296e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 1297e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 1298e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 1299e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 1300e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 13014ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatabool 13043069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetValueAsCString (lldb::Format format, 13053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string& destination) 13063069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 130752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetClangType().IsAggregateType () == false && UpdateValueIfNeeded(false)) 13083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13093069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const Value::ContextType context_type = m_value.GetContextType(); 13103069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 131152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (context_type == Value::eContextTypeRegisterInfo) 13123069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 131352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 131452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (reg_info) 13153069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 131652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 131752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 131852f792329be5db8e38961350589e97e8f2823acdGreg Clayton StreamString reg_sstr; 131952f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_data.Dump (®_sstr, 132052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, 132152f792329be5db8e38961350589e97e8f2823acdGreg Clayton format, 132252f792329be5db8e38961350589e97e8f2823acdGreg Clayton reg_info->byte_size, 132352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 1, 132452f792329be5db8e38961350589e97e8f2823acdGreg Clayton UINT32_MAX, 132552f792329be5db8e38961350589e97e8f2823acdGreg Clayton LLDB_INVALID_ADDRESS, 132652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, 132752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, 132852f792329be5db8e38961350589e97e8f2823acdGreg Clayton exe_ctx.GetBestExecutionContextScope()); 132952f792329be5db8e38961350589e97e8f2823acdGreg Clayton destination.swap(reg_sstr.GetString()); 133052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 133152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 133252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 133352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 133452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = GetClangType (); 133552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type) 133652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 133752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // put custom bytes to display in this DataExtractor to override the default value logic 133852f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb_private::DataExtractor special_format_data; 133952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (format == eFormatCString) 13403069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 134152f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags type_flags(clang_type.GetTypeInfo(NULL)); 134252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_flags.Test(ClangASTType::eTypeIsPointer) && !type_flags.Test(ClangASTType::eTypeIsObjC)) 134360dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 134452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if we are dumping a pointer as a c-string, get the pointee data as a string 134552f792329be5db8e38961350589e97e8f2823acdGreg Clayton TargetSP target_sp(GetTargetSP()); 134652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (target_sp) 134760dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 134852f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t max_len = target_sp->GetMaximumSizeOfStringSummary(); 134952f792329be5db8e38961350589e97e8f2823acdGreg Clayton Error error; 135052f792329be5db8e38961350589e97e8f2823acdGreg Clayton DataBufferSP buffer_sp(new DataBufferHeap(max_len+1,0)); 135152f792329be5db8e38961350589e97e8f2823acdGreg Clayton Address address(GetPointerValue()); 135252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (target_sp->ReadCStringFromMemory(address, (char*)buffer_sp->GetBytes(), max_len, error) && error.Success()) 135352f792329be5db8e38961350589e97e8f2823acdGreg Clayton special_format_data.SetData(buffer_sp); 135460dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 135560dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 13563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 135852f792329be5db8e38961350589e97e8f2823acdGreg Clayton StreamString sstr; 135952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 136052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.DumpTypeValue (&sstr, // The stream to use for display 136152f792329be5db8e38961350589e97e8f2823acdGreg Clayton format, // Format to display this type with 136252f792329be5db8e38961350589e97e8f2823acdGreg Clayton special_format_data.GetByteSize() ? 136352f792329be5db8e38961350589e97e8f2823acdGreg Clayton special_format_data: m_data, // Data to extract from 136452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, // Byte offset into "m_data" 136552f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetByteSize(), // Byte size of item in "m_data" 136652f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetBitfieldBitSize(), // Bitfield bit size 136752f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetBitfieldBitOffset(), // Bitfield bit offset 136852f792329be5db8e38961350589e97e8f2823acdGreg Clayton exe_ctx.GetBestExecutionContextScope()); 136952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Don't set the m_error to anything here otherwise 137052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // we won't be able to re-format as anything else. The 137152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // code for ClangASTType::DumpTypeValue() should always 137252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // return something, even if that something contains 137352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // an error messsage. "m_error" is used to detect errors 137452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // when reading the valid object, not for formatting errors. 137552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (sstr.GetString().empty()) 137652f792329be5db8e38961350589e97e8f2823acdGreg Clayton destination.clear(); 137752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 137852f792329be5db8e38961350589e97e8f2823acdGreg Clayton destination.swap(sstr.GetString()); 13793069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13803069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13813069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return !destination.empty(); 13823069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13833069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 13843069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return false; 13853069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 13863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 1388fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString () 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13907ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata if (UpdateValueIfNeeded(true)) 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata lldb::Format my_format = GetFormat(); 13934f5b299c1f5daf4cce9aad01471a6b558e5b13d2Enrico Granata if (my_format == lldb::eFormatDefault) 139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_type_format_sp) 13963069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = m_type_format_sp->GetFormat(); 13973069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13993069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_is_bitfield_for_scalar) 14003069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = eFormatUnsigned; 14013069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 14073069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = reg_info->format; 14083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 14093069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 14103069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 141152f792329be5db8e38961350589e97e8f2823acdGreg Clayton my_format = GetClangType().GetFormat(); 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14167ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata if (my_format != m_last_format || m_value_str.empty()) 141780e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata { 14187ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata m_last_format = my_format; 14197ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata if (GetValueAsCString(my_format, m_value_str)) 142080e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata { 14217ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata if (!m_value_did_change && m_old_value_valid) 14227ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata { 14237ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata // The value was gotten successfully, so we consider the 14247ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata // value as changed if the value string differs 14257ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata SetValueDidChange (m_old_value_str != m_value_str); 14267ef39ca9e4e94b96fb20fc17200d6492639f0cacEnrico Granata } 142780e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata } 142880e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata } 142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1435afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used 1436afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers 143737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonuint64_t 1438e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny ChenValueObject::GetValueAsUnsigned (uint64_t fail_value, bool *success) 1439afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{ 1440afb7c85df796f74262917e44dd68f668dade3911Enrico Granata // If our byte size is zero this is an aggregate type that has children 144152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!GetClangType().IsAggregateType()) 1442afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 144337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton Scalar scalar; 144437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (ResolveValue (scalar)) 1445e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen { 1446e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen if (success) 1447e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen *success = true; 14484a0a1252629a807d37ac252b0239f10204eddedcEnrico Granata return scalar.ULongLong(fail_value); 1449e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen } 1450e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen // fallthrough, otherwise... 1451afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 1452e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen 1453e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen if (success) 1454e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen *success = false; 145537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return fail_value; 1456afb7c85df796f74262917e44dd68f668dade3911Enrico Granata} 1457afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 14586f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// if any more "special cases" are added to ValueObject::DumpPrintableRepresentation() please keep 14596f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// this call up to date by returning true for your new special cases. We will eventually move 14606f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// to checking this call result before trying to display special cases 14616f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granatabool 1462cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, 1463cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Format custom_format) 14646f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata{ 146552f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags flags(GetTypeInfo()); 146652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (flags.AnySet(ClangASTType::eTypeIsArray | ClangASTType::eTypeIsPointer) 1467cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) 14686f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 14696f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (IsCStringContainer(true) && 14705c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatCString || 14715c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatCharArray || 14725c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatChar || 14735c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatVectorOfChar)) 14746f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 14756f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 147652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (flags.Test(ClangASTType::eTypeIsArray)) 14776f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 14785c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if ((custom_format == eFormatBytes) || 14795c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatBytesWithASCII)) 14806f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 14816f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 14825c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if ((custom_format == eFormatVectorOfChar) || 14835c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfFloat32) || 14845c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfFloat64) || 14855c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt16) || 14865c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt32) || 14875c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt64) || 14885c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt8) || 14895c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt128) || 14905c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt16) || 14915c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt32) || 14925c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt64) || 14935c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt8)) 14946f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 14956f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 14966f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 14976f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return false; 14986f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 14996f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 15019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s, 15029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectRepresentationStyle val_obj_display, 15035c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton Format custom_format, 1504cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata PrintableRepresentationSpecialCases special) 15059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 150686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 150752f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags flags(GetTypeInfo()); 15081a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1509cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool allow_special = ((special & ePrintableRepresentationSpecialCasesAllow) == ePrintableRepresentationSpecialCasesAllow); 1510cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool only_special = ((special & ePrintableRepresentationSpecialCasesOnly) == ePrintableRepresentationSpecialCasesOnly); 1511cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1512cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (allow_special) 15131a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 151452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (flags.AnySet(ClangASTType::eTypeIsArray | ClangASTType::eTypeIsPointer) 1515cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) 151686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1517cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // when being asked to get a printable display an array or pointer type directly, 1518cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // try to "do the right thing" 1519cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1520cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (IsCStringContainer(true) && 1521cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCString || 1522cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatCharArray || 1523cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatChar || 1524cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatVectorOfChar)) // print char[] & char* directly 152586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1526cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Error error; 1527cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ReadPointedString(s, 1528cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata error, 1529cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 0, 1530cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfChar) || 1531cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCharArray)); 1532cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return !error.Fail(); 1533cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1534cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1535cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format == eFormatEnum) 1536cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1537cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1538cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // this only works for arrays, because I have no way to know when 1539cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // the pointed memory ends, and no special \0 end of data marker 154052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (flags.Test(ClangASTType::eTypeIsArray)) 1541cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1542cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatBytes) || 1543cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatBytesWithASCII)) 154486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 154536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t count = GetNumChildren(); 1546cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1547cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << '['; 154836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t low = 0; low < count; low++) 1549cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1550cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1551cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (low) 1552cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ','; 1553cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1554cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 1555cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!child.get()) 1556cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1557cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << "<invalid child>"; 1558cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata continue; 1559cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1560cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, custom_format); 1561cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 156286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1563cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ']'; 156486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1565cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return true; 1566cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 156786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1568cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatVectorOfChar) || 1569cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfFloat32) || 1570cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfFloat64) || 1571cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt16) || 1572cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt32) || 1573cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt64) || 1574cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt8) || 1575cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt128) || 1576cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt16) || 1577cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt32) || 1578cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt64) || 1579cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly 1580cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 158136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t count = GetNumChildren(); 1582cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1583cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Format format = FormatManager::GetSingleItemFormat(custom_format); 1584cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1585cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << '['; 158636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t low = 0; low < count; low++) 1587cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1588cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1589cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (low) 1590cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ','; 1591cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1592cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 1593cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!child.get()) 1594cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1595cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << "<invalid child>"; 1596cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata continue; 1597cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1598cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, format); 1599cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1600cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1601cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ']'; 1602cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1603cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return true; 1604cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 160586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 160686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1607cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatBoolean) || 1608cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatBinary) || 1609cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatChar) || 1610cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCharPrintable) || 1611cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplexFloat) || 1612cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatDecimal) || 1613cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatHex) || 1614535543d6104ee45b4503db6bb6c175e66d0e093bEnrico Granata (custom_format == eFormatHexUppercase) || 1615cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatFloat) || 1616cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatOctal) || 1617cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatOSType) || 1618cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnicode16) || 1619cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnicode32) || 1620cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnsigned) || 1621cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatPointer) || 1622cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplexInteger) || 1623cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplex) || 1624cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatDefault)) // use the [] operator 1625cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1626cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1627cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1628cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1629cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (only_special) 1630cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1631cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1632cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool var_success = false; 1633cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1634cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 163536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const char *cstr = NULL; 163673cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata 163773cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata // this is a local stream that we are using to ensure that the data pointed to by cstr survives 163873cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata // long enough for us to copy it to its destination - it is necessary to have this temporary storage 163973cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata // area for cases where our desired output is not backed by some other longer-term storage 164036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton StreamString strm; 164186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1642cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format != eFormatInvalid) 1643cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata SetFormat(custom_format); 1644cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1645cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata switch(val_obj_display) 1646cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1647cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleValue: 164836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetValueAsCString(); 1649cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1650cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1651cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleSummary: 165236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetSummaryAsCString(); 1653cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 165486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1655cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleLanguageSpecific: 165636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetObjectDescription(); 1657cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1658cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1659cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleLocation: 166036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetLocationAsCString(); 1661cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1662cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1663cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleChildrenCount: 166436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%zu", GetNumChildren()); 166536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = strm.GetString().c_str(); 1666cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1667cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1668cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleType: 166936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetTypeName().AsCString(); 1670cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 167173cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata 167273cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata case eValueObjectRepresentationStyleName: 167373cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata cstr = GetName().AsCString(); 167473cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata break; 167573cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata 167673cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata case eValueObjectRepresentationStyleExpressionPath: 167773cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata GetExpressionPath(strm, false); 167873cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata cstr = strm.GetString().c_str(); 167973cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata break; 1680cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1681cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 168236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (!cstr) 1683cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1684cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (val_obj_display == eValueObjectRepresentationStyleValue) 168536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetSummaryAsCString(); 1686cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleSummary) 1687cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 168852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetClangType().IsAggregateType()) 168986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 169036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%s @ %s", GetTypeName().AsCString(), GetLocationAsCString()); 169136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = strm.GetString().c_str(); 1692cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1693cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 169436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetValueAsCString(); 169586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 169686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 169786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 169836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (cstr) 169936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton s.PutCString(cstr); 1700cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 1701cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1702cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_error.Fail()) 1703cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.Printf("<%s>", m_error.AsCString()); 1704cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleSummary) 1705cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no summary available>"); 1706cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleValue) 1707cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no value available>"); 1708cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleLanguageSpecific) 1709cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<not a valid Objective-C object>"); // edit this if we have other runtimes that support a description 1710cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 1711cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no printable representation>"); 1712cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1713cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1714cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // we should only return false here if we could not do *anything* 1715cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // even if we have an error message as output, that's a success 1716cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // from our callers' perspective, so return true 1717cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata var_success = true; 1718cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1719cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format != eFormatInvalid) 1720cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata SetFormat(eFormatDefault); 17211a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 17221c61743af946076e988d88baf725382e99d905deEnrico Granata 172386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return var_success; 1724886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 1725886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 172603e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 1727915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetAddressOf (bool scalar_is_load_address, AddressType *address_type) 1728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 1729afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1730e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return LLDB_INVALID_ADDRESS; 1731e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 1733f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 17357c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 1736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 1737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1738915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1739915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeLoad; 1740f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1743f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1744f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 1745f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 1746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 1747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1748915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1749915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = m_value.GetValueAddressType (); 1750f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1751f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1752f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1754915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (address_type) 1755915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeInvalid; 1756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 1757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 1758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 1760915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetPointerValue (AddressType *address_type) 176103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 17625c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton addr_t address = LLDB_INVALID_ADDRESS; 1763915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1764915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeInvalid; 1765e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1766afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1767e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return address; 1768e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 177003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 177103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 17727c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 1773915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 177403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 177503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 1776915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case Value::eValueTypeHostAddress: 177703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 177803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 177903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 178036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t data_offset = 0; 178103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 178203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 178303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 178403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 1785427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1786915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (address_type) 1787915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = GetAddressTypeOfChildren(); 1788427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 178903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 179003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 179103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1793651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico GranataValueObject::SetValueFromCString (const char *value_str, Error& error) 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1795651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.Clear(); 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 1798afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1799651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata { 1800651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to read value"); 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1802651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata } 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1804fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton uint64_t count = 0; 180552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const Encoding encoding = GetClangType().GetEncoding (count); 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1807bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1809574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Value::ValueType value_type = m_value.GetValueType(); 1810574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1811574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (value_type == Value::eValueTypeScalar) 1812574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1813574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If the value is already a scalar, then let the scalar change itself: 1814574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_value.GetScalar().SetValueFromCString (value_str, encoding, byte_size); 1815574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1816574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else if (byte_size <= Scalar::GetMaxByteSize()) 1817574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1818574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If the value fits in a scalar, then make a new scalar and again let the 1819574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // scalar code do the conversion, then figure out where to put the new value. 1820574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Scalar new_scalar; 1821574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham error = new_scalar.SetValueFromCString (value_str, encoding, byte_size); 1822574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (error.Success()) 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 182421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (value_type) 182521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 1826b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeLoadAddress: 1827574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1828574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If it is a load address, then the scalar value is the storage location 1829574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // of the data, and we have to shove this value down to that load location. 1830b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1831b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 1832b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process) 1833574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 18344a0a1252629a807d37ac252b0239f10204eddedcEnrico Granata addr_t target_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1835b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton size_t bytes_written = process->WriteScalarToMemory (target_addr, 1836b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton new_scalar, 1837b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1838b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton error); 1839651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata if (!error.Success()) 1840651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata return false; 1841651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata if (bytes_written != byte_size) 1842651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata { 1843651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to write value to memory"); 1844651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata return false; 1845651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata } 1846574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1847574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 184821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 1849b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeHostAddress: 1850574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1851574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If it is a host address, then we stuff the scalar as a DataBuffer into the Value's data. 1852574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham DataExtractor new_data; 1853574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham new_data.SetByteOrder (m_data.GetByteOrder()); 1854574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1855574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham DataBufferSP buffer_sp (new DataBufferHeap(byte_size, 0)); 1856574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_data.SetData(buffer_sp, 0); 1857574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham bool success = new_scalar.GetData(new_data); 1858574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (success) 1859574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1860b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton new_data.CopyByteOrderedData (0, 1861b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1862b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton const_cast<uint8_t *>(m_data.GetDataStart()), 1863b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1864b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_data.GetByteOrder()); 1865574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1866574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); 1867574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1868574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 186921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 1870b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeFileAddress: 1871b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeScalar: 18727c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 18737c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton break; 187421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1878574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return false; 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1880574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1881574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else 1882574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1883574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // We don't support setting things bigger than a scalar at present. 1884651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to write aggregate data type"); 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1887574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1888574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If we have reached this point, then we have successfully changed the value. 1889574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham SetNeedsUpdate(); 1890574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return true; 189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18930a19a1b9c25117854f226256805239d95153ed2dGreg Claytonbool 18940a19a1b9c25117854f226256805239d95153ed2dGreg ClaytonValueObject::GetDeclaration (Declaration &decl) 18950a19a1b9c25117854f226256805239d95153ed2dGreg Clayton{ 18960a19a1b9c25117854f226256805239d95153ed2dGreg Clayton decl.Clear(); 18970a19a1b9c25117854f226256805239d95153ed2dGreg Clayton return false; 18980a19a1b9c25117854f226256805239d95153ed2dGreg Clayton} 18990a19a1b9c25117854f226256805239d95153ed2dGreg Clayton 1900dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString 1901dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonValueObject::GetTypeName() 1902dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 190352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().GetConstTypeName(); 1904dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 1905dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 1906dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString 1907dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonValueObject::GetQualifiedTypeName() 1908dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 190952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().GetConstQualifiedTypeName(); 1910dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 1911dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 1912dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 19135c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonLanguageType 1914b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 1915b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 191652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().GetMinimumLanguage (); 1917b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 1918b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 192047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj) 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 192247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_synthetic_children[key] = valobj; 192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 192947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key); 193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 193147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = pos->second->GetSP(); 193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1935940ca9447d84a08883d2ce77a765475f09243fc5Greg Claytonuint32_t 193652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValueObject::GetTypeInfo (ClangASTType *pointee_or_element_clang_type) 1937940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton{ 193852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().GetTypeInfo (pointee_or_element_clang_type); 1939940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton} 1940940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton 194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 194452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().IsPointerType(); 194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194770c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool 194824b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType () 194924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 195052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().IsArrayType (NULL, NULL, NULL); 195124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 195224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 195324b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool 19549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType () 19559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 195652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().IsScalarType (); 19579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 19589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 19599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 196070c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed) 196170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{ 196252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().IsIntegerType (is_signed); 196370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham} 1964f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 196852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().IsPointerOrReferenceType (); 196982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 197082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 197182f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 1972917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType () 1973917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 19746b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 19756b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 19766b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (process) 19776b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata return process->IsPossibleDynamicValue(*this); 19786b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata else 197952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().IsPossibleDynamicType (NULL, true, true); 1980917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 1981917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 19823ce94041919b44e247c134663281acf3f696b094Enrico Granatabool 19833ce94041919b44e247c134663281acf3f696b094Enrico GranataValueObject::IsObjCNil () 19843ce94041919b44e247c134663281acf3f696b094Enrico Granata{ 198552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t mask = ClangASTType::eTypeIsObjC | ClangASTType::eTypeIsPointer; 198652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool isObjCpointer = (((GetClangType().GetTypeInfo(NULL)) & mask) == mask); 1987a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata if (!isObjCpointer) 1988a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata return false; 19893ce94041919b44e247c134663281acf3f696b094Enrico Granata bool canReadValue = true; 19903ce94041919b44e247c134663281acf3f696b094Enrico Granata bool isZero = GetValueAsUnsigned(0,&canReadValue) == 0; 1991a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata return canReadValue && isZero; 19923ce94041919b44e247c134663281acf3f696b094Enrico Granata} 19933ce94041919b44e247c134663281acf3f696b094Enrico Granata 19945c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 199536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMember (size_t index, bool can_create) 19966f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata{ 1997940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo (); 199852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_info & ClangASTType::eTypeIsArray) 19996f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return GetSyntheticArrayMemberFromArray(index, can_create); 20006f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 200152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_info & ClangASTType::eTypeIsPointer) 20026f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return GetSyntheticArrayMemberFromPointer(index, can_create); 20036f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 20046f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return ValueObjectSP(); 20056f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 20066f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 20076f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 200936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMemberFromPointer (size_t index, bool can_create) 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 201536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton snprintf(index_str, sizeof(index_str), "[%zu]", index); 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *synthetic_child; 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 202547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child = CreateChildAtIndex(0, true, index); 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 202847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (synthetic_child) 202947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham { 203047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham AddSyntheticChild(index_const_str, synthetic_child); 203147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = synthetic_child->GetSP(); 2032979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 2033886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->m_is_array_item_for_pointer = true; 203447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham } 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2039642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 204024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index 204124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array. 204224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as: 204324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection 204424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// { 204524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// uint32_t item_count; 204624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Item item_array[0]; 204724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// }; 204824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice 204924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array". 205024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 205124b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP 205236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMemberFromArray (size_t index, bool can_create) 205324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 205424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP synthetic_child_sp; 205524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (IsArrayType ()) 205624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 205724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton char index_str[64]; 205836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton snprintf(index_str, sizeof(index_str), "[%zu]", index); 205924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ConstString index_const_str(index_str); 206024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Check if we have already created a synthetic array member in this 206124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // valid object. If we have we will re-use it. 206224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = GetSyntheticChild (index_const_str); 206324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!synthetic_child_sp) 206424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 206524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObject *synthetic_child; 206624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // We haven't made a synthetic array member for INDEX yet, so 206724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // lets make one and cache it for any future reference. 206824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child = CreateChildAtIndex(0, true, index); 206924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 207024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Cache the value if we got one back... 207124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (synthetic_child) 207224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 207324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton AddSyntheticChild(index_const_str, synthetic_child); 207424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = synthetic_child->GetSP(); 2075979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 207624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp->m_is_array_item_for_pointer = true; 207724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 207824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 207924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 208024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return synthetic_child_sp; 208124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 208224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 20839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP 20849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create) 20859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 20869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP synthetic_child_sp; 20879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (IsScalarType ()) 20889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 20899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char index_str[64]; 20909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to); 20919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ConstString index_const_str(index_str); 20929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Check if we have already created a synthetic array member in this 20939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // valid object. If we have we will re-use it. 20949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = GetSyntheticChild (index_const_str); 20959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!synthetic_child_sp) 20969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 20979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // We haven't made a synthetic array member for INDEX yet, so 20989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // lets make one and cache it for any future reference. 209952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ValueObjectChild *synthetic_child = new ValueObjectChild (*this, 210052f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetClangType(), 210152f792329be5db8e38961350589e97e8f2823acdGreg Clayton index_const_str, 210252f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetByteSize(), 210352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, 210452f792329be5db8e38961350589e97e8f2823acdGreg Clayton to-from+1, 210552f792329be5db8e38961350589e97e8f2823acdGreg Clayton from, 210652f792329be5db8e38961350589e97e8f2823acdGreg Clayton false, 210752f792329be5db8e38961350589e97e8f2823acdGreg Clayton false, 210852f792329be5db8e38961350589e97e8f2823acdGreg Clayton eAddressTypeInvalid); 21099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 21109762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Cache the value if we got one back... 21119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (synthetic_child) 21129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 21139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata AddSyntheticChild(index_const_str, synthetic_child); 21149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = synthetic_child->GetSP(); 2115979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 21169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->m_is_bitfield_for_scalar = true; 21179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 21189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 21199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 21209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return synthetic_child_sp; 21216f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 21226f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 21235c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2124979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create) 2125979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 2126979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2127979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectSP synthetic_child_sp; 2128979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2129979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata char name_str[64]; 2130979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata snprintf(name_str, sizeof(name_str), "@%i", offset); 2131979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ConstString name_const_str(name_str); 2132979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2133979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // Check if we have already created a synthetic array member in this 2134979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // valid object. If we have we will re-use it. 2135979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = GetSyntheticChild (name_const_str); 2136979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2137979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child_sp.get()) 2138979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 2139979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2140979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (!can_create) 21415c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton return ValueObjectSP(); 2142979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2143979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectChild *synthetic_child = new ValueObjectChild(*this, 214452f792329be5db8e38961350589e97e8f2823acdGreg Clayton type, 2145979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_const_str, 214652f792329be5db8e38961350589e97e8f2823acdGreg Clayton type.GetByteSize(), 2147979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata offset, 2148979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 2149979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 2150979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata false, 2151915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata false, 2152915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 2153979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child) 2154979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 2155979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata AddSyntheticChild(name_const_str, synthetic_child); 2156979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = synthetic_child->GetSP(); 2157979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(name_const_str); 2158979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->m_is_child_at_offset = true; 2159979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 2160979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 2161979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 2162979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2163e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or -> 2164e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has 2165e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown 2166e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means 2167e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off 2168e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char* 2169e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression) 2170e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2171e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!expression || !expression[0]) 2172e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 2173e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '.') 2174e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+1; 2175e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '-' && expression[1] == '>') 2176e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+2; 2177e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 2178e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2179e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 21805c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2181e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create) 2182e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2183e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synthetic_child_sp; 2184e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ConstString name_const_string(expression); 2185e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Check if we have already created a synthetic array member in this 2186e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // valid object. If we have we will re-use it. 2187e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetSyntheticChild (name_const_string); 2188e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!synthetic_child_sp) 2189e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 2190e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // We haven't made a synthetic array member for expression yet, so 2191e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // lets make one and cache it for any future reference. 2192b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata synthetic_child_sp = GetValueForExpressionPath(expression, 2193b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata NULL, NULL, NULL, 2194b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata GetValueForExpressionPathOptions().DontAllowSyntheticChildren()); 2195e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2196e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Cache the value if we got one back... 2197e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (synthetic_child_sp.get()) 2198e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 219932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata // FIXME: this causes a "real" child to end up with its name changed to the contents of expression 2200e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata AddSyntheticChild(name_const_string, synthetic_child_sp.get()); 2201979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression))); 2202e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 2203e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 2204e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return synthetic_child_sp; 2205e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2206e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2207e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid 2208cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::CalculateSyntheticValue (bool use_synthetic) 2209e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2210cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (use_synthetic == false) 2211e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 2212e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2213dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata TargetSP target_sp(GetTargetSP()); 2214dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata if (target_sp && (target_sp->GetEnableSyntheticValue() == false || target_sp->GetSuppressSyntheticValue() == true)) 2215dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata { 2216dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata m_synthetic_value = NULL; 2217dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata return; 2218dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata } 2219dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata 22203d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp); 22213d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata 2222f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!UpdateFormatsIfNeeded() && m_synthetic_value) 2223cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return; 2224e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 22253069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_synthetic_children_sp.get() == NULL) 2226e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 2227e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 22283d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata if (current_synth_sp == m_synthetic_children_sp && m_synthetic_value) 22293d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata return; 22303d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata 2231cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp); 2232e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2233e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2234e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid 22355c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObject::CalculateDynamicValue (DynamicValueType use_dynamic) 2236642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 22375c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if (use_dynamic == eNoDynamicValues) 223810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return; 223910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 224047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (!m_dynamic_value && !IsDynamic()) 2241e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 2242b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 2243b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 22446b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (process && process->IsPossibleDynamicValue(*this)) 22453d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata { 22463d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata ClearDynamicTypeInformation (); 22476b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 22483d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata } 2249e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 2250e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham} 2251e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 225247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 225310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic) 2254e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{ 22555c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if (use_dynamic == eNoDynamicValues) 225610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return ValueObjectSP(); 225710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 225810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (!IsDynamic() && m_dynamic_value == NULL) 2259e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 226010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham CalculateDynamicValue(use_dynamic); 2261e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 226247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_dynamic_value) 226347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_dynamic_value->GetSP(); 226447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 226547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 2266642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 226766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 22681b42575189379cb0c1441f74a48127e9ab7335e3Jim InghamValueObjectSP 22691b42575189379cb0c1441f74a48127e9ab7335e3Jim InghamValueObject::GetStaticValue() 22701b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham{ 22711b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham return GetSP(); 22721b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham} 22731b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham 22744758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granatalldb::ValueObjectSP 22754758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico GranataValueObject::GetNonSyntheticValue () 22764758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata{ 22774758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata return GetSP(); 22784758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata} 22794758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata 2280e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP 2281cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::GetSyntheticValue (bool use_synthetic) 2282e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2283cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (use_synthetic == false) 2284cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2285cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 2286e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata CalculateSyntheticValue(use_synthetic); 2287e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2288e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_synthetic_value) 2289e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return m_synthetic_value->GetSP(); 2290e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata else 2291cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2292e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2293e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 229400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 2295f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico GranataValueObject::HasSyntheticValue() 2296f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata{ 2297f509c5ec066599a3399fced39ea36996184939e8Enrico Granata UpdateFormatsIfNeeded(); 2298f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 22993069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_synthetic_children_sp.get() == NULL) 2300f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 2301f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2302cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata CalculateSyntheticValue(true); 2303f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2304f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (m_synthetic_value) 2305f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return true; 2306f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2307f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 2308f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata} 2309f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2310f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granatabool 231100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 231200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 231300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 231400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 2315e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s); 231652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = GetClangType(); 231700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 231852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool this_had_base_class = clang_type.GetCXXClassName (cxx_class_name); 231900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 232000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 232100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 232200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 232300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 232400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 232500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 232600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 232700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 232800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 232900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 233000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 233100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 233200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 233300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 2334e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()) 233500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 2336e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()->IsBaseClass()) 2337e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent()->GetNonBaseClassParent(); 233800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 2339e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent(); 234000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 234100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 234200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 234366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 234466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 23451391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 2346bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 234700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 234800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 2349cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers) 23501c61743af946076e988d88baf725382e99d905deEnrico Granata { 23511391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely 23521391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName. 23531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // the eHonorPointers mode is meant to produce strings in this latter format 23541391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("*("); 23551391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 235600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 23571391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ValueObject* parent = GetParent(); 23581391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 23591391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (parent) 23601391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat); 2361886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 2362886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // if we are a deref_of_parent just because we are synthetic array 2363886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // members made up to allow ptr[%d] syntax to work in variable 2364886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // printing, then add our name ([%d]) to the expression path 2365cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_is_array_item_for_pointer && epformat == eGetExpressionPathFormatHonorPointers) 2366886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(m_name.AsCString()); 23671391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 236800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 236900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 237000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 2371bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 237200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 237300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 2374bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 237552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 237600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 237700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 2378cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (parent && parent->IsDereferenceOfParent() && epformat == eGetExpressionPathFormatHonorPointers) 237900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 238000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 238100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 23821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 23831391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 238452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t non_base_class_parent_type_info = non_base_class_parent_clang_type.GetTypeInfo(); 238552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 238652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (non_base_class_parent_type_info & ClangASTType::eTypeIsPointer) 23871391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 23881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("->"); 23891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 239052f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if ((non_base_class_parent_type_info & ClangASTType::eTypeHasChildren) && 239152f792329be5db8e38961350589e97e8f2823acdGreg Clayton !(non_base_class_parent_type_info & ClangASTType::eTypeIsArray)) 23921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 23931391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutChar('.'); 23941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 239500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 239600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 2397bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 239800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 239900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 240000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 2401bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 240200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 240300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 240400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 240500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 240600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 240700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 2408bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2409bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2410bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2412cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers) 24131c61743af946076e988d88baf725382e99d905deEnrico Granata { 241400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 24151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 2416bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 2417bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 24185c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2419ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression, 2420ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 2421ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 2422ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_value_type, 2423ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 2424ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* final_task_on_target) 2425ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 2426ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2427ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* dummy_first_unparsed; 242832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ExpressionPathScanEndReason dummy_reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnknown; 242932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ExpressionPathEndResultType dummy_final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2430cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2431ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2432ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 2433ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 2434ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 2435ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 2436ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 2437ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 2438ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2439cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing) 2440ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; 2441de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata 2442cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico 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 2443ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2444cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ( (final_task_on_target ? *final_task_on_target : dummy_final_task_on_target) == ValueObject::eExpressionPathAftermathDereference) 2445ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2446ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2447ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 2448ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 2449ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2450de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (reason_to_stop) 2451cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 2452de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_value_type) 2453cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2454ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2455ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2456ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2457ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2458de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_task_on_target) 2459cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2460ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 2461ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2462ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2463cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress) 2464ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2465ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2466ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 2467ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 2468ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2469de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (reason_to_stop) 2470cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed; 2471de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_value_type) 2472cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2473ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2474ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2475ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2476ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2477de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_task_on_target) 2478cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2479ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 2480ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2481ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2482ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2483ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; // final_task_on_target will still have its original value, so you know I did not do it 2484ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 2485ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 24861a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 24871a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression, 24885c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectListSP& list, 24891a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 24901a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 24911a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_value_type, 24921a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 24931a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* final_task_on_target) 24941a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 24951a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* dummy_first_unparsed; 24961a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 24971a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType dummy_final_value_type; 2498cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 24991a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25001a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 25011a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 25021a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 25031a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 25041a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 25051a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 25061a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25071a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!ret_val.get()) // if there are errors, I add nothing to the list 25081a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25091a102087f54079c25c8827afac6153a44ca535daEnrico Granata 251080731ec9368b8e1cbfe093fb9ec257457ef29133Enrico Granata if ( (reason_to_stop ? *reason_to_stop : dummy_reason_to_stop) != eExpressionPathScanEndReasonArrayRangeOperatorMet) 25111a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata // I need not expand a range, just post-process the final value and return 2513cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing) 25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 251880731ec9368b8e1cbfe093fb9ec257457ef29133Enrico 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 25191a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2520cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathDereference) 25211a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25221a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 25231a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 25241a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 25251a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25264a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (reason_to_stop) 25274a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 25284a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (final_value_type) 25294a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 25301a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25311a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25321a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25331a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2534cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 25351a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 25361a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25371a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25381a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 2539cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress) 25401a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25411a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 25431a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25454a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (reason_to_stop) 25464a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed; 25474a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (final_value_type) 25484a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 25491a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 25501a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25511a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25521a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2553cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 25541a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 25551a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25561a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25571a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25581a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25591a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25601a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25611a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25621a102087f54079c25c8827afac6153a44ca535daEnrico Granata return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed, 25631a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 25641a102087f54079c25c8827afac6153a44ca535daEnrico Granata ret_val, 25651a102087f54079c25c8827afac6153a44ca535daEnrico Granata list, 25661a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 25671a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 25681a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 25691a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 25701a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25711a102087f54079c25c8827afac6153a44ca535daEnrico Granata // in any non-covered case, just do the obviously right thing 25721a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 25731a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25741a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 25751a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25765c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2577ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr, 2578ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 2579ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 2580ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_result, 2581ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 2582ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* what_next) 2583ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 2584ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP root = GetSP(); 2585ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2586ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2587ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2588ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2589ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2590ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2591ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata while (true) 2592ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2593ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2594ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 2595ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 259652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType root_clang_type = root->GetClangType(); 259752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type; 259852f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags pointee_clang_type_info; 25991a102087f54079c25c8827afac6153a44ca535daEnrico Granata 260052f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags root_clang_type_info(root_clang_type.GetTypeInfo(&pointee_clang_type)); 26011a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 260252f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_clang_type_info.Reset(pointee_clang_type.GetTypeInfo()); 2603ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2604ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!expression_cstr || *expression_cstr == '\0') 2605ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2606cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2607ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2608ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2609ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2610ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata switch (*expression_cstr) 2611ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2612ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '-': 2613ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2614ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && 261552f792329be5db8e38961350589e97e8f2823acdGreg Clayton root_clang_type_info.Test(ClangASTType::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error 2616ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2617ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2618cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot; 2619cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2620ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2621ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 262252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root_clang_type_info.Test(ClangASTType::eTypeIsObjC) && // if yo are trying to extract an ObjC IVar when this is forbidden 262352f792329be5db8e38961350589e97e8f2823acdGreg Clayton root_clang_type_info.Test(ClangASTType::eTypeIsPointer) && 2624ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options.m_no_fragile_ivar) 2625ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2626ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2627cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed; 2628cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2629ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2630ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2631ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (expression_cstr[1] != '>') 2632ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2633ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2634cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2635cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2636ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2637ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2638ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip the - 2639ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2640ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '.': // or fallthrough from -> 2641ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2642ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' && 264352f792329be5db8e38961350589e97e8f2823acdGreg Clayton root_clang_type_info.Test(ClangASTType::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error 2644ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2645ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2646cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow; 2647cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2648ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2649ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2650ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip . 2651ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *next_separator = strpbrk(expression_cstr+1,"-.["); 2652ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString child_name; 2653ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!next_separator) // if no other separator just expand this last layer 2654ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2655ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCString (expression_cstr); 26569c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); 26579c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 26589c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if (child_valobj_sp.get()) // we know we are done, so just return 2659ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2660b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea *first_unparsed = ""; 2661cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2662cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 26639c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata return child_valobj_sp; 26649c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 26659c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else if (options.m_no_synthetic_children == false) // let's try with synthetic children 26669c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2667cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->IsSynthetic()) 2668b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata { 2669b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *first_unparsed = expression_cstr; 2670b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2671b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2672b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata return ValueObjectSP(); 2673b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata } 2674b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata 2675b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata child_valobj_sp = root->GetSyntheticValue(); 2676cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (child_valobj_sp.get()) 2677cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true); 26789c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 26799c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 26809c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP, 26819c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // so we hit the "else" branch, and return an error 26829c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if(child_valobj_sp.get()) // if it worked, just return 26839c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2684b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea *first_unparsed = ""; 2685cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2686cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 26879c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata return child_valobj_sp; 2688ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2689ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2690ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2691ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2692cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2693cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2694ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2695ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2696ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2697ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // other layers do expand 2698ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2699ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr); 27009c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); 27019c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if (child_valobj_sp.get()) // store the new root and move on 27029c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 27039c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata root = child_valobj_sp; 27049c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata *first_unparsed = next_separator; 2705cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 27069c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata continue; 27079c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 27089c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else if (options.m_no_synthetic_children == false) // let's try with synthetic children 27099c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2710b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata if (root->IsSynthetic()) 2711b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata { 2712b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *first_unparsed = expression_cstr; 2713b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2714b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2715b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata return ValueObjectSP(); 2716b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata } 2717b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata 2718cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = root->GetSyntheticValue(true); 2719cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (child_valobj_sp) 2720cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true); 27219c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 27229c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 27239c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP, 27249c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // so we hit the "else" branch, and return an error 27259c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if(child_valobj_sp.get()) // if it worked, move on 2726ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 27279c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata root = child_valobj_sp; 2728ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = next_separator; 2729cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 2730ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2731ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2732ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2733ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2734ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2735cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2736cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2737ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2738ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2739ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2740ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2741ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2742ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '[': 2743ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 274452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!root_clang_type_info.Test(ClangASTType::eTypeIsArray) && !root_clang_type_info.Test(ClangASTType::eTypeIsPointer) && !root_clang_type_info.Test(ClangASTType::eTypeIsVector)) // if this is not a T[] nor a T* 2745ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 274652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!root_clang_type_info.Test(ClangASTType::eTypeIsScalar)) // if this is not even a scalar... 2747ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2748f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (options.m_no_synthetic_children) // ...only chance left is synthetic 2749f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2750f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2751cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; 2752cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2753f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2754f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2755ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2756ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 2757ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2758ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2759cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; 2760cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2761ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2762ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2763ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2764ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 2765ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 276652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!root_clang_type_info.Test(ClangASTType::eTypeIsArray)) 2767ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2768ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2769cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 2770cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2771ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2772ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2773ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // even if something follows, we cannot expand unbounded ranges, just let the caller do it 2774ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2775ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2776cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 2777cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange; 2778ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2779ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2780ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2781ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 2782ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 2783ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 2784ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2785ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2786cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2787cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2788ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2789ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2790ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 2791ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2792ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2793ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 2794ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2795ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2796ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2797cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2798cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2799ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2800ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2801ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 2802ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 280352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root_clang_type_info.Test(ClangASTType::eTypeIsArray)) 2804ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2805ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2806cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 2807cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange; 2808ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2809ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2810ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2811ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2812ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2813cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 2814cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2815ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2816ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2818ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata // from here on we do have a valid index 281952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root_clang_type_info.Test(ClangASTType::eTypeIsArray)) 2820ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 282124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true); 282224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!child_valobj_sp) 282324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true); 2824f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!child_valobj_sp) 2825cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->HasSyntheticValue() && root->GetSyntheticValue()->GetNumChildren() > index) 2826cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = root->GetSyntheticValue()->GetChildAtIndex(index, true); 282724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (child_valobj_sp) 282824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 282924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton root = child_valobj_sp; 283024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *first_unparsed = end+1; // skip ] 2831cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 283224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton continue; 283324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 283424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton else 2835ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2836ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2837cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2838cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2839ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2840ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 284252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (root_clang_type_info.Test(ClangASTType::eTypeIsPointer)) 2843ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2844cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico 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 284552f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_clang_type_info.Test(ClangASTType::eTypeIsScalar)) 2846ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2847ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2848ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2849ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2850ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2851ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2852cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 2853cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2854ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2855ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2856ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2857ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2858cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = eExpressionPathAftermathNothing; 2859ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2860ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2861ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2862ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2863ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 286452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root->GetClangType().GetMinimumLanguage() == eLanguageTypeObjC 286552f792329be5db8e38961350589e97e8f2823acdGreg Clayton && pointee_clang_type_info.AllClear(ClangASTType::eTypeIsPointer) 2866dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && root->HasSyntheticValue() 2867dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && options.m_no_synthetic_children == false) 2868f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2869cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetSyntheticValue()->GetChildAtIndex(index, true); 2870f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2871f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2872f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 2873ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2874ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2875ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2876cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2877cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2878ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2879ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2880ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2881ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2882ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2883cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 2884ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2885ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2886ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2887ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 288852f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (root_clang_type_info.Test(ClangASTType::eTypeIsScalar)) 2889ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2890ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 2891ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2892ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2893ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2894cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2895cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2896ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2897ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2898ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 2899ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2900ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2901cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet; 2902cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; 2903ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2904ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2905ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 290652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (root_clang_type_info.Test(ClangASTType::eTypeIsVector)) 2907b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata { 2908b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata root = root->GetChildAtIndex(index, true); 2909b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata if (!root.get()) 2910b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata { 2911b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata *first_unparsed = expression_cstr; 2912b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2913b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2914b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata return ValueObjectSP(); 2915b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata } 2916b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata else 2917b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata { 2918b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata *first_unparsed = end+1; // skip ] 2919b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 2920b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata continue; 2921b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata } 2922b267bbd4df154a360bdb5ac0aedc5d2503740f9dEnrico Granata } 2923cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (options.m_no_synthetic_children == false) 2924f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2925cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->HasSyntheticValue()) 2926cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetSyntheticValue(); 2927cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (!root->IsSynthetic()) 2928cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 2929cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *first_unparsed = expression_cstr; 2930cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; 2931cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2932cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2933cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 2934cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // if we are here, then root itself is a synthetic VO.. should be good to go 2935cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 2936cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!root.get()) 2937cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 2938cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *first_unparsed = expression_cstr; 2939cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; 2940cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2941cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2942cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 2943cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetChildAtIndex(index, true); 2944f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!root.get()) 2945f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2946f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2947cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2948cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2949f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2950f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 29519c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else 29529c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 29539c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata *first_unparsed = end+1; // skip ] 2954cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 29559c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata continue; 29569c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 2957f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2958f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2959f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2960f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2961cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2962cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2963f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2964f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we have a low and a high index 2967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 2970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 2971ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2973cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2974cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 2978ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2980ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2981cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2982cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (index_lower > index_higher) // swap indices if required 2986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long temp = index_lower; 2988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_lower = index_higher; 2989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_higher = temp; 2990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 299152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root_clang_type_info.Test(ClangASTType::eTypeIsScalar)) // expansion only works for scalars 2992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 2994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2997cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2998cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 3000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 3002ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 3004cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet; 3005cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; 3006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 3007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 300952f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (root_clang_type_info.Test(ClangASTType::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 3010cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next == ValueObject::eExpressionPathAftermathDereference && 301152f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_clang_type_info.Test(ClangASTType::eTypeIsScalar)) 3012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 3014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 3015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 3016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 3018cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3019cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 3020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 3021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3022ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 3023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3024cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = ValueObject::eExpressionPathAftermathNothing; 3025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 3026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 3029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 3031cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 3032cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange; 3033ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 3034ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3036ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 3037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3038ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata default: // some non-separator is in the way 3039ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 3040ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 3041cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3042cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 3043ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 3044ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 3045ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3046ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3047ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 3048ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 3049ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 30501a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 30511a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr, 30521a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 30535c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP root, 30545c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectListSP& list, 30551a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 30561a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_result, 30571a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 30581a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* what_next) 30591a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 30601a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 30611a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30621a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30631a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 30641a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30651a102087f54079c25c8827afac6153a44ca535daEnrico Granata while (true) 30661a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30671a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30681a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 30691a102087f54079c25c8827afac6153a44ca535daEnrico Granata 307052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType root_clang_type = root->GetClangType(); 307152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type; 307252f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags pointee_clang_type_info; 307352f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags root_clang_type_info(root_clang_type.GetTypeInfo(&pointee_clang_type)); 30741a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 307552f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_clang_type_info.Reset(pointee_clang_type.GetTypeInfo()); 30761a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30771a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!expression_cstr || *expression_cstr == '\0') 30781a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3079cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 30801a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 30811a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 30821a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30831a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30841a102087f54079c25c8827afac6153a44ca535daEnrico Granata switch (*expression_cstr) 30851a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30861a102087f54079c25c8827afac6153a44ca535daEnrico Granata case '[': 30871a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 308852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!root_clang_type_info.Test(ClangASTType::eTypeIsArray) && !root_clang_type_info.Test(ClangASTType::eTypeIsPointer)) // if this is not a T[] nor a T* 30891a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 309052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!root_clang_type_info.Test(ClangASTType::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 30911a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30921a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3093cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; 3094cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 30951a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30961a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30971a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 30981a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30991a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3100cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; 3101cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31021a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31031a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31041a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31051a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 31061a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 310752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!root_clang_type_info.Test(ClangASTType::eTypeIsArray)) 31081a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31091a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3110cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 3111cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31121a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31131a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31141a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // expand this into list 31151a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 311636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_index = root->GetNumChildren() - 1; 311736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t index = 0; index < max_index; index++) 31181a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31191a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 31201a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 31211a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 31221a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31231a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 3124cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3125cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31261a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 31271a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31281a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31291a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 31301a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 31311a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 31321a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31331a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3134cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3135cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31361a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31371a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31381a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 31391a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31401a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 31411a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 31421a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 31431a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31441a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3145cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3146cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31471a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31481a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31491a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 31501a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 315152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root_clang_type_info.Test(ClangASTType::eTypeIsArray)) 31521a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 315336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_index = root->GetNumChildren() - 1; 315436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t index = 0; index < max_index; index++) 31551a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31561a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 31571a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 31581a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 31591a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31601a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 3161cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3162cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31631a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 31641a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31651a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31661a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31671a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3168cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 3169cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31701a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31711a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31721a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31731a102087f54079c25c8827afac6153a44ca535daEnrico Granata // from here on we do have a valid index 317452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root_clang_type_info.Test(ClangASTType::eTypeIsArray)) 31751a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31761a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetChildAtIndex(index, true); 31771a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 31781a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31791a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3180cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3181cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31821a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31831a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31841a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31851a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31861a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 31871a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3188cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3189cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31901a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 31911a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31921a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 319352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (root_clang_type_info.Test(ClangASTType::eTypeIsPointer)) 31941a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3195cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico 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 319652f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_clang_type_info.Test(ClangASTType::eTypeIsScalar)) 31971a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31981a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 31991a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 32001a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 32011a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32021a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3203cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3204cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32051a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32061a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32071a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32081a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3209cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = eExpressionPathAftermathNothing; 32101a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 32111a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32121a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32131a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32141a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32151a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 32161a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 32171a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32181a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3219cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3220cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32211a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32221a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32231a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32241a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32251a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 32261a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3227cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3228cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 32291a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 32301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32311a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32321a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32331a102087f54079c25c8827afac6153a44ca535daEnrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 32341a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32351a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 32361a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 32371a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32381a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3239cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3240cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32411a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32421a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32431a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 32441a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32451a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 32461a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3247cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3248cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 32491a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 32501a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32511a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32521a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32531a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we have a low and a high index 32541a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32551a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 32561a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 32571a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 32581a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32591a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3260cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3261cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32621a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32631a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32641a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 32651a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_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 if (index_lower > index_higher) // swap indices if required 32731a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32741a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long temp = index_lower; 32751a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_lower = index_higher; 32761a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_higher = temp; 32771a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 327852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (root_clang_type_info.Test(ClangASTType::eTypeIsScalar)) // expansion only works for scalars 32791a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32801a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 32811a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 32821a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32831a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3284cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3285cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32861a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32871a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32881a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32891a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32901a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 32911a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3292cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3293cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 32941a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 32951a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32961a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 329752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (root_clang_type_info.Test(ClangASTType::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 3298cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next == ValueObject::eExpressionPathAftermathDereference && 329952f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_clang_type_info.Test(ClangASTType::eTypeIsScalar)) 33001a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33011a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 33021a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 33031a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 33041a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33051a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3306cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3307cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 33081a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 33091a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33101a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 33111a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3312cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = ValueObject::eExpressionPathAftermathNothing; 33131a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 33141a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33151a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33161a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 33171a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33182bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (unsigned long index = index_lower; 33191a102087f54079c25c8827afac6153a44ca535daEnrico Granata index <= index_higher; index++) 33201a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33211a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 33221a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 33231a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 33241a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33251a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; 3326cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3327cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 33281a102087f54079c25c8827afac6153a44ca535daEnrico Granata return index_higher-index_lower+1; // tell me number of items I added to the VOList 33291a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33301a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33311a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 33321a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33331a102087f54079c25c8827afac6153a44ca535daEnrico Granata default: // some non-[ separator, or something entirely wrong, is in the way 33341a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 33351a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3336cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3337cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 33381a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 33391a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 33401a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33411a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33421a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 33431a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 33441a102087f54079c25c8827afac6153a44ca535daEnrico Granata 33453069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatastatic void 33463069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataDumpValueObject_Impl (Stream &s, 33473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj, 33483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const ValueObject::DumpValueObjectOptions& options, 33493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata uint32_t ptr_depth, 33503069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata uint32_t curr_depth) 335166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 335282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (valobj) 335366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3354f509c5ec066599a3399fced39ea36996184939e8Enrico Granata bool update_success = valobj->UpdateValueIfNeeded (true); 335582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 33563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const char *root_valobj_name = 33573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_root_valobj_name.empty() ? 33583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetName().AsCString() : 33593069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_root_valobj_name.c_str(); 33603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 33613069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (update_success && options.m_use_dynamic != eNoDynamicValues) 3362e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 33633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *dynamic_value = valobj->GetDynamicValue(options.m_use_dynamic).get(); 3364e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (dynamic_value) 3365e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham valobj = dynamic_value; 3366e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 3367e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 336852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = valobj->GetClangType(); 336952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const Flags type_flags (clang_type.GetTypeInfo ()); 3370bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 337152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool has_children = type_flags.Test (ClangASTType::eTypeHasChildren); 337252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool has_value = type_flags.Test (ClangASTType::eTypeHasValue); 3373bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 33743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const bool print_valobj = options.m_flat_output == false || has_value; 3375bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3376bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 337766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 33783069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_show_location) 3379bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3380fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham s.Printf("%s: ", valobj->GetLocationAsCString()); 3381bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 338266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3383bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 338412213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata 338512213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata bool show_type = true; 338612213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata // if we are at the root-level and been asked to hide the root's type, then hide it 338712213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata if (curr_depth == 0 && options.m_hide_root_type) 338812213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata show_type = false; 338912213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata else 339012213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata // otherwise decide according to the usual rules (asked to show types - always at the root level) 339112213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata show_type = options.m_show_types || (curr_depth == 0 && !options.m_flat_output); 339212213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata 339312213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata if (show_type) 3394c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton { 3395c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton // Some ValueObjects don't have types (like registers sets). Only print 3396c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton // the type if there is one to print 3397c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton ConstString qualified_type_name(valobj->GetQualifiedTypeName()); 3398c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton if (qualified_type_name) 3399c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton s.Printf("(%s) ", qualified_type_name.GetCString()); 3400c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton } 340166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 34023069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_flat_output) 3403bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3404b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 34053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const bool qualify_cxx_base_classes = options.m_show_types; 34064ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata if (!options.m_hide_name) 34074ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata { 34084ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata valobj->GetExpressionPath(s, qualify_cxx_base_classes); 34094ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.PutCString(" ="); 34104ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata } 3411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 34124ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata else if (!options.m_hide_name) 3413bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3414bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 3415bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 3416bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3417bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34183069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!options.m_scope_already_checked && !valobj->IsInScope()) 3419bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 342082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton err_cstr = "out of scope"; 3421bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 342266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 342366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 34243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string summary_str; 3425ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton std::string value_str; 3426bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 34271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char *sum_cstr = NULL; 34283069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata TypeSummaryImpl* entry = options.m_summary_sp ? options.m_summary_sp.get() : valobj->GetSummaryFormat().get(); 3429bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34303069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_omit_summary_depth > 0) 34317f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata entry = NULL; 34327f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata 34333ce94041919b44e247c134663281acf3f696b094Enrico Granata bool is_nil = valobj->IsObjCNil(); 34343ce94041919b44e247c134663281acf3f696b094Enrico Granata 3435bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 3436bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34373069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_format != eFormatDefault && options.m_format != valobj->GetFormat()) 3438ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton { 34393069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetValueAsCString(options.m_format, 34403069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata value_str); 3441ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton } 34423069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 3443ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton { 34443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata val_cstr = valobj->GetValueAsCString(); 34453069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (val_cstr) 34463069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata value_str = val_cstr; 3447ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton } 3448bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 3449bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 345066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 345166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 345266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 345382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton s.Printf (" <%s>\n", err_cstr); 345466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 345566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 345666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 345752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool is_ref = type_flags.Test (ClangASTType::eTypeIsReference); 3458bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3459bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34603ce94041919b44e247c134663281acf3f696b094Enrico Granata if (is_nil) 34613ce94041919b44e247c134663281acf3f696b094Enrico Granata sum_cstr = "nil"; 34623ce94041919b44e247c134663281acf3f696b094Enrico Granata else if (options.m_omit_summary_depth == 0) 34633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 34643069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_summary_sp) 34653069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 34663069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetSummaryAsCString(entry, summary_str); 34673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata sum_cstr = summary_str.c_str(); 34683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 34693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 34703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata sum_cstr = valobj->GetSummaryAsCString(); 34713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 347266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3473ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton // Make sure we have a value and make sure the summary didn't 34743ce94041919b44e247c134663281acf3f696b094Enrico Granata // specify that the value should not be printed - and do not print 34753ce94041919b44e247c134663281acf3f696b094Enrico Granata // the value if this thing is nil 34760c074cb9aa11e9da82058f4412281ddac706226fEnrico Granata // (but show the value if the user passes a format explicitly) 34770c074cb9aa11e9da82058f4412281ddac706226fEnrico Granata if (!is_nil && !value_str.empty() && (entry == NULL || (entry->DoesPrintValue() || options.m_format != eFormatDefault) || sum_cstr == NULL) && !options.m_hide_value) 3478ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton s.Printf(" %s", value_str.c_str()); 347966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 348090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (sum_cstr) 34813069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata s.Printf(" %s", sum_cstr); 3482bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34833ce94041919b44e247c134663281acf3f696b094Enrico Granata // let's avoid the overly verbose no description error for a nil thing 34843ce94041919b44e247c134663281acf3f696b094Enrico Granata if (options.m_use_objc && !is_nil) 3485bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34864ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata if (!options.m_hide_value || !options.m_hide_name) 34874ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf(" "); 3488fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const char *object_desc = valobj->GetObjectDescription(); 3489bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 34904ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf("%s\n", object_desc); 3491bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 34924ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf ("[no Objective-C description available]\n"); 3493bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 3494886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 349566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 349666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 34973069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (curr_depth < options.m_max_depth) 349866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3499f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 3500f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 3501f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 3502f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 3503f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 3504f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3505f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 3506f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 3507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 3508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 350952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool is_ptr = type_flags.Test (ClangASTType::eTypeIsPointer); 3510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 3511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 3513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 3514b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType ptr_address_type; 3515915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (valobj->GetPointerValue (&ptr_address_type) == 0) 3516f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 3517f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 3519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 3521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 3522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 3523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 3524f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 3525f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 3526f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 3528f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 3529f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 353066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3531886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr)) 353266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3533cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP synth_valobj_sp = valobj->GetSyntheticValue (options.m_use_synthetic); 3534c5e313844a41c9b22d2b0767f6310344ff550eabGreg Clayton ValueObject* synth_valobj = (synth_valobj_sp ? synth_valobj_sp.get() : valobj); 3535dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata 353636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_children = synth_valobj->GetNumChildren(); 3537018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata bool print_dotdotdot = false; 3538bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 353966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 35403069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_flat_output) 354166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3543bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 3544bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3545bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 35483f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 3549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 3550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3551018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 355236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_num_children = valobj->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 3553018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 35543069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (num_children > max_num_children && !options.m_ignore_cap) 3555018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 3556018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata num_children = max_num_children; 3557018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata print_dotdotdot = true; 3558018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 3559bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 35603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject::DumpValueObjectOptions child_options(options); 35614f5b299c1f5daf4cce9aad01471a6b558e5b13d2Enrico Granata child_options.SetFormat(options.m_format).SetSummary().SetRootValueObjectName(); 35624ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata child_options.SetScopeChecked(true).SetHideName(options.m_hide_name).SetHideValue(options.m_hide_value) 35633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata .SetOmitSummaryDepth(child_options.m_omit_summary_depth > 1 ? child_options.m_omit_summary_depth - 1 : 0); 356436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx=0; idx<num_children; ++idx) 3565bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3566f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObjectSP child_sp(synth_valobj->GetChildAtIndex(idx, true)); 3567bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 3568bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 35693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl (s, 35703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata child_sp.get(), 35713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata child_options, 35723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 35733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata curr_depth + 1); 3574bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3575bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3576bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 35773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!options.m_flat_output) 3578bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3579018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (print_dotdotdot) 3580db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata { 3581b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (valobj->GetExecutionContextRef()); 3582b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target *target = exe_ctx.GetTargetPtr(); 3583b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target) 3584b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton target->GetDebugger().GetCommandInterpreter().ChildrenTruncated(); 3585018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.Indent("...\n"); 3586db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata } 3587bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 3588bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 358966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 359066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 3591bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 3592bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3593bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 3594bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3595f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 3596bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3597bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3598bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3599bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3600bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 3601bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3602bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 360366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 3604bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3605bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 360666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 360766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 360866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 360966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 361066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3611bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 361266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3613bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 361466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 361566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 361666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 361766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 361866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 361966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 36203069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatavoid 36212aaf59d0bae48c120b0b04028c2a6d125777a708Greg ClaytonValueObject::LogValueObject (Log *log, 36222aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject *valobj) 36232aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton{ 36242aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (log && valobj) 36252aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton return LogValueObject (log, valobj, DumpValueObjectOptions::DefaultOptions()); 36262aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton} 36272aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton 36282aaf59d0bae48c120b0b04028c2a6d125777a708Greg Claytonvoid 36292aaf59d0bae48c120b0b04028c2a6d125777a708Greg ClaytonValueObject::LogValueObject (Log *log, 36302aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject *valobj, 36312aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton const DumpValueObjectOptions& options) 36322aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton{ 36332aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (log && valobj) 36342aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton { 36352aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton StreamString s; 36362aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject::DumpValueObject (s, valobj, options); 36372aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (s.GetSize()) 36382aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton log->PutCString(s.GetData()); 36392aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton } 36402aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton} 36412aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton 36422aaf59d0bae48c120b0b04028c2a6d125777a708Greg Claytonvoid 36433069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::DumpValueObject (Stream &s, 36443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj) 36453069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 36463069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 36473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!valobj) 36483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return; 36493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 36503069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl(s, 36513069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj, 36523069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObjectOptions::DefaultOptions(), 36533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 36543069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0); 36553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 36563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 36573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatavoid 36583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::DumpValueObject (Stream &s, 36593069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj, 36603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const DumpValueObjectOptions& options) 36613069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 36623069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl(s, 36633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj, 36643069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options, 36653069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_max_ptr_depth, // max pointer depth allowed, we will go down from here 36663069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0 // current object depth is 0 since we are just starting 36673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ); 36683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 3669427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3670427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 3671fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name) 3672427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3673427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 3674427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3675afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false) && m_error.Success()) 3676427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3677b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3678b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 3679b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton DataExtractor data; 3680b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetByteOrder (m_data.GetByteOrder()); 3681b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetAddressByteSize(m_data.GetAddressByteSize()); 3682b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 36834d609c92183905881daf1a601474a20e6949cc9aEnrico Granata if (IsBitfield()) 36844d609c92183905881daf1a601474a20e6949cc9aEnrico Granata { 36854d609c92183905881daf1a601474a20e6949cc9aEnrico Granata Value v(Scalar(GetValueAsUnsigned(UINT64_MAX))); 368652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_error = v.GetValueAsData (&exe_ctx, data, 0, GetModule().get()); 36874d609c92183905881daf1a601474a20e6949cc9aEnrico Granata } 36884d609c92183905881daf1a601474a20e6949cc9aEnrico Granata else 368952f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_error = m_value.GetValueAsData (&exe_ctx, data, 0, GetModule().get()); 3690b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 3691b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 3692b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetClangType(), 3693b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton name, 3694b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data, 3695b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetAddressOf()); 3696427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3697fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3698fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!valobj_sp) 3699427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 370047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (NULL, m_error); 3701427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3702427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 3703427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3704427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 37055c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 3706bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 3707427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 370847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 370947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 3710e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3711c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 3712c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 3713427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3714427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 371524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = false; 3716427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3717427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 3718427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 3719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 3720427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 3721427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 3722427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 372300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 3724427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 372552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = GetClangType(); 372652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType child_clang_type; 372758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 3728b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 372958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 373052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_clang_type = clang_type.GetChildClangTypeAtIndex (&exe_ctx, 373152f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetName().GetCString(), 373252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, 373352f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 373452f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 373552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 373652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name_str, 373752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 373852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 373952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 374052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 374152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 374252f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent); 3743a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 3744427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3745427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 3746427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 3747427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 3748427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 374947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj = new ValueObjectChild (*this, 375047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_clang_type, 375147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_name, 375247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_size, 375347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_offset, 375447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_size, 375547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_offset, 375647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_base_class, 3757915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata child_is_deref_of_parent, 3758915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 3759427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3760427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3761c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 376247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 3763c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3764c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 376547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 3766c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3767427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 3768427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3769c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 3770b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 3771c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3772c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 3773c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 3774c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 3775c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 377647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 3777427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3778427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3779427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 37805c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 3781c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 3782427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3783e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_addr_of_valobj_sp) 3784e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3785e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3786b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeInvalid; 3787427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 3788915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t addr = GetAddressOf (scalar_is_load_address, &address_type); 3789c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 3790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 3791427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3792427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 3793427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3794427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 3795c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3796c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 3797b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 3798c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 3799c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3801c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3802427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 3803427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 3804427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 3805427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 380652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = GetClangType(); 380752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type) 3808427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3809427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 3810427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 3811b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3812b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_addr_of_valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 381352f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_type.GetPointerType(), 381447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ConstString (name.c_str()), 381547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham addr, 381647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeInvalid, 381747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_data.GetAddressByteSize()); 3818427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3821427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3822427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 38232c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan else 38242c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan { 38252c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan StreamString expr_path_strm; 38262c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan GetExpressionPath(expr_path_strm, true); 38272c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan error.SetErrorStringWithFormat("'%s' doesn't have a valid address", expr_path_strm.GetString().c_str()); 38282c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan } 38292c810873d43f228341a272000349b2a6f4dcfb5aSean Callanan 3830e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3831427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3832427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 38334e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg ClaytonValueObjectSP 38344e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg ClaytonValueObject::Cast (const ClangASTType &clang_ast_type) 38354e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg Clayton{ 38360a19a1b9c25117854f226256805239d95153ed2dGreg Clayton return ValueObjectCast::Create (*this, GetName(), clang_ast_type); 38374e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg Clayton} 38380039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38395c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 38400039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type) 38410039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 38425c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP valobj_sp; 38430039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 3844915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t ptr_value = GetPointerValue (&address_type); 38450039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38460039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 38470039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 38483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address ptr_addr (ptr_value); 3849b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3850b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(), 38510039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 38520039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 38530039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton clang_ast_type); 38540039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 38550039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 38560039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 38570039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38585c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 38590039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp) 38600039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 38615c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP valobj_sp; 38620039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 3863915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t ptr_value = GetPointerValue (&address_type); 38640039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 38650039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 38660039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 38673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address ptr_addr (ptr_value); 3868b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3869b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(), 38700039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 38710039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 38720039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton type_sp); 38730039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 38740039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 38750039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 38760039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 3877fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () : 3878b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3879b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(), 3880b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_needs_update (true), 3881b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3882fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3883fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3884fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3885fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected): 3886b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3887b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(), 3888fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update (true), 3889b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3890fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3891b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(exe_scope); 3892b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton TargetSP target_sp (exe_ctx.GetTargetSP()); 3893b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target_sp) 3894fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3895b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetTargetSP (target_sp); 3896b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessSP process_sp (exe_ctx.GetProcessSP()); 3897b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!process_sp) 3898b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton process_sp = target_sp->GetProcessSP(); 3899fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3900b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process_sp) 3901fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3902b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id = process_sp->GetModID(); 3903b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetProcessSP (process_sp); 390421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 3905b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 3906fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3907b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!thread_sp) 3908fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3909fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3910b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 3911fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3912fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3913b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (thread_sp) 3914fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3915b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetThreadSP(thread_sp); 3916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3917b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrameSP frame_sp (exe_ctx.GetFrameSP()); 3918b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!frame_sp) 3919fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3920fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3921b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton frame_sp = thread_sp->GetSelectedFrame(); 3922fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3923b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (frame_sp) 3924b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetFrameSP(frame_sp); 3925fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3926fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3927fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3928fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3929fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) : 3931b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3932b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(rhs.m_exe_ctx_ref), 3933b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_needs_update (true), 3934b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3935fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3936fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3937fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3938fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint () 3939fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3940fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3941fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3942fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state. If the current 3943fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return 3944fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change". If the current state is different, we update our state, and return 3945fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change". If we did see a change, we also set m_needs_update to true, so 3946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true. 39477c53768e700f9181082072017976472e3ad9cc37Jim Ingham// exe_scope will be set to the current execution context scope. 3948fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3950b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg ClaytonValueObject::EvaluationPoint::SyncWithProcessState() 3951fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 39521586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 39531586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // Start with the target, if it is NULL, then we're obviously not going to get any further: 3954b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(m_exe_ctx_ref.Lock()); 39551586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3956b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (exe_ctx.GetTargetPtr() == NULL) 39571586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham return false; 39581586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3959fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we don't have a process nothing can change. 3960b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 3961b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process == NULL) 3962fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 39631586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3964fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If our stop id is the current stop ID, nothing has changed: 3965b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessModID current_mod_id = process->GetModID(); 396621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 3967e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // If the current stop id is 0, either we haven't run yet, or the process state has been cleared. 3968e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // In either case, we aren't going to be able to sync with the process state. 396921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (current_mod_id.GetStopID() == 0) 3970e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return false; 39717c53768e700f9181082072017976472e3ad9cc37Jim Ingham 39724a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton bool changed = false; 39734a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton const bool was_valid = m_mod_id.IsValid(); 39744a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (was_valid) 3975c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton { 3976c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_mod_id == current_mod_id) 3977c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton { 39789175f662273509b1260cff1e077a3a398ccc07d5Jim Ingham // Everything is already up to date in this object, no need to 3979c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton // update the execution context scope. 39807c53768e700f9181082072017976472e3ad9cc37Jim Ingham changed = false; 3981c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton } 39827c53768e700f9181082072017976472e3ad9cc37Jim Ingham else 39837c53768e700f9181082072017976472e3ad9cc37Jim Ingham { 39847c53768e700f9181082072017976472e3ad9cc37Jim Ingham m_mod_id = current_mod_id; 39857c53768e700f9181082072017976472e3ad9cc37Jim Ingham m_needs_update = true; 39867c53768e700f9181082072017976472e3ad9cc37Jim Ingham changed = true; 39877c53768e700f9181082072017976472e3ad9cc37Jim Ingham } 3988c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton } 3989fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 39901586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // Now re-look up the thread and frame in case the underlying objects have gone away & been recreated. 39911586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // That way we'll be sure to return a valid exe_scope. 39921586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // If we used to have a thread or a frame but can't find it anymore, then mark ourselves as invalid. 3993fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3994b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (m_exe_ctx_ref.HasThreadRef()) 3995fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3996b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP()); 3997b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (thread_sp) 3998fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3999b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (m_exe_ctx_ref.HasFrameRef()) 4000fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 4001b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP()); 4002b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!frame_sp) 4003b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 4004b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton // We used to have a frame, but now it is gone 4005fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetInvalid(); 40064a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton changed = was_valid; 4007b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 4008fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 4009fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 4010b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton else 4011b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 4012b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton // We used to have a thread, but now it is gone 4013b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton SetInvalid(); 40144a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton changed = was_valid; 4015b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 4016b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 4017fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 40187c53768e700f9181082072017976472e3ad9cc37Jim Ingham return changed; 4019fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 4020fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 4021ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid 4022ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated () 4023ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{ 4024b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); 4025b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process_sp) 4026b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id = process_sp->GetModID(); 4027ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_first_update = false; 4028ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_needs_update = false; 4029ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham} 4030ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 4031ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 4032f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 4033f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid 4034cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::ClearUserVisibleData(uint32_t clear_mask) 4035f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{ 4036cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsValue) == eClearUserVisibleDataItemsValue) 4037cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_value_str.clear(); 4038cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4039cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsLocation) == eClearUserVisibleDataItemsLocation) 4040cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_location_str.clear(); 4041cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4042cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsSummary) == eClearUserVisibleDataItemsSummary) 4043cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 4044cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_summary_str.clear(); 4045cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 4046cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4047cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsDescription) == eClearUserVisibleDataItemsDescription) 4048cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_object_desc_str.clear(); 4049cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4050cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) == eClearUserVisibleDataItemsSyntheticChildren) 4051cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 4052cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_synthetic_value) 4053cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value = NULL; 4054cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 40552bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen} 4056915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 4057915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataSymbolContextScope * 4058915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetSymbolContextScope() 4059915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 4060915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (m_parent) 4061915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 4062915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (!m_parent->IsPointerOrReferenceType()) 4063915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_parent->GetSymbolContextScope(); 4064915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 4065915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return NULL; 4066915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 4067f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4068f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4069f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromExpression (const char* name, 4070f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* expression, 4071f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx) 4072f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4073f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP retval_sp; 4074f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::TargetSP target_sp(exe_ctx.GetTargetSP()); 4075f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target_sp) 4076f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4077f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!expression || !*expression) 4078f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4079f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target_sp->EvaluateExpression (expression, 4080f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata exe_ctx.GetFrameSP().get(), 4081f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata retval_sp); 4082f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (retval_sp && name && *name) 4083f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata retval_sp->SetName(ConstString(name)); 4084f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4085f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 4086f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4087f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4088f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromAddress (const char* name, 4089f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t address, 4090f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx, 4091f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType type) 4092f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 409352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type) 4094f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 409552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointer_type(type.GetPointerType()); 409652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointer_type) 409752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 409852f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); 409952f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 410052f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointer_type, 410152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ConstString(name), 410252f792329be5db8e38961350589e97e8f2823acdGreg Clayton buffer, 410352f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::endian::InlHostByteOrder(), 410452f792329be5db8e38961350589e97e8f2823acdGreg Clayton exe_ctx.GetAddressByteSize())); 410552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ptr_result_valobj_sp) 410652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 410752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress); 410852f792329be5db8e38961350589e97e8f2823acdGreg Clayton Error err; 410952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err); 411052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ptr_result_valobj_sp && name && *name) 411152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ptr_result_valobj_sp->SetName(ConstString(name)); 411252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 411352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ptr_result_valobj_sp; 411452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 4115f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 411652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::ValueObjectSP(); 4117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 4118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4120f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromData (const char* name, 4121f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata DataExtractor& data, 4122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx, 4123f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType type) 4124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4125f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP new_value_sp; 4126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 412752f792329be5db8e38961350589e97e8f2823acdGreg Clayton type, 4128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ConstString(name), 4129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata data, 4130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata LLDB_INVALID_ADDRESS); 4131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad); 4132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (new_value_sp && name && *name) 4133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp->SetName(ConstString(name)); 4134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return new_value_sp; 4135f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 41363b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 41373b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataModuleSP 41383b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetModule () 41393b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 41403b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* root(GetRoot()); 41413b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (root != this) 41423b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return root->GetModule(); 41433b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return lldb::ModuleSP(); 41443b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 41453b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 41463b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject* 41473b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetRoot () 41483b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 41493b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (m_root) 41503b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return m_root; 41513b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* parent = m_parent; 41523b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (!parent) 41533b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return (m_root = this); 41543b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata while (parent->m_parent) 41553b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 41563b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (parent->m_root) 41573b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return (m_root = parent->m_root); 41583b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata parent = parent->m_parent; 41593b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 41603b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return (m_root = parent); 41613b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 41623b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 41633b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataAddressType 41643b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetAddressTypeOfChildren() 41653b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 41663b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid) 41673b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 41683b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* root(GetRoot()); 41693b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (root != this) 41703b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return root->GetAddressTypeOfChildren(); 41713b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 41723b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return m_address_type_of_ptr_or_ref_children; 41733b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 41743b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata 41753b83055d13d30e8b10a15d04cd0619265e029158Enrico Granatalldb::DynamicValueType 41763b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetDynamicValueType () 41773b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 41783b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata ValueObject* with_dv_info = this; 41793b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata while (with_dv_info) 41803b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 41813b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (with_dv_info->HasDynamicValueTypeInfo()) 41823b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return with_dv_info->GetDynamicValueTypeImpl(); 41833b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata with_dv_info = with_dv_info->m_parent; 41843b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 41853b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return lldb::eNoDynamicValues; 41863b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 4187f0e769c7f32a6568c10ef10befaf6a682136cabbEnrico Granata 41883b83055d13d30e8b10a15d04cd0619265e029158Enrico Granatalldb::Format 41893b83055d13d30e8b10a15d04cd0619265e029158Enrico GranataValueObject::GetFormat () const 41903b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata{ 41913b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata const ValueObject* with_fmt_info = this; 41923b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata while (with_fmt_info) 41933b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata { 41943b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata if (with_fmt_info->m_format != lldb::eFormatDefault) 41953b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return with_fmt_info->m_format; 41963b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata with_fmt_info = with_fmt_info->m_parent; 41973b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata } 41983b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata return m_format; 41993b83055d13d30e8b10a15d04cd0619265e029158Enrico Granata} 4200