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 (&reg_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