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