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