ValueObject.cpp revision 6aac8440da7f1548de96ea897ba9b7fe38268f3f
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), 67dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (parent.GetUpdatePoint ()), 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name (), 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data (), 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value (), 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error (), 7217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_str (), 7317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_old_value_str (), 7417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_location_str (), 7517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_summary_str (), 764ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str (), 7747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(parent.GetManager()), 7817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children (), 7917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_synthetic_children (), 8047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 81e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 8247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 8311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton m_format (eFormatDefault), 8423ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 853069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_summary_sp(), 863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_format_sp(), 873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_synthetic_children_sp(), 8821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 8997c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_address_type_of_ptr_or_ref_children(eAddressTypeInvalid), 9017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid (false), 9117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change (false), 9217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid (false), 93427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_old_value_valid (false), 941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 95886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 97979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 98931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_is_getting_summary(false), 99931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type(false) 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject(this); 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 107915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::ValueObject (ExecutionContextScope *exe_scope, 108915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata AddressType child_ptr_or_ref_addr_type) : 109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham UserID (++g_value_obj_uid), // Unique identifier for every value object 110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parent (NULL), 111dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_update_point (exe_scope), 112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_name (), 113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_data (), 114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value (), 115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error (), 116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_str (), 117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str (), 118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_location_str (), 119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_summary_str (), 120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_object_desc_str (), 12147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager(), 122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children (), 123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_synthetic_children (), 12447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_dynamic_value (NULL), 125e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata m_synthetic_value(NULL), 12647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj(NULL), 127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_format (eFormatDefault), 12823ba377314a2836f491c650c86e50766e741dcf2Enrico Granata m_last_format_mgr_revision(0), 1293069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_summary_sp(), 1303069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_type_format_sp(), 1313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_synthetic_children_sp(), 13221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_user_id_of_forced_summary(), 13397c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type), 134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_is_valid (false), 135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_value_did_change (false), 136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_children_count_valid (false), 137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid (false), 1381391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_is_deref_of_parent (false), 139886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_is_array_item_for_pointer(false), 1409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata m_is_bitfield_for_scalar(false), 141979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata m_is_child_at_offset(false), 142931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_is_getting_summary(false), 143931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type(false) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager = new ValueObjectManager(); 14647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_manager->ManageObject (this); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor 151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//---------------------------------------------------------------------- 152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject () 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 157886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format) 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1591391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 160915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool did_change_formats = false; 161915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 162886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (update_format) 163f509c5ec066599a3399fced39ea36996184939e8Enrico Granata did_change_formats = UpdateFormatsIfNeeded(); 1641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 165d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // If this is a constant value, then our success is predicated on whether 166d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton // we have an error or not 167d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton if (GetIsConstant()) 168915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 169915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // if you were asked to update your formatters, but did not get a chance to do it 170915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // clear your own values (this serves the purpose of faking a stop-id for frozen 171915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // objects (which are regarded as constant, but could have changes behind their backs 172915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // because of the frozen-pointer depth limit) 173915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // TODO: decouple summary from value and then remove this code and only force-clear the summary 174915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (update_format && !did_change_formats) 175cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsSummary); 176d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton return m_error.Success(); 177915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 178d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton 179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham bool first_update = m_update_point.IsFirstEvaluation(); 180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_update_point.NeedsUpdating()) 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_update_point.SetUpdated(); 184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // Save the old value using swap to avoid a string copy which 186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // also will clear our m_value_str 187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_value_str.empty()) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = false; 190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_valid = true; 194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_old_value_str.swap (m_value_str); 195cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsValue); 196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata ClearUserVisibleData(); 199f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 20021c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton if (IsInScope()) 20121c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton { 20221c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton const bool value_was_valid = GetValueIsValid(); 203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueDidChange (false); 20421c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 20521c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton m_error.Clear(); 20621c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 20721c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // Call the pure virtual function to update the value 20821c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton bool success = UpdateValue (); 20921c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 21021c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueIsValid (success); 21121c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton 21221c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton if (first_update) 21321c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueDidChange (false); 21421c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton else if (!m_value_did_change && success == false) 21521c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton { 21621c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // The value wasn't gotten successfully, so we mark this 21721c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton // as changed if the value used to be valid and now isn't 21821c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton SetValueDidChange (value_was_valid); 21921c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton } 22021c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton } 22121c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton else 222fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 22321c8dcfccb1dfe5584ccbe50fb09a44e1994dedeGreg Clayton m_error.SetErrorString("out of scope"); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error.Success(); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 229915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatabool 230f509c5ec066599a3399fced39ea36996184939e8Enrico GranataValueObject::UpdateFormatsIfNeeded() 2311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{ 232979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 233979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (log) 2347b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[%s %p] checking for FormatManager revisions. ValueObject rev: %d - Global rev: %d", 235979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata GetName().GetCString(), 2367b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata this, 2371391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata m_last_format_mgr_revision, 2381c61743af946076e988d88baf725382e99d905deEnrico Granata DataVisualization::GetCurrentRevision()); 239915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 240915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata bool any_change = false; 241915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 242f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if ( (m_last_format_mgr_revision != DataVisualization::GetCurrentRevision())) 2431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 2443b23d2097b526c6326b7b7c56d5fc84884d4e08bEnrico Granata SetValueFormat(DataVisualization::ValueFormats::GetFormat (*this, eNoDynamicValues)); 245f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSummaryFormat(DataVisualization::GetSummaryFormat (*this, GetDynamicValueType())); 24645c47aabcb6b1b3861fd15e8cbe2fc7d7d44a71fJason Molenda#ifndef LLDB_DISABLE_PYTHON 247f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSyntheticChildren(DataVisualization::GetSyntheticChildren (*this, GetDynamicValueType())); 24845c47aabcb6b1b3861fd15e8cbe2fc7d7d44a71fJason Molenda#endif 2498a717e596312951672ecd8c54df2d255e6da20baEnrico Granata 2501c61743af946076e988d88baf725382e99d905deEnrico Granata m_last_format_mgr_revision = DataVisualization::GetCurrentRevision(); 251716a6286f8fd6d5d0e5da218c34317a16f5baa50Enrico Granata 252716a6286f8fd6d5d0e5da218c34317a16f5baa50Enrico Granata any_change = true; 2531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 254915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 255915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return any_change; 256915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 2571391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata} 2581391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 259574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Inghamvoid 260574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim InghamValueObject::SetNeedsUpdate () 261574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham{ 262574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_update_point.SetNeedsUpdate(); 263574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // We have to clear the value string here so ConstResult children will notice if their values are 264574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // changed by hand (i.e. with SetValueAsCString). 265cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ClearUserVisibleData(eClearUserVisibleDataItemsValue); 266574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham} 267574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 2680b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granatavoid 2693d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico GranataValueObject::ClearDynamicTypeInformation () 2700b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata{ 2710b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata m_did_calculate_complete_objc_class_type = false; 2723d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata m_last_format_mgr_revision = 0; 2730b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata m_override_type = ClangASTType(); 2743d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetValueFormat(lldb::TypeFormatImplSP()); 2753d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetSummaryFormat(lldb::TypeSummaryImplSP()); 2763d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata SetSyntheticChildren(lldb::SyntheticChildrenSP()); 2770b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata} 2780b2be9dd62618a8e0fd88599b5e081a9c3c47e7eEnrico Granata 279931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananClangASTType 280931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::MaybeCalculateCompleteType () 281931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 282931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType ret(GetClangASTImpl(), GetClangTypeImpl()); 283940dd18789f83f28a618a9b588376c8bae557347Sean Callanan 284931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (m_did_calculate_complete_objc_class_type) 285931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 286931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (m_override_type.IsValid()) 287931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return m_override_type; 288931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 289931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 290931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 291931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 292931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan clang_type_t ast_type(GetClangTypeImpl()); 293931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan clang_type_t class_type; 294931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan bool is_pointer_type; 295931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 296931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (ClangASTContext::IsObjCObjectPointerType(ast_type, &class_type)) 297931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 298931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan is_pointer_type = true; 299931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 300931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else if (ClangASTContext::IsObjCClassType(ast_type)) 301931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 302931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan is_pointer_type = false; 303931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan class_type = ast_type; 304931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 305931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 306931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 307931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 308931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 309931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 310931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_did_calculate_complete_objc_class_type = true; 311931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 312931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!class_type) 313931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 314931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 315931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan std::string class_name; 316931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 317931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!ClangASTContext::GetObjCClassName(class_type, class_name)) 318931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 319931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 320931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ProcessSP process_sp(GetUpdatePoint().GetExecutionContextRef().GetProcessSP()); 321931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 322931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!process_sp) 323931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 324931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 325931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ObjCLanguageRuntime *objc_language_runtime(process_sp->GetObjCLanguageRuntime()); 326931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 327931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!objc_language_runtime) 328931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 329931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 330931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ConstString class_name_cs(class_name.c_str()); 331931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 332931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan TypeSP complete_objc_class_type_sp = objc_language_runtime->LookupInCompleteClassCache(class_name_cs); 333931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 334931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!complete_objc_class_type_sp) 335931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 336931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 337931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType complete_class(complete_objc_class_type_sp->GetClangAST(), 338931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan complete_objc_class_type_sp->GetClangFullType()); 339931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 340931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (!ClangASTContext::GetCompleteType(complete_class.GetASTContext(), 341931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan complete_class.GetOpaqueQualType())) 342931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return ret; 343931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 344931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan if (is_pointer_type) 345931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 346931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan clang_type_t pointer_type = ClangASTContext::CreatePointerType(complete_class.GetASTContext(), 347931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan complete_class.GetOpaqueQualType()); 348931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 349931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_override_type = ClangASTType(complete_class.GetASTContext(), 350931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan pointer_type); 351931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 352931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan else 353931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan { 354931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan m_override_type = complete_class; 355931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan } 356931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 357940dd18789f83f28a618a9b588376c8bae557347Sean Callanan if (m_override_type.IsValid()) 358940dd18789f83f28a618a9b588376c8bae557347Sean Callanan return m_override_type; 359940dd18789f83f28a618a9b588376c8bae557347Sean Callanan else 360940dd18789f83f28a618a9b588376c8bae557347Sean Callanan return ret; 361931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 362931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 363931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananclang::ASTContext * 364931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::GetClangAST () 365931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 366931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType type = MaybeCalculateCompleteType(); 367931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 368931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return type.GetASTContext(); 369931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 370931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 371931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callananlldb::clang_type_t 372931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObject::GetClangType () 373931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{ 374931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan ClangASTType type = MaybeCalculateCompleteType(); 375931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 376931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan return type.GetOpaqueQualType(); 377931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan} 378931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor & 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 382afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data; 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error & 387bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError() 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 389afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error; 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_name; 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 400fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString () 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 402afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false)) 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_location_str.empty()) 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString sstr; 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value.GetValueType()) 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeScalar: 4117c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 4126916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterInfo *reg_info = m_value.GetRegisterInfo(); 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info->name) 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->name; 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (reg_info->alt_name) 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str = reg_info->alt_name; 4217c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton 4227c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton m_location_str = (reg_info->encoding == lldb::eEncodingVector) ? "vector" : "scalar"; 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeLoadAddress: 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeFileAddress: 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case Value::eValueTypeHostAddress: 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2; 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS)); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_location_str.swap(sstr.GetString()); 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_location_str.c_str(); 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue & 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value & 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 455fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar) 4560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 457c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything 458c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata { 459b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 460574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Value tmp_value(m_value); 461574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham scalar = tmp_value.ResolveValue(&exe_ctx, GetClangAST ()); 4621716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton if (scalar.IsValid()) 4631716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton { 4641716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton const uint32_t bitfield_bit_size = GetBitfieldBitSize(); 4651716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton if (bitfield_bit_size) 4661716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return scalar.ExtractBitfield (bitfield_bit_size, GetBitfieldBitOffset()); 4671716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return true; 4681716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton } 469c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata } 4701716ad73618aab3cff4d82c3adc11a88ef76273dGreg Clayton return false; 4710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 4720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 4730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool 47417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_is_valid; 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b) 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_is_valid = b; 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 487fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange () 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 489fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham GetValueAsCString (); 49017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton return m_value_did_change; 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed) 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_value_did_change = value_changed; 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 50036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndex (size_t idx, bool can_create) 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 503917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 505afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (idx < GetNumChildren()) 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check if we have already made the child value object? 50906cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata if (can_create && !m_children.HasChildAtIndex(idx)) 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // No we haven't created the child at this index, so lets have our 512917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // subclass do it and cache the result for quick future access. 51306cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata m_children.SetChildAtIndex(idx,CreateChildAtIndex (idx, false, 0)); 514e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 515917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 51606cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata ValueObject* child = m_children.GetChildAtIndex(idx); 51706cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata if (child != NULL) 51806cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata return child->GetSP(); 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 523b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataValueObjectSP 52436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::initializer_list<size_t>& idxs, 52536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 526b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 527b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 528b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 529b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 53036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx : idxs) 531b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 532b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx, true); 533b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 534b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 535b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 536b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx; 537b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 538b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 539b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 540b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 541b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 542b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 543b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataValueObjectSP 54436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::initializer_list< std::pair<size_t, bool> >& idxs, 54536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 546b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 547b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 548b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 549b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 55036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (std::pair<size_t, bool> idx : idxs) 551b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 552b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx.first, idx.second); 553b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 554b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 555b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 556b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx.first; 557b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 558b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 559b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 560b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 561b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 562b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 563b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb::ValueObjectSP 56436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::vector<size_t> &idxs, 56536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 566b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 567b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 568b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 569b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 57036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx : idxs) 571b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 572b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx, true); 573b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 574b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 575b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 576b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx; 577b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 578b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 579b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 580b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 581b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 582b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 583b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb::ValueObjectSP 58436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetChildAtIndexPath (const std::vector< std::pair<size_t, bool> > &idxs, 58536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t* index_of_error) 586b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 587b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (idxs.size() == 0) 588b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return GetSP(); 589b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP root(GetSP()); 59036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (std::pair<size_t, bool> idx : idxs) 591b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 592b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata root = root->GetChildAtIndex(idx.first, idx.second); 593b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!root) 594b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 595b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (index_of_error) 596b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata *index_of_error = idx.first; 597b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 598b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 599b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 600b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return root; 601b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 602b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 60336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name) 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes = true; 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::GetIndexOfChildWithName (GetClangAST(), 608462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton GetClangType(), 609427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.GetCString(), 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create) 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6165d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // when getting a child by name, it could be buried inside some base 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // classes (which really aren't part of the expression path), so we 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // need a vector of indexes that can get us down to the correct child 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP child_sp; 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 621917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We may need to update our value if we are dynamic 622917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (IsPossibleDynamicType ()) 623afb7c85df796f74262917e44dd68f668dade3911Enrico Granata UpdateValueIfNeeded(false); 624917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 625917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t> child_indexes; 626917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 627917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton void *clang_type = GetClangType(); 628917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 629917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const size_t num_child_indexes = ClangASTContext::GetIndexOfChildMemberWithName (clang_ast, 630917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 631917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton name.GetCString(), 632917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 633917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_indexes); 634917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (num_child_indexes > 0) 635e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 636917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator pos = child_indexes.begin (); 637917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::vector<uint32_t>::const_iterator end = child_indexes.end (); 638e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 639917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = GetChildAtIndex(*pos, can_create); 640917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton for (++pos; pos != end; ++pos) 641917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 642917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (child_sp) 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 644917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create)); 645917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp = new_child_sp; 646917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 647917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 648917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 649917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_sp.reset(); 650e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 651917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_sp; 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren () 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 661dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata UpdateValueIfNeeded(); 66217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton if (!m_children_count_valid) 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNumChildren (CalculateNumChildren()); 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66606cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata return m_children.GetChildrenCount(); 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66854037b1488e3344575714d8358728e042fa801c7Greg Clayton 66954037b1488e3344575714d8358728e042fa801c7Greg Claytonbool 67054037b1488e3344575714d8358728e042fa801c7Greg ClaytonValueObject::MightHaveChildren() 67154037b1488e3344575714d8358728e042fa801c7Greg Clayton{ 672b8080cb01bb09038eaab15b34be058611c3e7885Enrico Granata bool has_children = false; 673940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo(); 674940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (type_info) 67554037b1488e3344575714d8358728e042fa801c7Greg Clayton { 67654037b1488e3344575714d8358728e042fa801c7Greg Clayton if (type_info & (ClangASTContext::eTypeHasChildren | 67754037b1488e3344575714d8358728e042fa801c7Greg Clayton ClangASTContext::eTypeIsPointer | 67854037b1488e3344575714d8358728e042fa801c7Greg Clayton ClangASTContext::eTypeIsReference)) 67954037b1488e3344575714d8358728e042fa801c7Greg Clayton has_children = true; 68054037b1488e3344575714d8358728e042fa801c7Greg Clayton } 68154037b1488e3344575714d8358728e042fa801c7Greg Clayton else 68254037b1488e3344575714d8358728e042fa801c7Greg Clayton { 68354037b1488e3344575714d8358728e042fa801c7Greg Clayton has_children = GetNumChildren () > 0; 68454037b1488e3344575714d8358728e042fa801c7Greg Clayton } 68554037b1488e3344575714d8358728e042fa801c7Greg Clayton return has_children; 68654037b1488e3344575714d8358728e042fa801c7Greg Clayton} 68754037b1488e3344575714d8358728e042fa801c7Greg Clayton 68854037b1488e3344575714d8358728e042fa801c7Greg Clayton// Should only be called by ValueObject::GetNumChildren() 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 69036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::SetNumChildren (size_t num_children) 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton m_children_count_valid = true; 69306cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata m_children.SetChildrenCount(num_children); 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name) 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name = name; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 70336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index) 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 705bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham ValueObject *valobj = NULL; 706e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 707917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool omit_empty_base_classes = true; 70824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = synthetic_array_member; 709917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton std::string child_name_str; 710917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_byte_size = 0; 711917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton int32_t child_byte_offset = 0; 712917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_size = 0; 713917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton uint32_t child_bitfield_bit_offset = 0; 714917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_base_class = false; 715917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool child_is_deref_of_parent = false; 716917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 717917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool transparent_pointers = synthetic_array_member == false; 718917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 719917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t clang_type = GetClangType(); 720917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type_t child_clang_type; 721917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 722b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 723917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 724917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 725917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 726917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetName().GetCString(), 727917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_type, 728917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton idx, 729917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton transparent_pointers, 730917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton omit_empty_base_classes, 73124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 732917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name_str, 733917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 734917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 735917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 736917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 737917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 738917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_deref_of_parent); 739b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton if (child_clang_type) 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 741917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (synthetic_index) 742917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset += child_byte_size * synthetic_index; 743917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 744917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton ConstString child_name; 745917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!child_name_str.empty()) 746917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name.SetCString (child_name_str.c_str()); 747917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 748917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton valobj = new ValueObjectChild (*this, 749917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton clang_ast, 750917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_clang_type, 751917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_name, 752917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_size, 753917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_byte_offset, 754917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_size, 755917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_bitfield_bit_offset, 756917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton child_is_base_class, 757915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata child_is_deref_of_parent, 758915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 759915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata //if (valobj) 760915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata // valobj->SetAddressTypeOfChildren(eAddressTypeInvalid); 761915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 762e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 76347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7663069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatabool 7673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetSummaryAsCString (TypeSummaryImpl* summary_ptr, 7683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string& destination) 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.clear(); 7713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 7723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // ideally we would like to bail out if passing NULL, but if we do so 7733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // we end up not providing the summary for function pointers anymore 7743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (/*summary_ptr == NULL ||*/ m_is_getting_summary) 7753069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return false; 776ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton 777ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton m_is_getting_summary = true; 77863aa63418b3444bf7dd6e32e8320533390124402Enrico Granata 77963aa63418b3444bf7dd6e32e8320533390124402Enrico Granata // this is a hot path in code and we prefer to avoid setting this string all too often also clearing out other 78063aa63418b3444bf7dd6e32e8320533390124402Enrico Granata // information that we might care to see in a crash log. might be useful in very specific situations though. 78163aa63418b3444bf7dd6e32e8320533390124402Enrico Granata /*Host::SetCrashDescriptionWithFormat("Trying to fetch a summary for %s %s. Summary provider's description is %s", 78263aa63418b3444bf7dd6e32e8320533390124402Enrico Granata GetTypeName().GetCString(), 78363aa63418b3444bf7dd6e32e8320533390124402Enrico Granata GetName().GetCString(), 78463aa63418b3444bf7dd6e32e8320533390124402Enrico Granata summary_ptr->GetDescription().c_str());*/ 78563aa63418b3444bf7dd6e32e8320533390124402Enrico Granata 7863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded (false)) 7873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 7883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (summary_ptr) 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 790cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (HasSyntheticValue()) 791cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value->UpdateValueIfNeeded(); // the summary might depend on the synthetic children being up-to-date (e.g. ${svar%#}) 792cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata summary_ptr->FormatObject(this, destination); 7933069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 7943069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 7953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 7963069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t clang_type = GetClangType(); 7973069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 7983069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // Do some default printout for function pointers 7993069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (clang_type) 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8013069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata StreamString sstr; 8023069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t elem_or_pointee_clang_type; 8033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, 8043069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata GetClangAST(), 8053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata &elem_or_pointee_clang_type)); 8063069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8073069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (ClangASTContext::IsFunctionPointerType (clang_type)) 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8093069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata AddressType func_ptr_address_type = eAddressTypeInvalid; 8103069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata addr_t func_ptr_address = GetPointerValue (&func_ptr_address_type); 8113069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8133069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata switch (func_ptr_address_type) 814fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 815b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeInvalid: 816b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeFile: 817b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 8183069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 819b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeLoad: 8203069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8213069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 8223069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8233069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address so_addr; 8243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 8253069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (target && target->GetSectionLoadList().IsEmpty() == false) 82603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 8273069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) 82803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 8293069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata so_addr.Dump (&sstr, 8303069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata exe_ctx.GetBestExecutionContextScope(), 8313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address::DumpStyleResolvedDescription, 8323069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata Address::DumpStyleSectionNameOffset); 83303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 834f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata } 8353069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 836b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 8373069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 838b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case eAddressTypeHost: 839b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton break; 840b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8423069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (sstr.GetSize() > 0) 8433069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.assign (1, '('); 8453069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.append (sstr.GetData(), sstr.GetSize()); 8463069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.append (1, ')'); 8473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 852ae4ca1b4c35673322847856952579b5ebc9b8a57Greg Clayton m_is_getting_summary = false; 8533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return !destination.empty(); 8543069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 8553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 8563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granataconst char * 8573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetSummaryAsCString () 8583069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 8593069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded(true) && m_summary_str.empty()) 8603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 8613069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata GetSummaryAsCString(GetSummaryFormat().get(), 8623069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_summary_str); 8633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_summary_str.empty()) 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_summary_str.c_str(); 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8691a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool 8701a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer) 8711a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 8721a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 873940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const Flags type_flags (GetTypeInfo (&elem_or_pointee_clang_type)); 8741a102087f54079c25c8827afac6153a44ca535daEnrico Granata bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 875940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton ClangASTContext::IsCharType (elem_or_pointee_clang_type)); 8761a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!is_char_arr_ptr) 8771a102087f54079c25c8827afac6153a44ca535daEnrico Granata return false; 8781a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!check_pointer) 8791a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 8801a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.Test(ClangASTContext::eTypeIsArray)) 8811a102087f54079c25c8827afac6153a44ca535daEnrico Granata return true; 8825c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton addr_t cstr_address = LLDB_INVALID_ADDRESS; 8831a102087f54079c25c8827afac6153a44ca535daEnrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 884915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata cstr_address = GetAddressOf (true, &cstr_address_type); 8851a102087f54079c25c8827afac6153a44ca535daEnrico Granata return (cstr_address != LLDB_INVALID_ADDRESS); 8861a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 8871a102087f54079c25c8827afac6153a44ca535daEnrico Granata 888915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatasize_t 889915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetPointeeData (DataExtractor& data, 890915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t item_idx, 891915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t item_count) 892915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 893940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton clang_type_t pointee_or_element_clang_type; 894940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo (&pointee_or_element_clang_type); 895940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const bool is_pointer_type = type_info & ClangASTContext::eTypeIsPointer; 896940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const bool is_array_type = type_info & ClangASTContext::eTypeIsArray; 897940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (!(is_pointer_type || is_array_type)) 898915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 899915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 900915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (item_count == 0) 901915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 902915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 903940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton clang::ASTContext *ast = GetClangAST(); 904940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton ClangASTType pointee_or_element_type(ast, pointee_or_element_clang_type); 905915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 906940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint64_t item_type_size = pointee_or_element_type.GetClangTypeByteSize(); 907915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 908915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata const uint64_t bytes = item_count * item_type_size; 909915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 910915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata const uint64_t offset = item_idx * item_type_size; 911915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 912915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (item_idx == 0 && item_count == 1) // simply a deref 913915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 914940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (is_pointer_type) 915915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 916915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Error error; 917915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata ValueObjectSP pointee_sp = Dereference(error); 918915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Fail() || pointee_sp.get() == NULL) 919915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 920915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return pointee_sp->GetDataExtractor().Copy(data); 921915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 922915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata else 923915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 924915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata ValueObjectSP child_sp = GetChildAtIndex(0, true); 925915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (child_sp.get() == NULL) 926915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 927915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return child_sp->GetDataExtractor().Copy(data); 928915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 929915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return true; 930915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 931915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata else /* (items > 1) */ 932915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 933915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Error error; 934915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata lldb_private::DataBufferHeap* heap_buf_ptr = NULL; 935915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata lldb::DataBufferSP data_sp(heap_buf_ptr = new lldb_private::DataBufferHeap()); 936915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 937915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata AddressType addr_type; 938940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton lldb::addr_t addr = is_pointer_type ? GetPointerValue(&addr_type) : GetAddressOf(true, &addr_type); 939915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 940915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata switch (addr_type) 941915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 942915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeFile: 943915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 9443508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (GetModule()); 9453508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 946915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 947f4b54c8cd1523da2fa70d7397b2bb93a49421a34Enrico Granata addr = addr + offset; 948915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata Address so_addr; 9493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton module_sp->ResolveFileAddress(addr, so_addr); 950b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 951b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target* target = exe_ctx.GetTargetPtr(); 952b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target) 953915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 954b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton heap_buf_ptr->SetByteSize(bytes); 955b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton size_t bytes_read = target->ReadMemory(so_addr, false, heap_buf_ptr->GetBytes(), bytes, error); 956b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (error.Success()) 957915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 958b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetData(data_sp); 959b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton return bytes_read; 960915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 961915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 962915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 963915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 964915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 965915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeLoad: 966915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 967b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 968b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 969915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (process) 970915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 971915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata heap_buf_ptr->SetByteSize(bytes); 972915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata size_t bytes_read = process->ReadMemory(addr + offset, heap_buf_ptr->GetBytes(), bytes, error); 973915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Success()) 974915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 975915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetData(data_sp); 976915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return bytes_read; 977915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 978915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 979915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 980915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 981915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeHost: 982915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 983940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton ClangASTType valobj_type(ast, GetClangType()); 984940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton uint64_t max_bytes = valobj_type.GetClangTypeByteSize(); 985940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (max_bytes > offset) 986940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton { 987940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton size_t bytes_read = std::min<uint64_t>(max_bytes - offset, bytes); 988940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton heap_buf_ptr->CopyData((uint8_t*)(addr + offset), bytes_read); 989940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton data.SetData(data_sp); 990940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return bytes_read; 991940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton } 992915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 993915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 994915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case eAddressTypeInvalid: 995915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata break; 996915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 997915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 998915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 999915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 1000915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1001fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t 1002915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetData (DataExtractor& data) 1003915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 1004915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata UpdateValueIfNeeded(false); 1005b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 10063508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Error error = m_value.GetValueAsData(&exe_ctx, GetClangAST(), data, 0, GetModule().get()); 1007915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (error.Fail()) 1008915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return 0; 1009915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetAddressByteSize(m_data.GetAddressByteSize()); 1010915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata data.SetByteOrder(m_data.GetByteOrder()); 1011915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return data.GetByteSize(); 1012915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 1013915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 1014915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// will compute strlen(str), but without consuming more than 1015915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// maxlen bytes out of str (this serves the purpose of reading 1016915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// chunks of a string without having to worry about 1017915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// missing NULL terminators in the chunk) 1018915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// of course, if strlen(str) > maxlen, the function will return 1019915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// maxlen_value (which should be != maxlen, because that allows you 1020915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// to know whether strlen(str) == maxlen or strlen(str) > maxlen) 1021915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatastatic uint32_t 1022915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatastrlen_or_inf (const char* str, 1023915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t maxlen, 1024915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t maxlen_value) 1025915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 1026915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata uint32_t len = 0; 1027103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton if (str) 1028915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 1029103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton while(*str) 1030103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton { 1031103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton len++;str++; 1032940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (len >= maxlen) 1033103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton return maxlen_value; 1034103780899f5d73dc11d9c4371f5f355b67b3910dGreg Clayton } 1035915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 1036915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return len; 1037915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 1038915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 103932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatasize_t 1040b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg ClaytonValueObject::ReadPointedString (Stream& s, 1041b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Error& error, 1042b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_length, 1043b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton bool honor_array, 1044b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Format item_format) 10451a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 1046b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1047b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target* target = exe_ctx.GetTargetPtr(); 1048b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 104915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (!target) 105015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 105115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "<no target to read from>"; 105215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("no target to read from"); 105315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata return 0; 105415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 105515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 105615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (max_length == 0) 1057b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton max_length = target->GetMaximumSizeOfStringSummary(); 10581a102087f54079c25c8827afac6153a44ca535daEnrico Granata 105932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata size_t bytes_read = 0; 106032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata size_t total_bytes_read = 0; 106132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 10621a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t clang_type = GetClangType(); 10631a102087f54079c25c8827afac6153a44ca535daEnrico Granata clang_type_t elem_or_pointee_clang_type; 1064940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const Flags type_flags (GetTypeInfo (&elem_or_pointee_clang_type)); 10651a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) && 10661a102087f54079c25c8827afac6153a44ca535daEnrico Granata ClangASTContext::IsCharType (elem_or_pointee_clang_type)) 10671a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 106815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata addr_t cstr_address = LLDB_INVALID_ADDRESS; 106915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata AddressType cstr_address_type = eAddressTypeInvalid; 107015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 107115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t cstr_len = 0; 107215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bool capped_data = false; 107315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (type_flags.Test (ClangASTContext::eTypeIsArray)) 1074b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 107515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // We have an array 107615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len = ClangASTContext::GetArraySize (clang_type); 107715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len > max_length) 107815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 107915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata capped_data = true; 108015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len = max_length; 108115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 108215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_address = GetAddressOf (true, &cstr_address_type); 1083b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 1084b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton else 1085b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 108615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // We have a pointer 108715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_address = GetPointerValue (&cstr_address_type); 108815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 108915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 109015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_address == 0 || cstr_address == LLDB_INVALID_ADDRESS) 109115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 109215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "<invalid address>"; 109315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("invalid address"); 109415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata return 0; 109515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 109615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 109715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata Address cstr_so_addr (cstr_address); 109815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata DataExtractor data; 109915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len > 0 && honor_array) 110015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 110115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host 110215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this 110315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata GetPointeeData(data, 0, cstr_len); 110415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 110515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if ((bytes_read = data.GetByteSize()) > 0) 1106b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 110715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata total_bytes_read = bytes_read; 110815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 110915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata data.Dump (&s, 111015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // Start offset in "data" 111115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata item_format, 111215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 1, // Size of item (1 byte for a char!) 111315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bytes_read, // How many bytes to print? 111415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata UINT32_MAX, // num per line 111515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata LLDB_INVALID_ADDRESS,// base address 111615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // bitfield bit size 111715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0); // bitfield bit offset 111815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (capped_data) 111915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "..."; 112015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 1121b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 112215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 112315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata else 112415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 112515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len = max_length; 112615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata const size_t k_max_buf_size = 64; 112715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 112815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t offset = 0; 112915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 113015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata int cstr_len_displayed = -1; 113115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata bool capped_cstr = false; 113215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host 113315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this 113415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata while ((bytes_read = GetPointeeData(data, offset, k_max_buf_size)) > 0) 11351a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 113615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata total_bytes_read += bytes_read; 113715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata const char *cstr = data.PeekCStr(0); 113815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata size_t len = strlen_or_inf (cstr, k_max_buf_size, k_max_buf_size+1); 113915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > k_max_buf_size) 114015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = k_max_buf_size; 114115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr && cstr_len_displayed < 0) 114215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 114315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 114415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len_displayed < 0) 114515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len_displayed = len; 114615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 114715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len == 0) 114815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 114915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len_displayed += len; 115015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > bytes_read) 115115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = bytes_read; 115215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len > cstr_len) 115315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len = cstr_len; 115415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 115515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata data.Dump (&s, 115615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // Start offset in "data" 115715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata item_format, 115815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 1, // Size of item (1 byte for a char!) 115915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata len, // How many bytes to print? 116015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata UINT32_MAX, // num per line 116115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata LLDB_INVALID_ADDRESS,// base address 116215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0, // bitfield bit size 116315905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 0); // bitfield bit offset 116415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 116515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len < k_max_buf_size) 116615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 116715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 116815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (len >= cstr_len) 1169979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 117015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata capped_cstr = true; 117115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata break; 1172979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1173b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 117415905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata cstr_len -= len; 117515905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata offset += len; 117615905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata } 117715905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata 117815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (cstr_len_displayed >= 0) 117915905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata { 118015905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << '"'; 118115905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata if (capped_cstr) 118215905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata s << "..."; 11831a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 1184b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 11851a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 11861a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 11871a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 118815905ae1ddfed87b9ab62f8e10c1e1f919bbf0e3Enrico Granata error.SetErrorString("not a string object"); 1189979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata s << "<not a string object>"; 11901a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 119132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return total_bytes_read; 11921a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 11931a102087f54079c25c8827afac6153a44ca535daEnrico Granata 11944ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char * 1195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription () 11964ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{ 1197886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 11987dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata if (!UpdateValueIfNeeded (true)) 11994ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 1200886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1201886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (!m_object_desc_str.empty()) 1202886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return m_object_desc_str.c_str(); 1203886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 1204b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1205b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 1206b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham if (process == NULL) 12074ae519666628cca07c194bf677163009cc2e5a8bJim Ingham return NULL; 1208b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 1209b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham StreamString s; 12104ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 12115c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton LanguageType language = GetObjectRuntimeLanguage(); 1212b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham LanguageRuntime *runtime = process->GetLanguageRuntime(language); 12134ae519666628cca07c194bf677163009cc2e5a8bJim Ingham 12140e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (runtime == NULL) 12150e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 121670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway... 12170e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham clang_type_t opaque_qual_type = GetClangType(); 12180e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham if (opaque_qual_type != NULL) 12190e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham { 122070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham bool is_signed; 122170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed) 122270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham || ClangASTContext::IsPointerType (opaque_qual_type)) 122370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham { 12245c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton runtime = process->GetLanguageRuntime(eLanguageTypeObjC); 122570c55622e15857e232cf4777a502fa5fe40e785bJim Ingham } 12260e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 12270e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham } 12280e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham 12290de37195f17fefb536157b3296a18999116b8125Jim Ingham if (runtime && runtime->GetObjectDescription(s, *this)) 12304ae519666628cca07c194bf677163009cc2e5a8bJim Ingham { 12314ae519666628cca07c194bf677163009cc2e5a8bJim Ingham m_object_desc_str.append (s.GetData()); 12324ae519666628cca07c194bf677163009cc2e5a8bJim Ingham } 1233e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan 1234e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan if (m_object_desc_str.empty()) 1235e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return NULL; 1236e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan else 1237e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan return m_object_desc_str.c_str(); 12384ae519666628cca07c194bf677163009cc2e5a8bJim Ingham} 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12403069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatabool 12413069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::GetValueAsCString (lldb::Format format, 12423069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string& destination) 12433069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 12443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == false && 12453069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata UpdateValueIfNeeded(false)) 12463069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 12473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const Value::ContextType context_type = m_value.GetContextType(); 12483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 12493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata switch (context_type) 12503069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 12513069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeClangType: 12523069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeLLDBType: 12533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeVariable: 12543069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 12553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t clang_type = GetClangType (); 12563069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (clang_type) 12573069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 125860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata // put custom bytes to display in this DataExtractor to override the default value logic 125960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata lldb_private::DataExtractor special_format_data; 126060dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata clang::ASTContext* ast = GetClangAST(); 126160dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata Flags type_flags(ClangASTContext::GetTypeInfo(clang_type, ast, NULL)); 12626aac8440da7f1548de96ea897ba9b7fe38268f3fEnrico Granata if (format == eFormatCString) 126360dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 12646aac8440da7f1548de96ea897ba9b7fe38268f3fEnrico Granata if (type_flags.Test(ClangASTContext::eTypeIsPointer) && !type_flags.Test(ClangASTContext::eTypeIsObjC)) 126560dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 126660dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata // if we are dumping a pointer as a c-string, get the pointee data as a string 126760dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata TargetSP target_sp(GetTargetSP()); 126860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata if (target_sp) 126960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata { 127060dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata size_t max_len = target_sp->GetMaximumSizeOfStringSummary(); 127160dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata Error error; 127260dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata DataBufferSP buffer_sp(new DataBufferHeap(max_len+1,0)); 127360dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata Address address(GetPointerValue()); 127460dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata if (target_sp->ReadCStringFromMemory(address, (char*)buffer_sp->GetBytes(), max_len, error) && error.Success()) 127560dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata special_format_data.SetData(buffer_sp); 127660dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 127760dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 127860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata } 127960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata 12803069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata StreamString sstr; 12813069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 128260dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata ClangASTType::DumpTypeValue (ast, // The clang AST 128360dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata clang_type, // The clang type to display 128460dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata &sstr, // The stream to use for display 128560dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata format, // Format to display this type with 128660dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata special_format_data.GetByteSize() ? 128760dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata special_format_data: m_data, // Data to extract from 128860dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata 0, // Byte offset into "m_data" 128960dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata GetByteSize(), // Byte size of item in "m_data" 129060dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata GetBitfieldBitSize(), // Bitfield bit size 129160dd5277eb7fee611f3e411a68eb2303c9ad9dfeEnrico Granata GetBitfieldBitOffset(), // Bitfield bit offset 12923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata exe_ctx.GetBestExecutionContextScope()); 12933069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // Don't set the m_error to anything here otherwise 12943069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // we won't be able to re-format as anything else. The 12953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // code for ClangASTType::DumpTypeValue() should always 12963069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // return something, even if that something contains 12973069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // an error messsage. "m_error" is used to detect errors 12983069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata // when reading the valid object, not for formatting errors. 12993069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (sstr.GetString().empty()) 13003069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.clear(); 13013069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 13023069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.swap(sstr.GetString()); 13033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13043069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13053069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata break; 13063069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 13073069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata case Value::eContextTypeRegisterInfo: 13083069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13093069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 13103069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (reg_info) 13113069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13123069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 13133069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 13143069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata StreamString reg_sstr; 13153069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata m_data.Dump (®_sstr, 13163069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 13173069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata format, 13183069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata reg_info->byte_size, 13193069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 1, 13203069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata UINT32_MAX, 13213069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata LLDB_INVALID_ADDRESS, 13223069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 13233069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 13243069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata exe_ctx.GetBestExecutionContextScope()); 13253069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata destination.swap(reg_sstr.GetString()); 13263069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13273069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13283069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata break; 13293069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 13303069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata default: 13313069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata break; 13323069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13333069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return !destination.empty(); 13343069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13353069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 13363069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return false; 13373069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 13383069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 1340fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString () 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13423069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (UpdateValueIfNeeded(true) && m_value_str.empty()) 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13443069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata lldb::Format my_format = GetFormat(); 13454f5b299c1f5daf4cce9aad01471a6b558e5b13d2Enrico Granata if (my_format == lldb::eFormatDefault) 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_type_format_sp) 13483069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = m_type_format_sp->GetFormat(); 13493069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13513069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_is_bitfield_for_scalar) 13523069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = eFormatUnsigned; 13533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13553069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = m_value.GetRegisterInfo(); 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 13593069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = reg_info->format; 13603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 13613069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 13623069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 13633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata clang_type_t clang_type = GetClangType (); 13643069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata my_format = ClangASTType::GetFormat(clang_type); 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136980e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata if (GetValueAsCString(my_format, m_value_str)) 137080e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata { 137180e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata if (!m_value_did_change && m_old_value_valid) 137280e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata { 137380e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata // The value was gotten successfully, so we consider the 137480e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata // value as changed if the value string differs 137580e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata SetValueDidChange (m_old_value_str != m_value_str); 137680e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata } 137780e7b0f178413d7bbb5affd532feee2106b7000fEnrico Granata } 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value_str.empty()) 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_str.c_str(); 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1384afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used 1385afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers 138637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonuint64_t 1387e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny ChenValueObject::GetValueAsUnsigned (uint64_t fail_value, bool *success) 1388afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{ 1389afb7c85df796f74262917e44dd68f668dade3911Enrico Granata // If our byte size is zero this is an aggregate type that has children 1390afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == false) 1391afb7c85df796f74262917e44dd68f668dade3911Enrico Granata { 139237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton Scalar scalar; 139337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (ResolveValue (scalar)) 1394e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen { 1395e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen if (success) 1396e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen *success = true; 13974a0a1252629a807d37ac252b0239f10204eddedcEnrico Granata return scalar.ULongLong(fail_value); 1398e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen } 1399e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen // fallthrough, otherwise... 1400afb7c85df796f74262917e44dd68f668dade3911Enrico Granata } 1401e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen 1402e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen if (success) 1403e4b5ec026712d56f3cc259900f13158c47cb4d73Johnny Chen *success = false; 140437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return fail_value; 1405afb7c85df796f74262917e44dd68f668dade3911Enrico Granata} 1406afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 14076f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// if any more "special cases" are added to ValueObject::DumpPrintableRepresentation() please keep 14086f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// this call up to date by returning true for your new special cases. We will eventually move 14096f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata// to checking this call result before trying to display special cases 14106f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granatabool 1411cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, 1412cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Format custom_format) 14136f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata{ 14146f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata clang_type_t elem_or_pointee_type; 1415940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton Flags flags(GetTypeInfo(&elem_or_pointee_type)); 14166f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 14176f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) 1418cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) 14196f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 14206f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (IsCStringContainer(true) && 14215c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatCString || 14225c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatCharArray || 14235c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatChar || 14245c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton custom_format == eFormatVectorOfChar)) 14256f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 14266f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 14276f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (flags.Test(ClangASTContext::eTypeIsArray)) 14286f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 14295c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if ((custom_format == eFormatBytes) || 14305c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatBytesWithASCII)) 14316f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 14326f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 14335c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if ((custom_format == eFormatVectorOfChar) || 14345c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfFloat32) || 14355c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfFloat64) || 14365c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt16) || 14375c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt32) || 14385c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt64) || 14395c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfSInt8) || 14405c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt128) || 14415c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt16) || 14425c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt32) || 14435c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt64) || 14445c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton (custom_format == eFormatVectorOfUInt8)) 14456f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return true; 14466f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 14476f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 14486f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return false; 14496f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 14506f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 14519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 14529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s, 14539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectRepresentationStyle val_obj_display, 14545c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton Format custom_format, 1455cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata PrintableRepresentationSpecialCases special) 14569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 145786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 145886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata clang_type_t elem_or_pointee_type; 1459940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton Flags flags(GetTypeInfo(&elem_or_pointee_type)); 14601a102087f54079c25c8827afac6153a44ca535daEnrico Granata 1461cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool allow_special = ((special & ePrintableRepresentationSpecialCasesAllow) == ePrintableRepresentationSpecialCasesAllow); 1462cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool only_special = ((special & ePrintableRepresentationSpecialCasesOnly) == ePrintableRepresentationSpecialCasesOnly); 1463cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1464cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (allow_special) 14651a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 1466cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) 1467cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) 146886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1469cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // when being asked to get a printable display an array or pointer type directly, 1470cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // try to "do the right thing" 1471cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1472cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (IsCStringContainer(true) && 1473cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCString || 1474cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatCharArray || 1475cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatChar || 1476cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format == eFormatVectorOfChar)) // print char[] & char* directly 147786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 1478cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Error error; 1479cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ReadPointedString(s, 1480cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata error, 1481cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 0, 1482cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfChar) || 1483cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCharArray)); 1484cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return !error.Fail(); 1485cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1486cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1487cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format == eFormatEnum) 1488cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1489cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1490cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // this only works for arrays, because I have no way to know when 1491cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // the pointed memory ends, and no special \0 end of data marker 1492cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (flags.Test(ClangASTContext::eTypeIsArray)) 1493cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1494cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatBytes) || 1495cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatBytesWithASCII)) 149686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 149736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t count = GetNumChildren(); 1498cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1499cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << '['; 150036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t low = 0; low < count; low++) 1501cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1502cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1503cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (low) 1504cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ','; 1505cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1506cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 1507cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!child.get()) 1508cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1509cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << "<invalid child>"; 1510cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata continue; 1511cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1512cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, custom_format); 1513cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 151486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1515cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ']'; 151686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1517cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return true; 1518cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 151986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1520cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatVectorOfChar) || 1521cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfFloat32) || 1522cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfFloat64) || 1523cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt16) || 1524cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt32) || 1525cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt64) || 1526cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfSInt8) || 1527cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt128) || 1528cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt16) || 1529cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt32) || 1530cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt64) || 1531cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly 1532cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 153336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t count = GetNumChildren(); 1534cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1535cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata Format format = FormatManager::GetSingleItemFormat(custom_format); 1536cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1537cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << '['; 153836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t low = 0; low < count; low++) 1539cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1540cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1541cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (low) 1542cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ','; 1543cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1544cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP child = GetChildAtIndex(low,true); 1545cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!child.get()) 1546cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1547cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << "<invalid child>"; 1548cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata continue; 1549cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1550cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, format); 1551cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1552cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1553cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s << ']'; 1554cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1555cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return true; 1556cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 155786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 155886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1559cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((custom_format == eFormatBoolean) || 1560cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatBinary) || 1561cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatChar) || 1562cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatCharPrintable) || 1563cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplexFloat) || 1564cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatDecimal) || 1565cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatHex) || 1566535543d6104ee45b4503db6bb6c175e66d0e093bEnrico Granata (custom_format == eFormatHexUppercase) || 1567cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatFloat) || 1568cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatOctal) || 1569cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatOSType) || 1570cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnicode16) || 1571cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnicode32) || 1572cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatUnsigned) || 1573cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatPointer) || 1574cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplexInteger) || 1575cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatComplex) || 1576cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata (custom_format == eFormatDefault)) // use the [] operator 1577cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1578cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1579cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1580cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1581cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (only_special) 1582cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return false; 1583cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1584cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata bool var_success = false; 1585cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1586cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 158736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const char *cstr = NULL; 158836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton StreamString strm; 158986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1590cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format != eFormatInvalid) 1591cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata SetFormat(custom_format); 1592cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1593cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata switch(val_obj_display) 1594cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1595cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleValue: 159636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetValueAsCString(); 1597cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1598cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1599cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleSummary: 160036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetSummaryAsCString(); 1601cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 160286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1603cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleLanguageSpecific: 160436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetObjectDescription(); 1605cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1606cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1607cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleLocation: 160836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetLocationAsCString(); 1609cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1610cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1611cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleChildrenCount: 161236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%zu", GetNumChildren()); 161336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = strm.GetString().c_str(); 1614cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1615cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1616cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata case eValueObjectRepresentationStyleType: 161736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetTypeName().AsCString(); 1618cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1619cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1620cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 162136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (!cstr) 1622cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1623cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (val_obj_display == eValueObjectRepresentationStyleValue) 162436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetSummaryAsCString(); 1625cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleSummary) 1626cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1627cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (ClangASTContext::IsAggregateType (GetClangType()) == true) 162886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 162936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton strm.Printf("%s @ %s", GetTypeName().AsCString(), GetLocationAsCString()); 163036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = strm.GetString().c_str(); 1631cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1632cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 163336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton cstr = GetValueAsCString(); 163486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 163586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 163686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 163736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton if (cstr) 163836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton s.PutCString(cstr); 1639cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 1640cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 1641cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_error.Fail()) 1642cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.Printf("<%s>", m_error.AsCString()); 1643cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleSummary) 1644cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no summary available>"); 1645cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleValue) 1646cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no value available>"); 1647cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (val_obj_display == eValueObjectRepresentationStyleLanguageSpecific) 1648cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<not a valid Objective-C object>"); // edit this if we have other runtimes that support a description 1649cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else 1650cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata s.PutCString("<no printable representation>"); 1651cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 1652cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1653cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // we should only return false here if we could not do *anything* 1654cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // even if we have an error message as output, that's a success 1655cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // from our callers' perspective, so return true 1656cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata var_success = true; 1657cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 1658cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (custom_format != eFormatInvalid) 1659cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata SetFormat(eFormatDefault); 16601a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 16611c61743af946076e988d88baf725382e99d905deEnrico Granata 166286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata return var_success; 1663886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 1664886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 166503e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t 1666915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetAddressOf (bool scalar_is_load_address, AddressType *address_type) 1667f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 1668afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1669e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return LLDB_INVALID_ADDRESS; 1670e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1671f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 1672f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1673f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeScalar: 16747c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 1675f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (scalar_is_load_address) 1676f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1677915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1678915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeLoad; 1679f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1680f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1681f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1682f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1683f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeLoadAddress: 1684f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeFileAddress: 1685f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case Value::eValueTypeHostAddress: 1686f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1687915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1688915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = m_value.GetValueAddressType (); 1689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1690f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1691f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1692f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1693915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (address_type) 1694915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeInvalid; 1695f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return LLDB_INVALID_ADDRESS; 1696f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 1697f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1698f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t 1699915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetPointerValue (AddressType *address_type) 170003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 17015c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton addr_t address = LLDB_INVALID_ADDRESS; 1702915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if(address_type) 1703915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = eAddressTypeInvalid; 1704e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1705afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1706e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return address; 1707e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 1708f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton switch (m_value.GetValueType()) 170903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 171003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeScalar: 17117c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 1712915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 171303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 171403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 1715915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata case Value::eValueTypeHostAddress: 171603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeLoadAddress: 171703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case Value::eValueTypeFileAddress: 171803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 171936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t data_offset = 0; 172003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton address = m_data.GetPointer(&data_offset); 172103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 172203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 172303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 1724427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1725915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (address_type) 1726915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata *address_type = GetAddressTypeOfChildren(); 1727427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 172803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return address; 172903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 173003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1732651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico GranataValueObject::SetValueFromCString (const char *value_str, Error& error) 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1734651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.Clear(); 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure our value is up to date first so that our location and location 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type is valid. 1737afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (!UpdateValueIfNeeded(false)) 1738651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata { 1739651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to read value"); 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 1741651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata } 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1743fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton uint64_t count = 0; 17445c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count); 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1746bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton const size_t byte_size = GetByteSize(); 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1748574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Value::ValueType value_type = m_value.GetValueType(); 1749574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1750574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (value_type == Value::eValueTypeScalar) 1751574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1752574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If the value is already a scalar, then let the scalar change itself: 1753574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_value.GetScalar().SetValueFromCString (value_str, encoding, byte_size); 1754574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1755574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else if (byte_size <= Scalar::GetMaxByteSize()) 1756574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1757574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If the value fits in a scalar, then make a new scalar and again let the 1758574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // scalar code do the conversion, then figure out where to put the new value. 1759574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham Scalar new_scalar; 1760574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham error = new_scalar.SetValueFromCString (value_str, encoding, byte_size); 1761574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (error.Success()) 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 176321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (value_type) 176421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 1765b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeLoadAddress: 1766574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1767574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If it is a load address, then the scalar value is the storage location 1768574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // of the data, and we have to shove this value down to that load location. 1769b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 1770b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 1771b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process) 1772574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 17734a0a1252629a807d37ac252b0239f10204eddedcEnrico Granata addr_t target_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); 1774b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton size_t bytes_written = process->WriteScalarToMemory (target_addr, 1775b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton new_scalar, 1776b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1777b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton error); 1778651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata if (!error.Success()) 1779651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata return false; 1780651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata if (bytes_written != byte_size) 1781651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata { 1782651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to write value to memory"); 1783651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata return false; 1784651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata } 1785574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1786574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 178721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 1788b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeHostAddress: 1789574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1790574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If it is a host address, then we stuff the scalar as a DataBuffer into the Value's data. 1791574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham DataExtractor new_data; 1792574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham new_data.SetByteOrder (m_data.GetByteOrder()); 1793574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1794574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham DataBufferSP buffer_sp (new DataBufferHeap(byte_size, 0)); 1795574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_data.SetData(buffer_sp, 0); 1796574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham bool success = new_scalar.GetData(new_data); 1797574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (success) 1798574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1799b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton new_data.CopyByteOrderedData (0, 1800b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1801b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton const_cast<uint8_t *>(m_data.GetDataStart()), 1802b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton byte_size, 1803b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_data.GetByteOrder()); 1804574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1805574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); 1806574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1807574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 180821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 1809b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeFileAddress: 1810b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton case Value::eValueTypeScalar: 18117c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton case Value::eValueTypeVector: 18127c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton break; 181321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1817574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return false; 181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1819574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 1820574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else 1821574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 1822574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // We don't support setting things bigger than a scalar at present. 1823651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error.SetErrorString("unable to write aggregate data type"); 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1826574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham 1827574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // If we have reached this point, then we have successfully changed the value. 1828574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham SetNeedsUpdate(); 1829574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return true; 183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18320a19a1b9c25117854f226256805239d95153ed2dGreg Claytonbool 18330a19a1b9c25117854f226256805239d95153ed2dGreg ClaytonValueObject::GetDeclaration (Declaration &decl) 18340a19a1b9c25117854f226256805239d95153ed2dGreg Clayton{ 18350a19a1b9c25117854f226256805239d95153ed2dGreg Clayton decl.Clear(); 18360a19a1b9c25117854f226256805239d95153ed2dGreg Clayton return false; 18370a19a1b9c25117854f226256805239d95153ed2dGreg Clayton} 18380a19a1b9c25117854f226256805239d95153ed2dGreg Clayton 1839dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString 1840dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonValueObject::GetTypeName() 1841dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 1842dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return ClangASTType::GetConstTypeName (GetClangAST(), GetClangType()); 1843dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 1844dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 1845dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString 1846dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonValueObject::GetQualifiedTypeName() 1847dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 1848dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return ClangASTType::GetConstQualifiedTypeName (GetClangAST(), GetClangType()); 1849dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 1850dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 1851dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 18525c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonLanguageType 1853b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage () 1854b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{ 1855afb7c85df796f74262917e44dd68f668dade3911Enrico Granata return ClangASTType::GetMinimumLanguage (GetClangAST(), 1856afb7c85df796f74262917e44dd68f668dade3911Enrico Granata GetClangType()); 1857b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham} 1858b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 186047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj) 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 186247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_synthetic_children[key] = valobj; 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 186947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key); 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_synthetic_children.end()) 187147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = pos->second->GetSP(); 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1875940ca9447d84a08883d2ce77a765475f09243fc5Greg Claytonuint32_t 1876940ca9447d84a08883d2ce77a765475f09243fc5Greg ClaytonValueObject::GetTypeInfo (clang_type_t *pointee_or_element_clang_type) 1877940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton{ 1878940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton return ClangASTContext::GetTypeInfo (GetClangType(), GetClangAST(), pointee_or_element_clang_type); 1879940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton} 1880940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType () 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1884462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return ClangASTContext::IsPointerType (GetClangType()); 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188770c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool 188824b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType () 188924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 1890b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton return ClangASTContext::IsArrayType (GetClangType(), NULL, NULL, NULL); 189124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 189224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 189324b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool 18949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType () 18959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 18969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return ClangASTContext::IsScalarType (GetClangType()); 18979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 18989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 18999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool 190070c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed) 190170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{ 190270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham return ClangASTContext::IsIntegerType (GetClangType(), is_signed); 190370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham} 1904f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType () 190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 190882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPointerOrReferenceType (GetClangType()); 190982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 191082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 191182f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 1912917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType () 1913917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 19146b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 19156b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 19166b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (process) 19176b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata return process->IsPossibleDynamicValue(*this); 19186b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata else 19199b90e87380cfafd7e746252588c314bcfefa4fe4Greg Clayton return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType(), NULL, true, true); 1920917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 1921917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 19223ce94041919b44e247c134663281acf3f696b094Enrico Granatabool 19233ce94041919b44e247c134663281acf3f696b094Enrico GranataValueObject::IsObjCNil () 19243ce94041919b44e247c134663281acf3f696b094Enrico Granata{ 1925a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata const uint32_t mask = ClangASTContext::eTypeIsObjC | ClangASTContext::eTypeIsPointer; 1926a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata bool isObjCpointer = ( ((ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), NULL)) & mask) == mask); 1927a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata if (!isObjCpointer) 1928a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata return false; 19293ce94041919b44e247c134663281acf3f696b094Enrico Granata bool canReadValue = true; 19303ce94041919b44e247c134663281acf3f696b094Enrico Granata bool isZero = GetValueAsUnsigned(0,&canReadValue) == 0; 1931a924b19df4a1b41206839e275383c0f43a4c5940Enrico Granata return canReadValue && isZero; 19323ce94041919b44e247c134663281acf3f696b094Enrico Granata} 19333ce94041919b44e247c134663281acf3f696b094Enrico Granata 19345c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 193536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMember (size_t index, bool can_create) 19366f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata{ 1937940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton const uint32_t type_info = GetTypeInfo (); 1938940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (type_info & ClangASTContext::eTypeIsArray) 19396f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return GetSyntheticArrayMemberFromArray(index, can_create); 19406f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 1941940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton if (type_info & ClangASTContext::eTypeIsPointer) 19426f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return GetSyntheticArrayMemberFromPointer(index, can_create); 19436f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 19446f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata return ValueObjectSP(); 19456f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 19466f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 19476f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP 194936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMemberFromPointer (size_t index, bool can_create) 195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueObjectSP synthetic_child_sp; 195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPointerType ()) 195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char index_str[64]; 195536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton snprintf(index_str, sizeof(index_str), "[%zu]", index); 195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString index_const_str(index_str); 195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check if we have already created a synthetic array member in this 195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // valid object. If we have we will re-use it. 195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner synthetic_child_sp = GetSyntheticChild (index_const_str); 196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!synthetic_child_sp) 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 196247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *synthetic_child; 196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We haven't made a synthetic array member for INDEX yet, so 196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lets make one and cache it for any future reference. 196547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child = CreateChildAtIndex(0, true, index); 196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cache the value if we got one back... 196847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (synthetic_child) 196947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham { 197047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham AddSyntheticChild(index_const_str, synthetic_child); 197147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham synthetic_child_sp = synthetic_child->GetSP(); 1972979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 1973886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata synthetic_child_sp->m_is_array_item_for_pointer = true; 197447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham } 197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return synthetic_child_sp; 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1979642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 198024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index 198124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array. 198224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as: 198324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection 198424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// { 198524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// uint32_t item_count; 198624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Item item_array[0]; 198724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// }; 198824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice 198924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array". 199024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 199124b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP 199236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObject::GetSyntheticArrayMemberFromArray (size_t index, bool can_create) 199324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{ 199424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP synthetic_child_sp; 199524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (IsArrayType ()) 199624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 199724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton char index_str[64]; 199836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton snprintf(index_str, sizeof(index_str), "[%zu]", index); 199924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ConstString index_const_str(index_str); 200024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Check if we have already created a synthetic array member in this 200124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // valid object. If we have we will re-use it. 200224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = GetSyntheticChild (index_const_str); 200324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!synthetic_child_sp) 200424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 200524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObject *synthetic_child; 200624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // We haven't made a synthetic array member for INDEX yet, so 200724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // lets make one and cache it for any future reference. 200824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child = CreateChildAtIndex(0, true, index); 200924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 201024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton // Cache the value if we got one back... 201124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (synthetic_child) 201224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 201324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton AddSyntheticChild(index_const_str, synthetic_child); 201424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp = synthetic_child->GetSP(); 2015979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 201624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton synthetic_child_sp->m_is_array_item_for_pointer = true; 201724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 201824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 201924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 202024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton return synthetic_child_sp; 202124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton} 202224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton 20239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP 20249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create) 20259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 20269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP synthetic_child_sp; 20279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (IsScalarType ()) 20289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 20299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char index_str[64]; 20309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to); 20319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ConstString index_const_str(index_str); 20329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Check if we have already created a synthetic array member in this 20339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // valid object. If we have we will re-use it. 20349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = GetSyntheticChild (index_const_str); 20359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (!synthetic_child_sp) 20369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 20379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectChild *synthetic_child; 20389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // We haven't made a synthetic array member for INDEX yet, so 20399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // lets make one and cache it for any future reference. 20409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child = new ValueObjectChild(*this, 20419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangAST(), 20429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetClangType(), 20439762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata index_const_str, 20449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata GetByteSize(), 20459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 0, 20469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata to-from+1, 20479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata from, 20489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata false, 2049915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata false, 2050915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 20519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 20529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // Cache the value if we got one back... 20539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (synthetic_child) 20549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 20559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata AddSyntheticChild(index_const_str, synthetic_child); 20569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp = synthetic_child->GetSP(); 2057979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(index_str)); 20589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata synthetic_child_sp->m_is_bitfield_for_scalar = true; 20599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 20609762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 20619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 20629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return synthetic_child_sp; 20636f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata} 20646f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 20655c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2066979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create) 2067979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{ 2068979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2069979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectSP synthetic_child_sp; 2070979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2071979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata char name_str[64]; 2072979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata snprintf(name_str, sizeof(name_str), "@%i", offset); 2073979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ConstString name_const_str(name_str); 2074979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2075979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // Check if we have already created a synthetic array member in this 2076979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // valid object. If we have we will re-use it. 2077979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = GetSyntheticChild (name_const_str); 2078979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2079979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child_sp.get()) 2080979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 2081979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2082979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (!can_create) 20835c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton return ValueObjectSP(); 2084979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2085979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata ValueObjectChild *synthetic_child = new ValueObjectChild(*this, 2086979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetASTContext(), 2087979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetOpaqueQualType(), 2088979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata name_const_str, 2089979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata type.GetTypeByteSize(), 2090979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata offset, 2091979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 2092979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 0, 2093979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata false, 2094915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata false, 2095915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 2096979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (synthetic_child) 2097979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 2098979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata AddSyntheticChild(name_const_str, synthetic_child); 2099979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp = synthetic_child->GetSP(); 2100979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(name_const_str); 2101979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->m_is_child_at_offset = true; 2102979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 2103979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata return synthetic_child_sp; 2104979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata} 2105979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 2106e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or -> 2107e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has 2108e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown 2109e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means 2110e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off 2111e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char* 2112e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression) 2113e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2114e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!expression || !expression[0]) 2115e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 2116e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '.') 2117e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+1; 2118e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (expression[0] == '-' && expression[1] == '>') 2119e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression+2; 2120e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return expression; 2121e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2122e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 21235c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2124e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create) 2125e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2126e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ValueObjectSP synthetic_child_sp; 2127e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata ConstString name_const_string(expression); 2128e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Check if we have already created a synthetic array member in this 2129e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // valid object. If we have we will re-use it. 2130e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata synthetic_child_sp = GetSyntheticChild (name_const_string); 2131e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (!synthetic_child_sp) 2132e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 2133e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // We haven't made a synthetic array member for expression yet, so 2134e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // lets make one and cache it for any future reference. 2135b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata synthetic_child_sp = GetValueForExpressionPath(expression, 2136b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata NULL, NULL, NULL, 2137b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata GetValueForExpressionPathOptions().DontAllowSyntheticChildren()); 2138e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2139e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // Cache the value if we got one back... 2140e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (synthetic_child_sp.get()) 2141e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata { 214232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata // FIXME: this causes a "real" child to end up with its name changed to the contents of expression 2143e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata AddSyntheticChild(name_const_string, synthetic_child_sp.get()); 2144979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression))); 2145e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 2146e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata } 2147e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return synthetic_child_sp; 2148e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2149e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2150e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid 2151cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::CalculateSyntheticValue (bool use_synthetic) 2152e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2153cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (use_synthetic == false) 2154e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 2155e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2156dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata TargetSP target_sp(GetTargetSP()); 2157dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata if (target_sp && (target_sp->GetEnableSyntheticValue() == false || target_sp->GetSuppressSyntheticValue() == true)) 2158dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata { 2159dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata m_synthetic_value = NULL; 2160dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata return; 2161dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata } 2162dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata 21633d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp); 21643d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata 2165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!UpdateFormatsIfNeeded() && m_synthetic_value) 2166cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return; 2167e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 21683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_synthetic_children_sp.get() == NULL) 2169e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return; 2170e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 21713d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata if (current_synth_sp == m_synthetic_children_sp && m_synthetic_value) 21723d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata return; 21733d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata 2174cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp); 2175e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2176e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2177e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid 21785c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObject::CalculateDynamicValue (DynamicValueType use_dynamic) 2179642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 21805c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if (use_dynamic == eNoDynamicValues) 218110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return; 218210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 218347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (!m_dynamic_value && !IsDynamic()) 2184e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 2185b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 2186b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 21876b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (process && process->IsPossibleDynamicValue(*this)) 21883d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata { 21893d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata ClearDynamicTypeInformation (); 21906b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic); 21913d656c729a1ed0abad4e5a2d76f6e8a6904f66aaEnrico Granata } 2192e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 2193e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham} 2194e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 219547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 219610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic) 2197e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{ 21985c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton if (use_dynamic == eNoDynamicValues) 219910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham return ValueObjectSP(); 220010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham 220110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham if (!IsDynamic() && m_dynamic_value == NULL) 2202e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 220310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham CalculateDynamicValue(use_dynamic); 2204e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 220547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_dynamic_value) 220647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_dynamic_value->GetSP(); 220747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 220847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 2209642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 221066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 22111b42575189379cb0c1441f74a48127e9ab7335e3Jim InghamValueObjectSP 22121b42575189379cb0c1441f74a48127e9ab7335e3Jim InghamValueObject::GetStaticValue() 22131b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham{ 22141b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham return GetSP(); 22151b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham} 22161b42575189379cb0c1441f74a48127e9ab7335e3Jim Ingham 22174758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granatalldb::ValueObjectSP 22184758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico GranataValueObject::GetNonSyntheticValue () 22194758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata{ 22204758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata return GetSP(); 22214758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata} 22224758a3ced524198d2cf9c50bab9b088adcbda9cbEnrico Granata 2223e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP 2224cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::GetSyntheticValue (bool use_synthetic) 2225e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{ 2226cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (use_synthetic == false) 2227cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2228cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 2229e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata CalculateSyntheticValue(use_synthetic); 2230e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 2231e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata if (m_synthetic_value) 2232e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata return m_synthetic_value->GetSP(); 2233e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata else 2234cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2235e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata} 2236e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata 223700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool 2238f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico GranataValueObject::HasSyntheticValue() 2239f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata{ 2240f509c5ec066599a3399fced39ea36996184939e8Enrico Granata UpdateFormatsIfNeeded(); 2241f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 22423069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (m_synthetic_children_sp.get() == NULL) 2243f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 2244f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2245cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata CalculateSyntheticValue(true); 2246f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2247f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (m_synthetic_value) 2248f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return true; 2249f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2250f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return false; 2251f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata} 2252f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata 2253f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granatabool 225400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s) 225500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 225600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (IsBaseClass()) 225700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 2258e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s); 225900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t clang_type = GetClangType(); 226000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton std::string cxx_class_name; 226100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name); 226200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (this_had_base_class) 226300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 226400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (parent_had_base_class) 226500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 226600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(cxx_class_name.c_str()); 226700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 226800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return parent_had_base_class || this_had_base_class; 226900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 227000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return false; 227100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 227200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 227300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 227400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject * 227500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent() 227600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{ 2277e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()) 227800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 2279e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (GetParent()->IsBaseClass()) 2280e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent()->GetNonBaseClassParent(); 228100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton else 2282e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return GetParent(); 228300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 228400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton return NULL; 228500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton} 228666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 228766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid 22881391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 2289bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 229000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const bool is_deref_of_parent = IsDereferenceOfParent (); 229100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 2292cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers) 22931c61743af946076e988d88baf725382e99d905deEnrico Granata { 22941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely 22951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName. 22961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata // the eHonorPointers mode is meant to produce strings in this latter format 22971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("*("); 22981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 229900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 23001391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata ValueObject* parent = GetParent(); 23011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 23021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (parent) 23031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat); 2304886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 2305886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // if we are a deref_of_parent just because we are synthetic array 2306886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // members made up to allow ptr[%d] syntax to work in variable 2307886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata // printing, then add our name ([%d]) to the expression path 2308cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_is_array_item_for_pointer && epformat == eGetExpressionPathFormatHonorPointers) 2309886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata s.PutCString(m_name.AsCString()); 23101391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 231100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!IsBaseClass()) 231200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 231300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (!is_deref_of_parent) 2314bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 231500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton ValueObject *non_base_class_parent = GetNonBaseClassParent(); 231600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent) 2317bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 231800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType(); 231900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (non_base_class_parent_clang_type) 232000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 232100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL); 232200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 2323cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (parent && parent->IsDereferenceOfParent() && epformat == eGetExpressionPathFormatHonorPointers) 232400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 232500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("->"); 232600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 23271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else 23281391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 23291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer) 23301391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 23311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutCString("->"); 23321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 23331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) && 23341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray)) 23351391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 23361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata s.PutChar('.'); 23371391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 233800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 233900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 2340bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 234100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 234200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton const char *name = GetName().GetCString(); 234300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (name) 2344bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 234500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (qualify_cxx_base_classes) 234600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton { 234700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton if (GetBaseClassPath (s)) 234800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString("::"); 234900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton } 235000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutCString(name); 2351bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2352bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2353bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2354bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2355cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers) 23561c61743af946076e988d88baf725382e99d905deEnrico Granata { 235700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton s.PutChar(')'); 23581391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 2359bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 2360bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 23615c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2362ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression, 2363ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 2364ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 2365ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_value_type, 2366ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 2367ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* final_task_on_target) 2368ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 2369ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2370ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* dummy_first_unparsed; 237132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ExpressionPathScanEndReason dummy_reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnknown; 237232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ExpressionPathEndResultType dummy_final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2373cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2374ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2375ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 2376ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 2377ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 2378ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 2379ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 2380ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 2381ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2382cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing) 2383ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; 2384de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata 2385cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico 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 2386ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2387cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ( (final_task_on_target ? *final_task_on_target : dummy_final_task_on_target) == ValueObject::eExpressionPathAftermathDereference) 2388ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2389ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2390ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 2391ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 2392ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2393de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (reason_to_stop) 2394cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 2395de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_value_type) 2396cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2397ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2398ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2399ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2400ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2401de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_task_on_target) 2402cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2403ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 2404ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2405ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2406cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress) 2407ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2408ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2409ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 2410ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !final_value.get()) 2411ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2412de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (reason_to_stop) 2413cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed; 2414de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_value_type) 2415cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 2416ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2417ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2418ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2419ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2420de3b25b645e4b4d97a87ebf059056a6c696d4e9cEnrico Granata if (final_task_on_target) 2421cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 2422ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return final_value; 2423ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2424ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2425ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2426ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ret_val; // final_task_on_target will still have its original value, so you know I did not do it 2427ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 2428ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 24291a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 24301a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression, 24315c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectListSP& list, 24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_value_type, 24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* final_task_on_target) 24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* dummy_first_unparsed; 24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason dummy_reason_to_stop; 24401a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType dummy_final_value_type; 2441cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata 24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression, 24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata 24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!ret_val.get()) // if there are errors, I add nothing to the list 24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata 245380731ec9368b8e1cbfe093fb9ec257457ef29133Enrico Granata if ( (reason_to_stop ? *reason_to_stop : dummy_reason_to_stop) != eExpressionPathScanEndReasonArrayRangeOperatorMet) 24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata // I need not expand a range, just post-process the final value and return 2456cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing) 24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 246180731ec9368b8e1cbfe093fb9ec257457ef29133Enrico 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 24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2463cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathDereference) 24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->Dereference(error); 24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24694a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (reason_to_stop) 24704a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 24714a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (final_value_type) 24724a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2477cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 2482cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress) 24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP final_value = ret_val->AddressOf(error); 24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !final_value.get()) 24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 24884a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (reason_to_stop) 24894a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed; 24904a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (final_value_type) 24914a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid; 24921a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 24931a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 24941a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 24951a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 2496cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_task_on_target = ValueObject::eExpressionPathAftermathNothing; 24971a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(final_value); 24981a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 24991a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25001a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25011a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25021a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25031a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 25041a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 25051a102087f54079c25c8827afac6153a44ca535daEnrico Granata return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed, 25061a102087f54079c25c8827afac6153a44ca535daEnrico Granata first_unparsed ? first_unparsed : &dummy_first_unparsed, 25071a102087f54079c25c8827afac6153a44ca535daEnrico Granata ret_val, 25081a102087f54079c25c8827afac6153a44ca535daEnrico Granata list, 25091a102087f54079c25c8827afac6153a44ca535daEnrico Granata reason_to_stop ? reason_to_stop : &dummy_reason_to_stop, 25101a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_value_type ? final_value_type : &dummy_final_value_type, 25111a102087f54079c25c8827afac6153a44ca535daEnrico Granata options, 25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata final_task_on_target ? final_task_on_target : &dummy_final_task_on_target); 25131a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata // in any non-covered case, just do the obviously right thing 25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(ret_val); 25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 25181a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25195c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 2520ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr, 2521ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char** first_unparsed, 2522ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathScanEndReason* reason_to_stop, 2523ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathEndResultType* final_result, 2524ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const GetValueForExpressionPathOptions& options, 2525ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ExpressionPathAftermath* what_next) 2526ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{ 2527ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObjectSP root = GetSP(); 2528ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2529ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2530ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2531ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2532ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2533ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2534ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata while (true) 2535ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2536ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2537ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 2538ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 25395c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t root_clang_type = root->GetClangType(); 25405c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t pointee_clang_type; 25411a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata 25431a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 25451a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 2546ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2547ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!expression_cstr || *expression_cstr == '\0') 2548ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2549cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2550ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2551ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2552ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 2553ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata switch (*expression_cstr) 2554ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2555ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '-': 2556ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2557ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && 25581a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error 2559ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2560ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2561cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot; 2562cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2563ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2564ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 25651a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) && // if yo are trying to extract an ObjC IVar when this is forbidden 25661a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && 2567ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options.m_no_fragile_ivar) 2568ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2569ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2570cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed; 2571cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2572ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2573ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2574ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (expression_cstr[1] != '>') 2575ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2576ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2577cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2578cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2579ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2580ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2581ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip the - 2582ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2583ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '.': // or fallthrough from -> 2584ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2585ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' && 25861a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error 2587ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2588ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2589cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow; 2590cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2591ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2592ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2593ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata expression_cstr++; // skip . 2594ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *next_separator = strpbrk(expression_cstr+1,"-.["); 2595ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString child_name; 2596ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!next_separator) // if no other separator just expand this last layer 2597ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2598ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCString (expression_cstr); 25999c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); 26009c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 26019c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if (child_valobj_sp.get()) // we know we are done, so just return 2602ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2603b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea *first_unparsed = ""; 2604cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2605cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 26069c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata return child_valobj_sp; 26079c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 26089c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else if (options.m_no_synthetic_children == false) // let's try with synthetic children 26099c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2610cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->IsSynthetic()) 2611b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata { 2612b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *first_unparsed = expression_cstr; 2613b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2614b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2615b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata return ValueObjectSP(); 2616b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata } 2617b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata 2618b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata child_valobj_sp = root->GetSyntheticValue(); 2619cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (child_valobj_sp.get()) 2620cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true); 26219c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 26229c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 26239c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP, 26249c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // so we hit the "else" branch, and return an error 26259c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if(child_valobj_sp.get()) // if it worked, just return 26269c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2627b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea *first_unparsed = ""; 2628cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 2629cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 26309c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata return child_valobj_sp; 2631ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2632ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2633ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2634ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2635cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2636cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2637ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2638ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2639ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2640ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // other layers do expand 2641ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2642ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr); 26439c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true); 26449c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if (child_valobj_sp.get()) // store the new root and move on 26459c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 26469c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata root = child_valobj_sp; 26479c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata *first_unparsed = next_separator; 2648cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 26499c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata continue; 26509c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 26519c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else if (options.m_no_synthetic_children == false) // let's try with synthetic children 26529c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 2653b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata if (root->IsSynthetic()) 2654b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata { 2655b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *first_unparsed = expression_cstr; 2656b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2657b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2658b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata return ValueObjectSP(); 2659b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata } 2660b87efc9a5a9e3c6716f20da8669a6931a7662732Enrico Granata 2661cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = root->GetSyntheticValue(true); 2662cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (child_valobj_sp) 2663cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true); 26649c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 26659c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata 26669c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP, 26679c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata // so we hit the "else" branch, and return an error 26689c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata if(child_valobj_sp.get()) // if it worked, move on 2669ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 26709c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata root = child_valobj_sp; 2671ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = next_separator; 2672cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 2673ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2674ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2675ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2676ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2677ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2678cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2679cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2680ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2681ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2682ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2683ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2684ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2685ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata case '[': 2686ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 26871a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T* 2688ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2689f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar... 2690ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2691f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (options.m_no_synthetic_children) // ...only chance left is synthetic 2692f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2693f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2694cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; 2695cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2696f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2697f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2698ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2699ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 2700ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2701ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2702cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; 2703cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2704ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2705ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2706ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2707ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 2708ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 27091a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2710ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2711ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2712cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 2713cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2714ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2715ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2716ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // even if something follows, we cannot expand unbounded ranges, just let the caller do it 2717ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2718ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2719cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 2720cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange; 2721ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2722ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2723ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2724ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 2725ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 2726ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 2727ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2728ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2729cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2730cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2731ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2732ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2733ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 2734ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2735ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2736ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 2737ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2738ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2739ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2740cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2741cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2742ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2743ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2744ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 2745ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 27461a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2747ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2748ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr+2; 2749cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 2750cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange; 2751ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2752ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2753ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2754ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2755ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2756cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 2757cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2758ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2759ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2760ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2761ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata // from here on we do have a valid index 27621a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 2763ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 276424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true); 276524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (!child_valobj_sp) 276624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true); 2767f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!child_valobj_sp) 2768cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->HasSyntheticValue() && root->GetSyntheticValue()->GetNumChildren() > index) 2769cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata child_valobj_sp = root->GetSyntheticValue()->GetChildAtIndex(index, true); 277024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton if (child_valobj_sp) 277124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton { 277224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton root = child_valobj_sp; 277324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton *first_unparsed = end+1; // skip ] 2774cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 277524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton continue; 277624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton } 277724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton else 2778ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2779ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2780cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2781cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2782ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2783ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2784ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 27851a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 2786ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2787cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico 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 27881a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2789ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2790ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2791ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2792ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2793ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2794ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2795cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 2796cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2797ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2798ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2799ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2800ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2801cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = eExpressionPathAftermathNothing; 2802ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2803ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2804ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2805ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2806ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2807f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (ClangASTType::GetMinimumLanguage(root->GetClangAST(), 2808dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton root->GetClangType()) == eLanguageTypeObjC 2809dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && ClangASTContext::IsPointerType(ClangASTType::GetPointeeType(root->GetClangType())) == false 2810dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && root->HasSyntheticValue() 2811dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton && options.m_no_synthetic_children == false) 2812f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2813cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetSyntheticValue()->GetChildAtIndex(index, true); 2814f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2815f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2816f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 2817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2818ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2819ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2820cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2821cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2822ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2823ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2824ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2825ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2826ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2827cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 2828ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2829ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2830ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2831ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2832f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else if (ClangASTContext::IsScalarType(root_clang_type)) 2833ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2834ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 2835ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2836ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2837ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2838cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2839cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2840ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2842ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 2843ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2844ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2845cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet; 2846cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; 2847ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2848ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2849ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2850cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (options.m_no_synthetic_children == false) 2851f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2852cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (root->HasSyntheticValue()) 2853cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetSyntheticValue(); 2854cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata else if (!root->IsSynthetic()) 2855cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 2856cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *first_unparsed = expression_cstr; 2857cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; 2858cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2859cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2860cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 2861cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata // if we are here, then root itself is a synthetic VO.. should be good to go 2862cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 2863cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!root.get()) 2864cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 2865cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *first_unparsed = expression_cstr; 2866cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing; 2867cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2868cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata return ValueObjectSP(); 2869cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 2870cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata root = root->GetChildAtIndex(index, true); 2871f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata if (!root.get()) 2872f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2873f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2874cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2875cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2876f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2877f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 28789c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata else 28799c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata { 28809c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata *first_unparsed = end+1; // skip ] 2881cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypePlain; 28829c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata continue; 28839c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata } 2884f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2885f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata else 2886f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata { 2887f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata *first_unparsed = expression_cstr; 2888cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2889cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2890f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata return ValueObjectSP(); 2891f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata } 2892ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2893ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else // we have a low and a high index 2894ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2895ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata char *end = NULL; 2896ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 2897ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 2898ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2899ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2900cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2901cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2902ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2903ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2904ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 2905ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 2906ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2907ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2908cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2909cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2910ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2911ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2912ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (index_lower > index_higher) // swap indices if required 2913ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2914ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata unsigned long temp = index_lower; 2915ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_lower = index_higher; 2916ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata index_higher = temp; 2917ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 29181a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 2919ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2920ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 2921ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!root.get()) 2922ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2923ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2924cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 2925cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2926ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2927ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2928ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2929ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2930ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = end+1; // skip ] 2931cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet; 2932cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBitfield; 2933ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2934ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2935ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 29361a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield 2937cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next == ValueObject::eExpressionPathAftermathDereference && 29381a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 2939ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2940ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata Error error; 2941ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata root = root->Dereference(error); 2942ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (error.Fail() || !root.get()) 2943ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2944ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2945cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 2946cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2947ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2948ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2949ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2950ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2951cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = ValueObject::eExpressionPathAftermathNothing; 2952ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata continue; 2953ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2954ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 2956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2958cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet; 2959cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange; 2960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return root; 2961ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2964ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata default: // some non-separator is in the way 2966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 2967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata *first_unparsed = expression_cstr; 2968cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 2969cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 2970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata return ValueObjectSP(); 2971ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 2972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 2975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata} 2976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 29771a102087f54079c25c8827afac6153a44ca535daEnrico Granataint 29781a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr, 29791a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char** first_unparsed, 29805c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP root, 29815c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectListSP& list, 29821a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathScanEndReason* reason_to_stop, 29831a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathEndResultType* final_result, 29841a102087f54079c25c8827afac6153a44ca535daEnrico Granata const GetValueForExpressionPathOptions& options, 29851a102087f54079c25c8827afac6153a44ca535daEnrico Granata ExpressionPathAftermath* what_next) 29861a102087f54079c25c8827afac6153a44ca535daEnrico Granata{ 29871a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 29881a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 29891a102087f54079c25c8827afac6153a44ca535daEnrico Granata 29901a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 29911a102087f54079c25c8827afac6153a44ca535daEnrico Granata 29921a102087f54079c25c8827afac6153a44ca535daEnrico Granata while (true) 29931a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 29941a102087f54079c25c8827afac6153a44ca535daEnrico Granata 29951a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr 29961a102087f54079c25c8827afac6153a44ca535daEnrico Granata 29975c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t root_clang_type = root->GetClangType(); 29985c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton clang_type_t pointee_clang_type; 29991a102087f54079c25c8827afac6153a44ca535daEnrico Granata Flags root_clang_type_info,pointee_clang_type_info; 30001a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30011a102087f54079c25c8827afac6153a44ca535daEnrico Granata root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type)); 30021a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (pointee_clang_type) 30031a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL)); 30041a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30051a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!expression_cstr || *expression_cstr == '\0') 30061a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3007cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 30081a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 30091a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 30101a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30111a102087f54079c25c8827afac6153a44ca535daEnrico Granata 30121a102087f54079c25c8827afac6153a44ca535daEnrico Granata switch (*expression_cstr) 30131a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30141a102087f54079c25c8827afac6153a44ca535daEnrico Granata case '[': 30151a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30161a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T* 30171a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30181a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong! 30191a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30201a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3021cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid; 3022cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 30231a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30241a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30251a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields 30261a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30271a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3028cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed; 3029cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 30301a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30311a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30321a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30331a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays 30341a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30351a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 30361a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30371a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3038cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 3039cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 30401a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30411a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30421a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // expand this into list 30431a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 304436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_index = root->GetNumChildren() - 1; 304536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t index = 0; index < max_index; index++) 30461a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30471a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 30481a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 30491a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 30501a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30511a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 3052cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3053cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 30541a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 30551a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30561a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30571a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *separator_position = ::strchr(expression_cstr+1,'-'); 30581a102087f54079c25c8827afac6153a44ca535daEnrico Granata const char *close_bracket_position = ::strchr(expression_cstr+1,']'); 30591a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!close_bracket_position) // if there is no ], this is a syntax error 30601a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30611a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3062cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3063cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 30641a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30651a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30661a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N] 30671a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30681a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 30691a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index = ::strtoul (expression_cstr+1, &end, 0); 30701a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 30711a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30721a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3073cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3074cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 30751a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30761a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30771a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays 30781a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30791a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 30801a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 308136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_index = root->GetNumChildren() - 1; 308236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t index = 0; index < max_index; index++) 30831a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30841a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 30851a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 30861a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 30871a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30881a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr+2; 3089cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3090cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 30911a102087f54079c25c8827afac6153a44ca535daEnrico Granata return max_index; // tell me number of items I added to the VOList 30921a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 30931a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 30941a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 30951a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3096cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed; 3097cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 30981a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 30991a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31001a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31011a102087f54079c25c8827afac6153a44ca535daEnrico Granata // from here on we do have a valid index 31021a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray)) 31031a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31041a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetChildAtIndex(index, true); 31051a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 31061a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31071a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3108cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3109cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31101a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31111a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31121a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31131a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31141a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 31151a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3116cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3117cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31181a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 31191a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31201a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31211a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) 31221a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3123cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico 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 31241a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 31251a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31261a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 31271a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 31281a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 31291a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31301a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3131cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3132cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31331a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31341a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31351a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31361a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3137cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = eExpressionPathAftermathNothing; 31381a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 31391a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31401a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31411a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31421a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31431a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticArrayMemberFromPointer(index, true); 31441a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 31451a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31461a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3147cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3148cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31491a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31501a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31511a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 31521a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31531a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 31541a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3155cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3156cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31571a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 31581a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31591a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31601a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31611a102087f54079c25c8827afac6153a44ca535daEnrico Granata else /*if (ClangASTContext::IsScalarType(root_clang_type))*/ 31621a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31631a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index, index, true); 31641a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 31651a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31661a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3167cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3168cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31691a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31701a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31711a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing 31721a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31731a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 31741a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3175cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3176cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 31771a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 31781a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31791a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31801a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31811a102087f54079c25c8827afac6153a44ca535daEnrico Granata else // we have a low and a high index 31821a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31831a102087f54079c25c8827afac6153a44ca535daEnrico Granata char *end = NULL; 31841a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0); 31851a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != separator_position) // if something weird is in our way return an error 31861a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31871a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3188cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3189cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31901a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31911a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 31921a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long index_higher = ::strtoul (separator_position+1, &end, 0); 31931a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!end || end != close_bracket_position) // if something weird is in our way return an error 31941a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 31951a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3196cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3197cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 31981a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 31991a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32001a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (index_lower > index_higher) // swap indices if required 32011a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32021a102087f54079c25c8827afac6153a44ca535daEnrico Granata unsigned long temp = index_lower; 32031a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_lower = index_higher; 32041a102087f54079c25c8827afac6153a44ca535daEnrico Granata index_higher = temp; 32051a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32061a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars 32071a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32081a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true); 32091a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (!root.get()) 32101a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32111a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3212cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild; 3213cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32141a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32151a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32161a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32171a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32181a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(root); 32191a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; // skip ] 3220cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3221cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 32221a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 1; 32231a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32241a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32251a102087f54079c25c8827afac6153a44ca535daEnrico Granata else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield 3226cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next == ValueObject::eExpressionPathAftermathDereference && 32271a102087f54079c25c8827afac6153a44ca535daEnrico Granata pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) 32281a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32291a102087f54079c25c8827afac6153a44ca535daEnrico Granata Error error; 32301a102087f54079c25c8827afac6153a44ca535daEnrico Granata root = root->Dereference(error); 32311a102087f54079c25c8827afac6153a44ca535daEnrico Granata if (error.Fail() || !root.get()) 32321a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32331a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3234cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed; 3235cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32361a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32371a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32381a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32391a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 3240cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *what_next = ValueObject::eExpressionPathAftermathNothing; 32411a102087f54079c25c8827afac6153a44ca535daEnrico Granata continue; 32421a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32431a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32441a102087f54079c25c8827afac6153a44ca535daEnrico Granata else 32451a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32462bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (unsigned long index = index_lower; 32471a102087f54079c25c8827afac6153a44ca535daEnrico Granata index <= index_higher; index++) 32481a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32491a102087f54079c25c8827afac6153a44ca535daEnrico Granata ValueObjectSP child = 32501a102087f54079c25c8827afac6153a44ca535daEnrico Granata root->GetChildAtIndex(index, true); 32511a102087f54079c25c8827afac6153a44ca535daEnrico Granata list->Append(child); 32521a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32531a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = end+1; 3254cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded; 3255cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList; 32561a102087f54079c25c8827afac6153a44ca535daEnrico Granata return index_higher-index_lower+1; // tell me number of items I added to the VOList 32571a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32581a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32591a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 32601a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32611a102087f54079c25c8827afac6153a44ca535daEnrico Granata default: // some non-[ separator, or something entirely wrong, is in the way 32621a102087f54079c25c8827afac6153a44ca535daEnrico Granata { 32631a102087f54079c25c8827afac6153a44ca535daEnrico Granata *first_unparsed = expression_cstr; 3264cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol; 3265cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *final_result = ValueObject::eExpressionPathEndResultTypeInvalid; 32661a102087f54079c25c8827afac6153a44ca535daEnrico Granata return 0; 32671a102087f54079c25c8827afac6153a44ca535daEnrico Granata break; 32681a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32691a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32701a102087f54079c25c8827afac6153a44ca535daEnrico Granata } 32711a102087f54079c25c8827afac6153a44ca535daEnrico Granata} 32721a102087f54079c25c8827afac6153a44ca535daEnrico Granata 32733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatastatic void 32743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataDumpValueObject_Impl (Stream &s, 32753069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj, 32763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const ValueObject::DumpValueObjectOptions& options, 32773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata uint32_t ptr_depth, 32783069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata uint32_t curr_depth) 327966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{ 328082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (valobj) 328166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3282f509c5ec066599a3399fced39ea36996184939e8Enrico Granata bool update_success = valobj->UpdateValueIfNeeded (true); 328382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 32843069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const char *root_valobj_name = 32853069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_root_valobj_name.empty() ? 32863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetName().AsCString() : 32873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_root_valobj_name.c_str(); 32883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 32893069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (update_success && options.m_use_dynamic != eNoDynamicValues) 3290e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham { 32913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *dynamic_value = valobj->GetDynamicValue(options.m_use_dynamic).get(); 3292e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (dynamic_value) 3293e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham valobj = dynamic_value; 3294e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham } 3295e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3296bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton clang_type_t clang_type = valobj->GetClangType(); 3297bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3298f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL)); 3299bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *err_cstr = NULL; 3300f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren); 3301f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue); 3302bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 33033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const bool print_valobj = options.m_flat_output == false || has_value; 3304bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3305bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 330666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 33073069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_show_location) 3308bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3309fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham s.Printf("%s: ", valobj->GetLocationAsCString()); 3310bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 331166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3312bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent(); 331312213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata 331412213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata bool show_type = true; 331512213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata // if we are at the root-level and been asked to hide the root's type, then hide it 331612213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata if (curr_depth == 0 && options.m_hide_root_type) 331712213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata show_type = false; 331812213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata else 331912213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata // otherwise decide according to the usual rules (asked to show types - always at the root level) 332012213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata show_type = options.m_show_types || (curr_depth == 0 && !options.m_flat_output); 332112213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata 332212213586035d4af8f200e5c8ab4642728f8c5f30Enrico Granata if (show_type) 33231a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata s.Printf("(%s) ", valobj->GetQualifiedTypeName().AsCString("<invalid type>")); 332466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 33253069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_flat_output) 3326bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3327b01000fd063629facd45044f137446fb748ee179Greg Clayton // If we are showing types, also qualify the C++ base classes 33283069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const bool qualify_cxx_base_classes = options.m_show_types; 33294ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata if (!options.m_hide_name) 33304ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata { 33314ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata valobj->GetExpressionPath(s, qualify_cxx_base_classes); 33324ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.PutCString(" ="); 33334ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata } 3334bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 33354ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata else if (!options.m_hide_name) 3336bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3337bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString(""); 3338bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Printf ("%s =", name_cstr); 3339bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3340bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 33413069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!options.m_scope_already_checked && !valobj->IsInScope()) 3342bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 334382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton err_cstr = "out of scope"; 3344bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 334566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 334666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 33473069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata std::string summary_str; 3348ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton std::string value_str; 3349bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const char *val_cstr = NULL; 33501391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char *sum_cstr = NULL; 33513069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata TypeSummaryImpl* entry = options.m_summary_sp ? options.m_summary_sp.get() : valobj->GetSummaryFormat().get(); 3352bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 33533069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_omit_summary_depth > 0) 33547f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata entry = NULL; 33557f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata 33563ce94041919b44e247c134663281acf3f696b094Enrico Granata bool is_nil = valobj->IsObjCNil(); 33573ce94041919b44e247c134663281acf3f696b094Enrico Granata 3358bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (err_cstr == NULL) 3359bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 33603069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_format != eFormatDefault && options.m_format != valobj->GetFormat()) 3361ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton { 33623069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetValueAsCString(options.m_format, 33633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata value_str); 3364ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton } 33653069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 3366ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton { 33673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata val_cstr = valobj->GetValueAsCString(); 33683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (val_cstr) 33693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata value_str = val_cstr; 3370ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton } 3371bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton err_cstr = valobj->GetError().AsCString(); 3372bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 337366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 337466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (err_cstr) 337566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 337682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton s.Printf (" <%s>\n", err_cstr); 337766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 337866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 337966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3380f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference); 3381bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3382bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 33833ce94041919b44e247c134663281acf3f696b094Enrico Granata if (is_nil) 33843ce94041919b44e247c134663281acf3f696b094Enrico Granata sum_cstr = "nil"; 33853ce94041919b44e247c134663281acf3f696b094Enrico Granata else if (options.m_omit_summary_depth == 0) 33863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 33873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_summary_sp) 33883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata { 33893069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj->GetSummaryAsCString(entry, summary_str); 33903069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata sum_cstr = summary_str.c_str(); 33913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 33923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata else 33933069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata sum_cstr = valobj->GetSummaryAsCString(); 33943069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata } 339566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3396ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton // Make sure we have a value and make sure the summary didn't 33973ce94041919b44e247c134663281acf3f696b094Enrico Granata // specify that the value should not be printed - and do not print 33983ce94041919b44e247c134663281acf3f696b094Enrico Granata // the value if this thing is nil 33994ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata if (!is_nil && !value_str.empty() && (entry == NULL || entry->DoesPrintValue() || sum_cstr == NULL) && !options.m_hide_value) 3400ccf4450f17759b2e6f15eb12134f88a0128dfde7Greg Clayton s.Printf(" %s", value_str.c_str()); 340166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 340290d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata if (sum_cstr) 34033069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata s.Printf(" %s", sum_cstr); 3404bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34053ce94041919b44e247c134663281acf3f696b094Enrico Granata // let's avoid the overly verbose no description error for a nil thing 34063ce94041919b44e247c134663281acf3f696b094Enrico Granata if (options.m_use_objc && !is_nil) 3407bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34084ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata if (!options.m_hide_value || !options.m_hide_name) 34094ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf(" "); 3410fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const char *object_desc = valobj->GetObjectDescription(); 3411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (object_desc) 34124ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf("%s\n", object_desc); 3413bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 34144ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata s.Printf ("[no Objective-C description available]\n"); 3415bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return; 3416886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 341766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 341866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 34193069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (curr_depth < options.m_max_depth) 342066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3421f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We will show children for all concrete types. We won't show 3422f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // pointer contents unless a pointer depth has been specified. 3423f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We won't reference contents unless the reference is the 3424f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // root object (depth of zero). 3425f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool print_children = true; 3426f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3427f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Use a new temporary pointer depth in case we override the 3428f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // current pointer depth below... 3429f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t curr_ptr_depth = ptr_depth; 3430f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3431f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer); 3432f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (is_ptr || is_ref) 3433f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3434f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer or reference whose value is an address. 3435f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // Make sure that address is not NULL 3436b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType ptr_address_type; 3437915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (valobj->GetPointerValue (&ptr_address_type) == 0) 3438f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 3439f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3440f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else if (is_ref && curr_depth == 0) 3441f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3442f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this is the root object (depth is zero) that we are showing 3443f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // and it is a reference, and no pointer depth has been supplied 3444f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // print out what it references. Don't do this at deeper depths 3445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // otherwise we can end up with infinite recursion... 3446f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton curr_ptr_depth = 1; 3447f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 3448f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3449f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (curr_ptr_depth == 0) 3450f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton print_children = false; 3451f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 345266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 3453886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr)) 345466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3455cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject* synth_valobj; 3456cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObjectSP synth_valobj_sp = valobj->GetSyntheticValue (options.m_use_synthetic); 3457cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata synth_valobj = (synth_valobj_sp ? synth_valobj_sp.get() : valobj); 3458dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata 345936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_children = synth_valobj->GetNumChildren(); 3460018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata bool print_dotdotdot = false; 3461bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (num_children) 346266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 34633069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (options.m_flat_output) 346466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3465bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3466bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 3467bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3468bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3469bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3470bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 34713f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton s.PutCString(is_ref ? ": {\n" : " {\n"); 3472bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentMore(); 3473bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3474018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 347536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t max_num_children = valobj->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 3476018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 34773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (num_children > max_num_children && !options.m_ignore_cap) 3478018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 3479018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata num_children = max_num_children; 3480018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata print_dotdotdot = true; 3481018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 3482bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 34833069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject::DumpValueObjectOptions child_options(options); 34844f5b299c1f5daf4cce9aad01471a6b558e5b13d2Enrico Granata child_options.SetFormat(options.m_format).SetSummary().SetRootValueObjectName(); 34854ad049061813fdd19164cdc1bae552eb1a59200bEnrico Granata child_options.SetScopeChecked(true).SetHideName(options.m_hide_name).SetHideValue(options.m_hide_value) 34863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata .SetOmitSummaryDepth(child_options.m_omit_summary_depth > 1 ? child_options.m_omit_summary_depth - 1 : 0); 348736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t idx=0; idx<num_children; ++idx) 3488bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3489f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObjectSP child_sp(synth_valobj->GetChildAtIndex(idx, true)); 3490bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (child_sp.get()) 3491bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 34923069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl (s, 34933069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata child_sp.get(), 34943069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata child_options, 34953069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth, 34963069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata curr_depth + 1); 3497bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3498bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3499bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 35003069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!options.m_flat_output) 3501bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3502018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (print_dotdotdot) 3503db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata { 3504b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (valobj->GetExecutionContextRef()); 3505b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Target *target = exe_ctx.GetTargetPtr(); 3506b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target) 3507b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton target->GetDebugger().GetCommandInterpreter().ChildrenTruncated(); 3508018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.Indent("...\n"); 3509db64d95b32062acbf961019aa6c1025237d3145cEnrico Granata } 3510bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.IndentLess(); 3511bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.Indent("}\n"); 351266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 351366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 3514bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else if (has_children) 3515bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3516bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton // Aggregate, no children... 3517bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton s.PutCString(" {}\n"); 3519bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3520bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3521bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3522bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (print_valobj) 3523bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.EOL(); 3524bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3525bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 352666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 3527bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 3528bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 352966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton s.EOL(); 353066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 353166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 353266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton else 353366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3534bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (has_children && print_valobj) 353566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton { 3536bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton s.PutCString("{...}\n"); 353766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 353866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 353966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 354066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton } 354166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton} 354266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton 35433069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatavoid 35442aaf59d0bae48c120b0b04028c2a6d125777a708Greg ClaytonValueObject::LogValueObject (Log *log, 35452aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject *valobj) 35462aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton{ 35472aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (log && valobj) 35482aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton return LogValueObject (log, valobj, DumpValueObjectOptions::DefaultOptions()); 35492aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton} 35502aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton 35512aaf59d0bae48c120b0b04028c2a6d125777a708Greg Claytonvoid 35522aaf59d0bae48c120b0b04028c2a6d125777a708Greg ClaytonValueObject::LogValueObject (Log *log, 35532aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject *valobj, 35542aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton const DumpValueObjectOptions& options) 35552aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton{ 35562aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (log && valobj) 35572aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton { 35582aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton StreamString s; 35592aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton ValueObject::DumpValueObject (s, valobj, options); 35602aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton if (s.GetSize()) 35612aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton log->PutCString(s.GetData()); 35622aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton } 35632aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton} 35642aaf59d0bae48c120b0b04028c2a6d125777a708Greg Clayton 35652aaf59d0bae48c120b0b04028c2a6d125777a708Greg Claytonvoid 35663069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::DumpValueObject (Stream &s, 35673069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj) 35683069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 35693069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 35703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata if (!valobj) 35713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata return; 35723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 35733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl(s, 35743069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj, 35753069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObjectOptions::DefaultOptions(), 35763069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0, 35773069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0); 35783069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 35793069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 35803069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granatavoid 35813069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico GranataValueObject::DumpValueObject (Stream &s, 35823069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ValueObject *valobj, 35833069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata const DumpValueObjectOptions& options) 35843069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata{ 35853069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata DumpValueObject_Impl(s, 35863069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata valobj, 35873069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options, 35883069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options.m_max_ptr_depth, // max pointer depth allowed, we will go down from here 35893069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata 0 // current object depth is 0 since we are just starting 35903069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata ); 35913069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata} 3592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3593427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP 3594fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name) 3595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ValueObjectSP valobj_sp; 3597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3598afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (UpdateValueIfNeeded(false) && m_error.Success()) 3599427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3600b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3601b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton clang::ASTContext *ast = GetClangAST (); 3602b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 3603b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton DataExtractor data; 3604b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetByteOrder (m_data.GetByteOrder()); 3605b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data.SetAddressByteSize(m_data.GetAddressByteSize()); 3606b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 36074d609c92183905881daf1a601474a20e6949cc9aEnrico Granata if (IsBitfield()) 36084d609c92183905881daf1a601474a20e6949cc9aEnrico Granata { 36094d609c92183905881daf1a601474a20e6949cc9aEnrico Granata Value v(Scalar(GetValueAsUnsigned(UINT64_MAX))); 36104d609c92183905881daf1a601474a20e6949cc9aEnrico Granata m_error = v.GetValueAsData (&exe_ctx, ast, data, 0, GetModule().get()); 36114d609c92183905881daf1a601474a20e6949cc9aEnrico Granata } 36124d609c92183905881daf1a601474a20e6949cc9aEnrico Granata else 36134d609c92183905881daf1a601474a20e6949cc9aEnrico Granata m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule().get()); 3614b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 3615b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 3616b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ast, 3617b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetClangType(), 3618b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton name, 3619b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton data, 3620b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetAddressOf()); 3621427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3622fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3623fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!valobj_sp) 3624427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 362547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj_sp = ValueObjectConstResult::Create (NULL, m_error); 3626427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3627427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return valobj_sp; 3628427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3629427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 36305c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 3631bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error) 3632427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 363347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 363447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 3635e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3636c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const bool is_pointer_type = IsPointerType(); 3637c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 3638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3639427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool omit_empty_base_classes = true; 364024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton bool ignore_array_bounds = false; 3641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3642427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string child_name_str; 3643427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_byte_size = 0; 3644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton int32_t child_byte_offset = 0; 3645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_size = 0; 3646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint32_t child_bitfield_bit_offset = 0; 3647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton bool child_is_base_class = false; 364800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool child_is_deref_of_parent = false; 3649427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool transparent_pointers = false; 3650427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *clang_ast = GetClangAST(); 3651427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 3652427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t child_clang_type; 365358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 3654b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 365558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 365658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx, 365758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham clang_ast, 3658427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton GetName().GetCString(), 3659427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type, 3660427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, 3661427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton transparent_pointers, 3662427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton omit_empty_base_classes, 366324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton ignore_array_bounds, 3664427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name_str, 3665427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_size, 3666427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_byte_offset, 3667427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_size, 3668427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_bitfield_bit_offset, 366900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 367000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 3671a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (child_clang_type && child_byte_size) 3672427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3673427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString child_name; 3674427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!child_name_str.empty()) 3675427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton child_name.SetCString (child_name_str.c_str()); 3676427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 367747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_deref_valobj = new ValueObjectChild (*this, 367847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham clang_ast, 367947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_clang_type, 368047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_name, 368147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_size, 368247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_byte_offset, 368347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_size, 368447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_bitfield_bit_offset, 368547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham child_is_base_class, 3686915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata child_is_deref_of_parent, 3687915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata eAddressTypeInvalid); 3688427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3689427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3690c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 369147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (m_deref_valobj) 3692c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3693c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 369447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return m_deref_valobj->GetSP(); 3695c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3696427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton else 3697427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3698c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString strm; 3699b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(strm, true); 3700c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3701c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (is_pointer_type) 3702c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 3703c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton else 3704c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str()); 370547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 3706427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3707427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3708427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 37095c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 3710c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error) 3711427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3712e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham if (m_addr_of_valobj_sp) 3713e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3714e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 3715b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeInvalid; 3716427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const bool scalar_is_load_address = false; 3717915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t addr = GetAddressOf (scalar_is_load_address, &address_type); 3718c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.Clear(); 3719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (addr != LLDB_INVALID_ADDRESS) 3720427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3721427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (address_type) 3722427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3723427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeInvalid: 3724c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 3725c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton StreamString expr_path_strm; 3726b01000fd063629facd45044f137446fb748ee179Greg Clayton GetExpressionPath(expr_path_strm, true); 3727c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str()); 3728c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 3729427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3730c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 3731427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeFile: 3732427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeLoad: 3733427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eAddressTypeHost: 3734427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3735427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang::ASTContext *ast = GetClangAST(); 3736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton clang_type_t clang_type = GetClangType(); 3737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 3738427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 3739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::string name (1, '&'); 3740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name.append (m_name.AsCString("")); 3741b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3742b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_addr_of_valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 374347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ast, 374447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ClangASTContext::CreatePointerType (ast, clang_type), 374547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ConstString (name.c_str()), 374647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham addr, 374747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeInvalid, 374847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham m_data.GetAddressByteSize()); 3749427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3750427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3751427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 3752427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3753427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 3754e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return m_addr_of_valobj_sp; 3755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3756427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 37574e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg ClaytonValueObjectSP 37584e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg ClaytonValueObject::Cast (const ClangASTType &clang_ast_type) 37594e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg Clayton{ 37600a19a1b9c25117854f226256805239d95153ed2dGreg Clayton return ValueObjectCast::Create (*this, GetName(), clang_ast_type); 37614e6640ee7975a9b9b0854aaa1f4d2d0f08702110Greg Clayton} 37620039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 37635c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 37640039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type) 37650039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 37665c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP valobj_sp; 37670039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 3768915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t ptr_value = GetPointerValue (&address_type); 37690039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 37700039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 37710039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 37723508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address ptr_addr (ptr_value); 3773b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3774b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(), 37750039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 37760039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 37770039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton clang_ast_type); 37780039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 37790039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 37800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 37810039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 37825c3861df62fde02d610a5ed92927a2d89333358bGreg ClaytonValueObjectSP 37830039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp) 37840039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{ 37855c3861df62fde02d610a5ed92927a2d89333358bGreg Clayton ValueObjectSP valobj_sp; 37860039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton AddressType address_type; 3787915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata addr_t ptr_value = GetPointerValue (&address_type); 37880039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 37890039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton if (ptr_value != LLDB_INVALID_ADDRESS) 37900039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton { 37913508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address ptr_addr (ptr_value); 3792b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 3793b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(), 37940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton name, 37950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton ptr_addr, 37960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton type_sp); 37970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton } 37980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton return valobj_sp; 37990039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton} 38000039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton 3801fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () : 3802b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3803b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(), 3804b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_needs_update (true), 3805b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3806fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3807fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3808fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3809fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected): 3810b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3811b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(), 3812fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_needs_update (true), 3813b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3814fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3815b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(exe_scope); 3816b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton TargetSP target_sp (exe_ctx.GetTargetSP()); 3817b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (target_sp) 3818fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3819b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetTargetSP (target_sp); 3820b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessSP process_sp (exe_ctx.GetProcessSP()); 3821b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!process_sp) 3822b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton process_sp = target_sp->GetProcessSP(); 3823fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3824b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process_sp) 3825fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3826b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id = process_sp->GetModID(); 3827b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetProcessSP (process_sp); 382821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 3829b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 3830fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3831b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!thread_sp) 3832fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3833fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3834b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 3835fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3836fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3837b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (thread_sp) 3838fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3839b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetThreadSP(thread_sp); 3840567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3841b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrameSP frame_sp (exe_ctx.GetFrameSP()); 3842b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!frame_sp) 3843fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3844fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (use_selected) 3845b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton frame_sp = thread_sp->GetSelectedFrame(); 3846fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3847b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (frame_sp) 3848b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref.SetFrameSP(frame_sp); 3849fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3850fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3851fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3852fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3853fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3854fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) : 3855b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id(), 3856b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_exe_ctx_ref(rhs.m_exe_ctx_ref), 3857b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_needs_update (true), 3858b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_first_update (true) 3859fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3860fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3861fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3862fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint () 3863fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 3864fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3865fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3866fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state. If the current 3867fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return 3868fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change". If the current state is different, we update our state, and return 3869fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change". If we did see a change, we also set m_needs_update to true, so 3870fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true. 38717c53768e700f9181082072017976472e3ad9cc37Jim Ingham// exe_scope will be set to the current execution context scope. 3872fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3873fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 3874b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg ClaytonValueObject::EvaluationPoint::SyncWithProcessState() 3875fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 38761586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 38771586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // Start with the target, if it is NULL, then we're obviously not going to get any further: 3878b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(m_exe_ctx_ref.Lock()); 38791586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3880b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (exe_ctx.GetTargetPtr() == NULL) 38811586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham return false; 38821586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3883fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If we don't have a process nothing can change. 3884b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton Process *process = exe_ctx.GetProcessPtr(); 3885b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process == NULL) 3886fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 38871586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 3888fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham // If our stop id is the current stop ID, nothing has changed: 3889b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessModID current_mod_id = process->GetModID(); 389021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 3891e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // If the current stop id is 0, either we haven't run yet, or the process state has been cleared. 3892e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham // In either case, we aren't going to be able to sync with the process state. 389321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (current_mod_id.GetStopID() == 0) 3894e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return false; 38957c53768e700f9181082072017976472e3ad9cc37Jim Ingham 38964a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton bool changed = false; 38974a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton const bool was_valid = m_mod_id.IsValid(); 38984a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (was_valid) 3899c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton { 3900c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton if (m_mod_id == current_mod_id) 3901c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton { 39029175f662273509b1260cff1e077a3a398ccc07d5Jim Ingham // Everything is already up to date in this object, no need to 3903c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton // update the execution context scope. 39047c53768e700f9181082072017976472e3ad9cc37Jim Ingham changed = false; 3905c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton } 39067c53768e700f9181082072017976472e3ad9cc37Jim Ingham else 39077c53768e700f9181082072017976472e3ad9cc37Jim Ingham { 39087c53768e700f9181082072017976472e3ad9cc37Jim Ingham m_mod_id = current_mod_id; 39097c53768e700f9181082072017976472e3ad9cc37Jim Ingham m_needs_update = true; 39107c53768e700f9181082072017976472e3ad9cc37Jim Ingham changed = true; 39117c53768e700f9181082072017976472e3ad9cc37Jim Ingham } 3912c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton } 3913fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 39141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // Now re-look up the thread and frame in case the underlying objects have gone away & been recreated. 39151586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // That way we'll be sure to return a valid exe_scope. 39161586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham // If we used to have a thread or a frame but can't find it anymore, then mark ourselves as invalid. 3917fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3918b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (m_exe_ctx_ref.HasThreadRef()) 3919fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3920b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP()); 3921b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (thread_sp) 3922fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3923b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (m_exe_ctx_ref.HasFrameRef()) 3924fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 3925b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP()); 3926b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (!frame_sp) 3927b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 3928b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton // We used to have a frame, but now it is gone 3929fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetInvalid(); 39304a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton changed = was_valid; 3931b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 3932fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3933fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 3934b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton else 3935b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 3936b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton // We used to have a thread, but now it is gone 3937b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton SetInvalid(); 39384a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton changed = was_valid; 3939b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 3940b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton 3941fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 39427c53768e700f9181082072017976472e3ad9cc37Jim Ingham return changed; 3943fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 3944fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 3945ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid 3946ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated () 3947ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{ 3948b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); 3949b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton if (process_sp) 3950b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton m_mod_id = process_sp->GetModID(); 3951ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_first_update = false; 3952ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_needs_update = false; 3953ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham} 3954ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3955ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham 3956b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//bool 3957b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//ValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope) 3958b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//{ 3959b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (!IsValid()) 3960b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// return false; 3961b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 3962b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// bool needs_update = false; 3963b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 3964b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // The target has to be non-null, and the 3965b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Target *target = exe_scope->CalculateTarget(); 3966b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (target != NULL) 3967b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 3968b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Target *old_target = m_target_sp.get(); 3969b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// assert (target == old_target); 3970b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Process *process = exe_scope->CalculateProcess(); 3971b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (process != NULL) 3972b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 3973b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // FOR NOW - assume you can't update variable objects across process boundaries. 3974b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Process *old_process = m_process_sp.get(); 3975b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// assert (process == old_process); 3976b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// ProcessModID current_mod_id = process->GetModID(); 3977b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_mod_id != current_mod_id) 3978b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 3979b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 3980b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_mod_id = current_mod_id; 3981b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 3982b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // See if we're switching the thread or stack context. If no thread is given, this is 3983b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // being evaluated in a global context. 3984b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// Thread *thread = exe_scope->CalculateThread(); 3985b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (thread != NULL) 3986b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 3987b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// user_id_t new_thread_index = thread->GetIndexID(); 3988b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (new_thread_index != m_thread_id) 3989b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 3990b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 3991b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = new_thread_index; 3992b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 3993b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 3994b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 3995b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// StackFrame *new_frame = exe_scope->CalculateStackFrame(); 3996b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (new_frame != NULL) 3997b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 3998b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (new_frame->GetStackID() != m_stack_id) 3999b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4000b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4001b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id = new_frame->GetStackID(); 4002b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4003b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4004b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4005b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4006b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4007b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4008b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4009b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4010b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4011b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4012b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // If this had been given a thread, and now there is none, we should update. 4013b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // Otherwise we don't have to do anything. 4014b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_thread_id != LLDB_INVALID_UID) 4015b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4016b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = LLDB_INVALID_UID; 4017b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4018b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4019b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4020b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4021b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4022b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4023b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4024b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // If there is no process, then we don't need to update anything. 4025b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // But if we're switching from having a process to not, we should try to update. 4026b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_process_sp.get() != NULL) 4027b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4028b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4029b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_process_sp.reset(); 4030b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = LLDB_INVALID_UID; 4031b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4032b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4033b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4034b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4035b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// else 4036b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4037b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // If there's no target, nothing can change so we don't need to update anything. 4038b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// // But if we're switching from having a target to not, we should try to update. 4039b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (m_target_sp.get() != NULL) 4040b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// { 4041b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// needs_update = true; 4042b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_target_sp.reset(); 4043b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_process_sp.reset(); 4044b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_thread_id = LLDB_INVALID_UID; 4045b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_stack_id.Clear(); 4046b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4047b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// } 4048b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// if (!m_needs_update) 4049b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// m_needs_update = needs_update; 4050b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// 4051b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton// return needs_update; 4052b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton//} 4053f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata 4054f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid 4055cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico GranataValueObject::ClearUserVisibleData(uint32_t clear_mask) 4056f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{ 4057cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsValue) == eClearUserVisibleDataItemsValue) 4058cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_value_str.clear(); 4059cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4060cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsLocation) == eClearUserVisibleDataItemsLocation) 4061cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_location_str.clear(); 4062cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4063cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsSummary) == eClearUserVisibleDataItemsSummary) 4064cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 4065cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_summary_str.clear(); 4066cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 4067cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4068cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsDescription) == eClearUserVisibleDataItemsDescription) 4069cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_object_desc_str.clear(); 4070cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata 4071cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) == eClearUserVisibleDataItemsSyntheticChildren) 4072cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata { 4073cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (m_synthetic_value) 4074cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata m_synthetic_value = NULL; 4075cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata } 40762bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen} 4077915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 4078915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataSymbolContextScope * 4079915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObject::GetSymbolContextScope() 4080915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 4081915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (m_parent) 4082915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 4083915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata if (!m_parent->IsPointerOrReferenceType()) 4084915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return m_parent->GetSymbolContextScope(); 4085915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 4086915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata return NULL; 4087915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 4088f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4089f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4090f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromExpression (const char* name, 4091f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* expression, 4092f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx) 4093f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4094f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP retval_sp; 4095f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::TargetSP target_sp(exe_ctx.GetTargetSP()); 4096f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target_sp) 4097f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4098f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!expression || !*expression) 4099f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4100f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target_sp->EvaluateExpression (expression, 4101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata exe_ctx.GetFrameSP().get(), 4102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata retval_sp); 4103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (retval_sp && name && *name) 4104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata retval_sp->SetName(ConstString(name)); 4105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return retval_sp; 4106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 4107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4109f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromAddress (const char* name, 4110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t address, 4111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx, 4112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType type) 4113f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType pointer_type(type.GetASTContext(),type.GetPointerType()); 4115f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); 4116f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 4117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata pointer_type.GetASTContext(), 4118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata pointer_type.GetOpaqueQualType(), 4119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ConstString(name), 4120f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata buffer, 4121f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::endian::InlHostByteOrder(), 4122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata exe_ctx.GetAddressByteSize())); 4123f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (ptr_result_valobj_sp) 4124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata { 4125f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress); 4126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Error err; 4127f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err); 4128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (ptr_result_valobj_sp && name && *name) 4129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ptr_result_valobj_sp->SetName(ConstString(name)); 4130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata } 4131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return ptr_result_valobj_sp; 4132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 4133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 4134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 4135f91e78f58692785db4daecf8461481b95827dcf2Enrico GranataValueObject::CreateValueObjectFromData (const char* name, 4136f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata DataExtractor& data, 4137f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const ExecutionContext& exe_ctx, 4138f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ClangASTType type) 4139f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 4140f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP new_value_sp; 4141f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 4142f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata type.GetASTContext() , 4143f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata type.GetOpaqueQualType(), 4144f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ConstString(name), 4145f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata data, 4146f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata LLDB_INVALID_ADDRESS); 4147f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad); 4148f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (new_value_sp && name && *name) 4149f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata new_value_sp->SetName(ConstString(name)); 4150f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return new_value_sp; 4151f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 4152