ValueObject.cpp revision 80b01e59bda7984c1f4315f544a1e635de3bbd05
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
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObject.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
13eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include <stdlib.h>
14eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "llvm/Support/raw_ostream.h"
18b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "clang/AST/Type.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h"
221391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/Debugger.h"
23979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata#include "lldb/Core/Log.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h"
26427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h"
27e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectDynamicValue.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
290039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/ValueObjectMemory.h"
30e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata#include "lldb/Core/ValueObjectSyntheticFilter.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
33cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton
34f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata#include "lldb/Interpreter/ScriptInterpreterPython.h"
35f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h"
41b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h"
42afb7c85df796f74262917e44dd68f668dade3911Enrico Granata#include "lldb/Target/ObjCLanguageRuntime.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
45eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata#include "lldb/Utility/RefCounter.h"
4986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granatausing namespace lldb_utility;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
59fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) :
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (++g_value_obj_uid), // Unique identifier for every value object
61fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (&parent),
62dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (parent.GetUpdatePoint ()),
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (),
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data (),
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value (),
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error (),
6717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_str (),
6817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_old_value_str (),
6917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_location_str (),
7017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_summary_str (),
714ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    m_object_desc_str (),
7247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(parent.GetManager()),
7317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children (),
7417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_synthetic_children (),
7547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
76e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_synthetic_value(NULL),
7747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
7811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_format (eFormatDefault),
7923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_format_mgr_revision(0),
807dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    m_last_format_mgr_dynamic(parent.m_last_format_mgr_dynamic),
8123ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_summary_format(),
8223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_forced_summary_format(),
8323ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_value_format(),
84e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_last_synthetic_filter(),
8523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_user_id_of_forced_summary(0),
8617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid (false),
8717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change (false),
8817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid (false),
89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_old_value_valid (false),
9000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    m_pointers_point_to_load_addrs (false),
911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
92886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
94e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_is_expression_path_child(false),
95979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    m_is_child_at_offset(false),
96441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata    m_is_expression_result(parent.m_is_expression_result),
9786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    m_dump_printable_counter(0)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject(this);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ExecutionContextScope *exe_scope) :
106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    UserID (++g_value_obj_uid), // Unique identifier for every value object
107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (NULL),
108dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (exe_scope),
109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_name (),
110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_data (),
111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value (),
112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_error (),
113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_str (),
114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_str (),
115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_location_str (),
116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_summary_str (),
117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_object_desc_str (),
11847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(),
119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children (),
120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_synthetic_children (),
12147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
122e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_synthetic_value(NULL),
12347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_format (eFormatDefault),
12523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_format_mgr_revision(0),
126afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    m_last_format_mgr_dynamic(lldb::eNoDynamicValues),
12723ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_summary_format(),
12823ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_forced_summary_format(),
12923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_value_format(),
130e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_last_synthetic_filter(),
13123ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_user_id_of_forced_summary(0),
132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_is_valid (false),
133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_did_change (false),
134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children_count_valid (false),
135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_valid (false),
136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_pointers_point_to_load_addrs (false),
1371391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
138886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
1399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
140e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_is_expression_path_child(false),
141979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    m_is_child_at_offset(false),
142afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    m_is_expression_result(false),
14386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    m_dump_printable_counter(0)
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager = new ValueObjectManager();
14647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject (this);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor
151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject ()
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
157886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format)
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
159afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return UpdateValueIfNeeded(m_last_format_mgr_dynamic, update_format);
160afb7c85df796f74262917e44dd68f668dade3911Enrico Granata}
161afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
162afb7c85df796f74262917e44dd68f668dade3911Enrico Granatabool
163afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::UpdateValueIfNeeded (lldb::DynamicValueType use_dynamic, bool update_format)
164afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{
1651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
166886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (update_format)
167afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateFormatsIfNeeded(use_dynamic);
1681391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
169d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // If this is a constant value, then our success is predicated on whether
170d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // we have an error or not
171d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    if (GetIsConstant())
172d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        return m_error.Success();
173d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton
174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool first_update = m_update_point.IsFirstEvaluation();
175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_update_point.NeedsUpdating())
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
178fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_update_point.SetUpdated();
179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Save the old value using swap to avoid a string copy which
181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // also will clear our m_value_str
182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_value_str.empty())
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = false;
185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = true;
189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_str.swap (m_value_str);
190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_value_str.clear();
191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
193f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        ClearUserVisibleData();
194f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        const bool value_was_valid = GetValueIsValid();
196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueDidChange (false);
197ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_error.Clear();
199ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Call the pure virtual function to update the value
201fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        bool success = UpdateValue ();
202fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueIsValid (success);
204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (first_update)
206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (false);
207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else if (!m_value_did_change && success == false)
208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // The value wasn't gotten successfully, so we mark this
210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // as changed if the value used to be valid and now isn't
211fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (value_was_valid);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error.Success();
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granatavoid
218afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::UpdateFormatsIfNeeded(lldb::DynamicValueType use_dynamic)
2191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{
220979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
221979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (log)
222979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        log->Printf("checking for FormatManager revisions. VO named %s is at revision %d, while the format manager is at revision %d",
223979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata           GetName().GetCString(),
2241391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata           m_last_format_mgr_revision,
225979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata           Debugger::Formatting::ValueFormats::GetCurrentRevision());
2261a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (HasCustomSummaryFormat() && m_update_point.GetUpdateID() != m_user_id_of_forced_summary)
2271a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
2281a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ClearCustomSummaryFormat();
2291a102087f54079c25c8827afac6153a44ca535daEnrico Granata        m_summary_str.clear();
2301a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
231afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if ( (m_last_format_mgr_revision != Debugger::Formatting::ValueFormats::GetCurrentRevision()) ||
232afb7c85df796f74262917e44dd68f668dade3911Enrico Granata          m_last_format_mgr_dynamic != use_dynamic)
2331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
2341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_summary_format.get())
235f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            m_last_summary_format.reset((StringSummaryFormat*)NULL);
2361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_value_format.get())
237e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            m_last_value_format.reset(/*(ValueFormat*)NULL*/);
238e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        if (m_last_synthetic_filter.get())
239e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            m_last_synthetic_filter.reset(/*(SyntheticFilter*)NULL*/);
2409ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata
2419ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata        m_synthetic_value = NULL;
2428a717e596312951672ecd8c54df2d255e6da20baEnrico Granata
243441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata        Debugger::Formatting::ValueFormats::Get(*this, lldb::eNoDynamicValues, m_last_value_format);
244afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        Debugger::Formatting::GetSummaryFormat(*this, use_dynamic, m_last_summary_format);
245afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        Debugger::Formatting::GetSyntheticFilter(*this, use_dynamic, m_last_synthetic_filter);
2468a717e596312951672ecd8c54df2d255e6da20baEnrico Granata
2478a717e596312951672ecd8c54df2d255e6da20baEnrico Granata        m_last_format_mgr_revision = Debugger::Formatting::ValueFormats::GetCurrentRevision();
248afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        m_last_format_mgr_dynamic = use_dynamic;
249f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
250f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        ClearUserVisibleData();
2511391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
2521391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata}
2531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor &
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor ()
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
257afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateValueIfNeeded(false);
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error &
262bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError()
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
264afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateValueIfNeeded(false);
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error;
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString ()
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
277afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (UpdateValueIfNeeded(false))
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_location_str.empty())
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_value.GetValueType())
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeScalar:
2896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RegisterInfo *reg_info = m_value.GetRegisterInfo();
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (reg_info)
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info->name)
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->name;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (reg_info->alt_name)
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->alt_name;
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str = "scalar";
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeLoadAddress:
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeFileAddress:
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeHostAddress:
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2;
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_location_str.swap(sstr.GetString());
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_location_str.c_str();
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue &
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue()
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value &
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
332fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar)
3330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
334c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything
335c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    {
336c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        ExecutionContext exe_ctx;
337c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        ExecutionContextScope *exe_scope = GetExecutionContextScope();
338c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        if (exe_scope)
339c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata            exe_scope->CalculateExecutionContext(exe_ctx);
340c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ());
341c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        return scalar.IsValid();
342c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    }
343c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    else
344c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        return false;
3450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
3460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
3470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool
34817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_is_valid;
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b)
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid = b;
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
361fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange ()
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
363fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    GetValueAsCString ();
36417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_did_change;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed)
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change = value_changed;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
377917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
379afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateValueIfNeeded(false);
380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (idx < GetNumChildren())
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        // Check if we have already made the child value object?
383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (can_create && m_children[idx] == NULL)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // No we haven't created the child at this index, so lets have our
386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // subclass do it and cache the result for quick future access.
387917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            m_children[idx] = CreateChildAtIndex (idx, false, 0);
388e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
389917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
390917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_children[idx] != NULL)
391917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            return m_children[idx]->GetSP();
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name)
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
401462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                     GetClangType(),
402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name.GetCString(),
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes);
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4095d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // when getting a child by name, it could be buried inside some base
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // classes (which really aren't part of the expression path), so we
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // need a vector of indexes that can get us down to the correct child
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
414917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
415917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
416afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateValueIfNeeded(false);
417917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
418917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::vector<uint32_t> child_indexes;
419917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    void *clang_type = GetClangType();
421917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
422917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
423917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      clang_type,
424917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      name.GetCString(),
425917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      omit_empty_base_classes,
426917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      child_indexes);
427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (num_child_indexes > 0)
428e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
429917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
430917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
431e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        child_sp = GetChildAtIndex(*pos, can_create);
433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        for (++pos; pos != end; ++pos)
434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            if (child_sp)
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
438917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp = new_child_sp;
439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
440917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            else
441917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
442917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp.reset();
443e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
444917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren ()
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    if (!m_children_count_valid)
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetNumChildren (CalculateNumChildren());
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_children.size();
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children)
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid = true;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_children.resize(num_children);
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name)
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = name;
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47347da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject *
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
476bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham    ValueObject *valobj = NULL;
477e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
47924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    bool ignore_array_bounds = synthetic_array_member;
480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::string child_name_str;
481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_byte_size = 0;
482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    int32_t child_byte_offset = 0;
483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_size = 0;
484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_offset = 0;
485917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_base_class = false;
486917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_deref_of_parent = false;
487917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
488917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const bool transparent_pointers = synthetic_array_member == false;
489917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
490917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t clang_type = GetClangType();
491917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t child_clang_type;
492917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
493917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    ExecutionContext exe_ctx;
494917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
495917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
496917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_ast,
498917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  GetName().GetCString(),
499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_type,
500917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  idx,
501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  transparent_pointers,
502917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  omit_empty_base_classes,
50324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                  ignore_array_bounds,
504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_name_str,
505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_size,
506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_offset,
507917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_size,
508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_offset,
509917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_base_class,
510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_deref_of_parent);
511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (child_clang_type && child_byte_size)
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (synthetic_index)
514917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_byte_offset += child_byte_size * synthetic_index;
515917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
516917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        ConstString child_name;
517917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (!child_name_str.empty())
518917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_name.SetCString (child_name_str.c_str());
519917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
520917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        valobj = new ValueObjectChild (*this,
521917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       clang_ast,
522917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_clang_type,
523917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_name,
524917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_size,
525917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_offset,
526917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_size,
527917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_offset,
528917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_base_class,
529917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_deref_of_parent);
530917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_pointers_point_to_load_addrs)
531917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs);
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
533e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
53447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return valobj;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
538fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString ()
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5407dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    if (UpdateValueIfNeeded (true))
5411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_summary_str.empty())
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
544f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            SummaryFormat *summary_format = GetSummaryFormat().get();
5451a102087f54079c25c8827afac6153a44ca535daEnrico Granata
5461a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (summary_format)
5471391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            {
548f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                m_summary_str = summary_format->FormatObject(GetSP());
5491391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            }
550f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            else
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
552f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                clang_type_t clang_type = GetClangType();
553f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
55490d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                // Do some default printout for function pointers
555f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                if (clang_type)
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
557f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    StreamString sstr;
558f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    clang_type_t elem_or_pointee_clang_type;
559f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
560f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          GetClangAST(),
561f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          &elem_or_pointee_clang_type));
562f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
563f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    ExecutionContextScope *exe_scope = GetExecutionContextScope();
564f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    if (exe_scope)
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
56690d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                        if (ClangASTContext::IsFunctionPointerType (clang_type))
567fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
568f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            AddressType func_ptr_address_type = eAddressTypeInvalid;
569f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true);
570fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
571f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
572f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
573f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                switch (func_ptr_address_type)
57403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
575f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeInvalid:
576f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeFile:
577f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
578f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
579f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeLoad:
58003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    {
581f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Address so_addr;
582f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Target *target = exe_scope->CalculateTarget();
583f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        if (target && target->GetSectionLoadList().IsEmpty() == false)
584fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        {
585f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
586f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            {
587f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                so_addr.Dump (&sstr,
588f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              exe_scope,
589f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleResolvedDescription,
590f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleSectionNameOffset);
591f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            }
592fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        }
59303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    }
594f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
596f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeHost:
597f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
598f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
599f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            }
600f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (sstr.GetSize() > 0)
601f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
602f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.assign (1, '(');
603f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (sstr.GetData(), sstr.GetSize());
604f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (1, ')');
605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_summary_str.empty())
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_summary_str.c_str();
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6171a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool
6181a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer)
6191a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6201a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6211a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(),
6221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6241a102087f54079c25c8827afac6153a44ca535daEnrico Granata    bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6251a102087f54079c25c8827afac6153a44ca535daEnrico Granata            ClangASTContext::IsCharType (elem_or_pointee_clang_type));
6261a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!is_char_arr_ptr)
6271a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return false;
6281a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!check_pointer)
6291a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6301a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.Test(ClangASTContext::eTypeIsArray))
6311a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6321a102087f54079c25c8827afac6153a44ca535daEnrico Granata    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6331a102087f54079c25c8827afac6153a44ca535daEnrico Granata    AddressType cstr_address_type = eAddressTypeInvalid;
6341a102087f54079c25c8827afac6153a44ca535daEnrico Granata    cstr_address = GetAddressOf (cstr_address_type, true);
6351a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return (cstr_address != LLDB_INVALID_ADDRESS);
6361a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
6371a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6381a102087f54079c25c8827afac6153a44ca535daEnrico Granatavoid
6391a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ReadPointedString(Stream& s,
6401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                               Error& error,
64186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               uint32_t max_length,
64286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               bool honor_array,
64386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               lldb::Format item_format)
6441a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6451a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6461a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (max_length == 0)
64786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        max_length = 128;   // FIXME this should be a setting, or a formatting parameter
6481a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6491a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t clang_type = GetClangType();
6501a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6511a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
6521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6541a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6551a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ClangASTContext::IsCharType (elem_or_pointee_clang_type))
6561a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
6571a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ExecutionContextScope *exe_scope = GetExecutionContextScope();
6581a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (exe_scope)
6591a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
6601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Target *target = exe_scope->CalculateTarget();
661979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                if (target == NULL)
662979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                {
663979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    s << "<no target to read from>";
664979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                }
665979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                else
6661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
6671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    AddressType cstr_address_type = eAddressTypeInvalid;
6691a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    size_t cstr_len = 0;
6711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    bool capped_data = false;
6721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (type_flags.Test (ClangASTContext::eTypeIsArray))
6731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have an array
6751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_len = ClangASTContext::GetArraySize (clang_type);
67686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > max_length)
6771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
67886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            capped_data = true;
67986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
6801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
6811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetAddressOf (cstr_address_type, true);
6821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
6831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
6841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have a pointer
6861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetPointerValue (cstr_address_type, true);
6871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
688979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    if (cstr_address == LLDB_INVALID_ADDRESS)
689979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    {
690979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                        s << "<invalid address for data>";
691979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    }
692979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    else
6931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Address cstr_so_addr (NULL, cstr_address);
6951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        DataExtractor data;
6961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        size_t bytes_read = 0;
6971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        std::vector<char> data_buffer;
6981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        bool prefer_file_cache = false;
69986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > 0 && honor_array)
7001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
7011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize(cstr_len);
7021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder());
7031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            bytes_read = target->ReadMemory (cstr_so_addr,
7041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             prefer_file_cache,
7051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             &data_buffer.front(),
7061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             cstr_len,
7071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             error);
7081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (bytes_read > 0)
7091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
7101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
7111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
7121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
71386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
7141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
7151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           bytes_read,        // How many bytes to print?
7161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
7171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
7181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
7191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
7201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (capped_data)
7211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    s << "...";
7221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
7231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
724979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            else
725979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                s << "\"<data not available>\"";
7261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
7271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
7281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
72986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
73086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            const size_t k_max_buf_size = 64;
7311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize (k_max_buf_size + 1);
7321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            // NULL terminate in case we don't get the entire C string
7331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.back() = '\0';
7341a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7361a102087f54079c25c8827afac6153a44ca535daEnrico Granata
737979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            bool any_data = false;
738979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
7391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder());
7401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            while ((bytes_read = target->ReadMemory (cstr_so_addr,
7411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     prefer_file_cache,
7421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     &data_buffer.front(),
7431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     k_max_buf_size,
7441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     error)) > 0)
7451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
746979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                any_data = true;
7471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                size_t len = strlen(&data_buffer.front());
7481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len == 0)
7491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
7501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len > bytes_read)
7511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    len = bytes_read;
75286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len > cstr_len)
75386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    len = cstr_len;
7541a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
7561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
75786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
7581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
7591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           len,               // How many bytes to print?
7601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
7611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
7621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
7631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
7641a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len < k_max_buf_size)
7661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
76786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len >= cstr_len)
76886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                {
76986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    s << "...";
77086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    break;
77186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                }
77286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                cstr_len -= len;
7731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                cstr_so_addr.Slide (k_max_buf_size);
7741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
775979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
776979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            if (any_data == false)
777979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                s << "<data not available>";
778979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
7791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
7811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
7821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
7831a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
7841a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7851a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
7861a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
7871a102087f54079c25c8827afac6153a44ca535daEnrico Granata        error.SetErrorString("impossible to read a string from this object");
788979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        s << "<not a string object>";
7891a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7901a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
7911a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7924ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char *
793fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription ()
7944ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{
795886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
7967dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    if (!UpdateValueIfNeeded (true))
7974ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
798886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
799886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (!m_object_desc_str.empty())
800886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        return m_object_desc_str.c_str();
801886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
802fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
803fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope == NULL)
804fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return NULL;
805fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
8064ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    Process *process = exe_scope->CalculateProcess();
807b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (process == NULL)
8084ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
809b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
810b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    StreamString s;
8114ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
812b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    lldb::LanguageType language = GetObjectRuntimeLanguage();
813b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
8144ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
8150e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    if (runtime == NULL)
8160e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    {
81770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham        // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway...
8180e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        clang_type_t opaque_qual_type = GetClangType();
8190e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        if (opaque_qual_type != NULL)
8200e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        {
82170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            bool is_signed;
82270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed)
82370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham                || ClangASTContext::IsPointerType (opaque_qual_type))
82470c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            {
8250e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham                runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
82670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            }
8270e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        }
8280e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    }
8290e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham
8300de37195f17fefb536157b3296a18999116b8125Jim Ingham    if (runtime && runtime->GetObjectDescription(s, *this))
8314ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    {
8324ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        m_object_desc_str.append (s.GetData());
8334ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    }
834e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan
835e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    if (m_object_desc_str.empty())
836e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return NULL;
837e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    else
838e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return m_object_desc_str.c_str();
8394ae519666628cca07c194bf677163009cc2e5a8bJim Ingham}
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
842fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString ()
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If our byte size is zero this is an aggregate type that has children
845462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
847afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        if (UpdateValueIfNeeded(true))
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_value_str.empty())
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Value::ContextType context_type = m_value.GetContextType();
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (context_type)
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
8556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeClangType:
8566916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeLLDBType:
8576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeVariable:
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
859f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        clang_type_t clang_type = GetClangType ();
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (clang_type)
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
862afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            if (m_format == lldb::eFormatDefault && m_last_value_format)
8631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            {
864f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_value_str = m_last_value_format->FormatObject(GetSP());
8651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            }
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
86782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            {
868f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                StreamString sstr;
869f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                Format format = GetFormat();
870f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (format == eFormatDefault)
871f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        format = (m_is_bitfield_for_scalar ? eFormatUnsigned :
872f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        ClangASTType::GetFormat(clang_type));
873f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
874f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (ClangASTType::DumpTypeValue (GetClangAST(),            // The clang AST
875f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 clang_type,               // The clang type to display
876f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 &sstr,
877f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 format,                   // Format to display this type with
878f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 m_data,                   // Data to extract from
879f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 0,                        // Byte offset into "m_data"
880f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetByteSize(),            // Byte size of item in "m_data"
881f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitSize(),     // Bitfield bit size
882f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitOffset()))  // Bitfield bit offset
883f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.swap(sstr.GetString());
884f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                else
885f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                {
886f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)",
887f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      m_data.GetByteSize(),
888f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      GetByteSize());
889f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.clear();
890f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
89182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            }
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeRegisterInfo:
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info)
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString reg_sstr;
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_data.Dump(&reg_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_str.swap(reg_sstr.GetString());
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
90754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
90854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                default:
90954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    break;
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
91217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
91317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            if (!m_value_did_change && m_old_value_valid)
91417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            {
91517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // The value was gotten successfully, so we consider the
91617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // value as changed if the value string differs
91717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                SetValueDidChange (m_old_value_str != m_value_str);
91817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            }
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_value_str.empty())
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_str.c_str();
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
926afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used
927afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers
928afb7c85df796f74262917e44dd68f668dade3911Enrico Granataunsigned long long
929afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::GetValueAsUnsigned()
930afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{
931afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    // If our byte size is zero this is an aggregate type that has children
932afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
933afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    {
934afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        if (UpdateValueIfNeeded(true))
935afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        {
936afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            uint32_t offset = 0;
937afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            return m_data.GetMaxU64(&offset,
938afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                    m_data.GetByteSize());
939afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        }
940afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    }
941afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return 0;
942afb7c85df796f74262917e44dd68f668dade3911Enrico Granata}
943afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
9444e5397c1127d698c61df295f30909e573a1c9876Enrico Granatabool
9454e5397c1127d698c61df295f30909e573a1c9876Enrico GranataValueObject::GetPrintableRepresentation(Stream& s,
9464e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                                        ValueObjectRepresentationStyle val_obj_display,
947886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                        lldb::Format custom_format)
948886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{
94986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
95086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    RefCounter ref(&m_dump_printable_counter);
95186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
95290d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != lldb::eFormatInvalid)
953886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        SetFormat(custom_format);
954886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
955886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    const char * return_value;
95680b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata    std::string alloc_mem;
957886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
958886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    switch(val_obj_display)
959886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    {
960886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayValue:
961886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetValueAsCString();
962886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
963886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplaySummary:
964886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetSummaryAsCString();
965886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
966886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayLanguageSpecific:
967886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetObjectDescription();
968886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
969f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        case eDisplayLocation:
970f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            return_value = GetLocationAsCString();
971f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            break;
9724e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        case eDisplayChildrenCount:
9734e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        {
97480b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata            alloc_mem.resize(512);
97580b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata            return_value = &alloc_mem[0];
9764e5397c1127d698c61df295f30909e573a1c9876Enrico Granata            int count = GetNumChildren();
97780b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata            snprintf((char*)return_value, 512, "%d", count);
9784e5397c1127d698c61df295f30909e573a1c9876Enrico Granata            break;
9794e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        }
9804e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        default:
9814e5397c1127d698c61df295f30909e573a1c9876Enrico Granata            break;
982886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    }
983886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
98486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // this code snippet might lead to endless recursion, thus we use a RefCounter here to
98586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // check that we are not looping endlessly
98686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (!return_value && (m_dump_printable_counter < 3))
9879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
9889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // try to pick the other choice
9899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (val_obj_display == eDisplayValue)
9909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return_value = GetSummaryAsCString();
9919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else if (val_obj_display == eDisplaySummary)
992de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        {
993de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (ClangASTContext::IsAggregateType (GetClangType()) == true)
994de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            {
9954e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                // this thing has no value, and it seems to have no summary
9964e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                // some combination of unitialized data and other factors can also
9974e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                // raise this condition, so let's print a nice generic error message
9984e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                return_value = "<no available summary>";
999de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            }
1000de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else
1001de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                return_value = GetValueAsCString();
1002de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        }
10039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
1004886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
10054e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    if (return_value)
10064e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        s.PutCString(return_value);
10074e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    else
10084e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        s.PutCString("<no printable representation>");
10094e5397c1127d698c61df295f30909e573a1c9876Enrico Granata
10104e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    // we should only return false here if we could not do *anything*
10114e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    // even if we have an error message as output, that's a success
10124e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    // from our callers' perspective, so return true
10134e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    return true;
10144e5397c1127d698c61df295f30909e573a1c9876Enrico Granata
10159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
1016886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
10179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
10189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s,
10199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         ValueObjectRepresentationStyle val_obj_display,
10209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         lldb::Format custom_format)
10219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
102286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
102386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    clang_type_t elem_or_pointee_type;
102486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type));
10251a102087f54079c25c8827afac6153a44ca535daEnrico Granata
102686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer)
102786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata         && val_obj_display == ValueObject::eDisplayValue)
10281a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
102986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // when being asked to get a printable display an array or pointer type directly,
103086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // try to "do the right thing"
103186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
103286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (IsCStringContainer(true) &&
103386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCString ||
103486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatCharArray ||
103586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatChar ||
103686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatVectorOfChar)) // print char[] & char* directly
103786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
103886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            Error error;
103986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            ReadPointedString(s,
104086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              error,
104186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              0,
104286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatVectorOfChar) ||
104386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatCharArray));
104486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return !error.Fail();
104586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
104686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
104786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (custom_format == lldb::eFormatEnum)
104886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
104986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
105086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // this only works for arrays, because I have no way to know when
105186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // the pointed memory ends, and no special \0 end of data marker
105286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (flags.Test(ClangASTContext::eTypeIsArray))
105386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
105486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatBytes) ||
105586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatBytesWithASCII))
105686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
105786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
105886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
105986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
106086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
106186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
106286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
106386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
106486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
106586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
106686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
106786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
106886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
1069de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
107086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
107186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
107286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, custom_format);
107386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
107486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
107586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
107686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
107786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
107886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
107986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
108086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatVectorOfChar) ||
108186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat32) ||
108286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat64) ||
108386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt16) ||
108486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt32) ||
108586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt64) ||
108686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt8) ||
108786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt128) ||
108886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt16) ||
108986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt32) ||
109086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt64) ||
109186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly
109286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
109386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
109486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
109586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                lldb::Format format = FormatManager::GetSingleItemFormat(custom_format);
109686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
109786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
109886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
109986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
110086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
110186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
110286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
110386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
110486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
110586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
110686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
1107de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
110886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
110986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
111086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, format);
111186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
111286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
111386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
111486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
111586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
111686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
111786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
111886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
111986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if ((custom_format == lldb::eFormatBoolean) ||
112086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatBinary) ||
112186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatChar) ||
112286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCharPrintable) ||
112386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexFloat) ||
112486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDecimal) ||
112586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatHex) ||
112686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatFloat) ||
112786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOctal) ||
112886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOSType) ||
112986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode16) ||
113086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode32) ||
113186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnsigned) ||
113286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatPointer) ||
113386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexInteger) ||
113486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplex) ||
113586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDefault)) // use the [] operator
113686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
11371a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
11384e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    bool var_success = GetPrintableRepresentation(s, val_obj_display, custom_format);
113990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != eFormatInvalid)
114086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        SetFormat(eFormatDefault);
114186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    return var_success;
1142886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata}
1143886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
114403e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t
1145b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address)
1146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
1147afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
1148e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return LLDB_INVALID_ADDRESS;
1149e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
1151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
1152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeScalar:
1153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (scalar_is_load_address)
1154f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1155f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = eAddressTypeLoad;
1156f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1157f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1158f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1159f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1160f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeLoadAddress:
1161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeFileAddress:
1162f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeHostAddress:
1163f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1164f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = m_value.GetValueAddressType ();
1165f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1166f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1167f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1168f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
1169f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    address_type = eAddressTypeInvalid;
1170f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return LLDB_INVALID_ADDRESS;
1171f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
1172f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1173f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t
1174b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address)
117503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
117603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    lldb::addr_t address = LLDB_INVALID_ADDRESS;
117703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    address_type = eAddressTypeInvalid;
1178e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1179afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
1180e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return address;
1181e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1182f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
118303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
118403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeScalar:
118503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (scalar_is_load_address)
118603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
118703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
118803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = eAddressTypeLoad;
118903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
119003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
119103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
119203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeLoadAddress:
119303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeFileAddress:
119403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeHostAddress:
119503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
119603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            uint32_t data_offset = 0;
119703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_data.GetPointer(&data_offset);
119803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = m_value.GetValueAddressType();
119903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (address_type == eAddressTypeInvalid)
120003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                address_type = eAddressTypeLoad;
120103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
120203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
120303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (m_pointers_point_to_load_addrs)
1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        address_type = eAddressTypeLoad;
1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
120803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return address;
120903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
121003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str)
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our value is up to date first so that our location and location
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type is valid.
1216afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
1220462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *end = NULL;
1223bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    const size_t byte_size = GetByteSize();
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(unsigned long long))
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            unsigned long long ull_val = strtoull(value_str, &end, 0);
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
1239801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = ull_val;
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(long long))
124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            long long sll_val = strtoll(value_str, &end, 0);
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
1255801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = sll_val;
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const off_t byte_offset = GetByteOffset();
126454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size));
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst != NULL)
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We are decoding a float into host byte order below, so make
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // sure m_data knows what it contains.
1269cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                m_data.SetByteOrder(lldb::endian::InlHostByteOrder());
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue (
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        GetClangAST(),
1272462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                        GetClangType(),
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        value_str,
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        dst,
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        byte_size);
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (converted_byte_size == byte_size)
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we have made it here the value is in m_data and we should write it
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out to the target
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write ();
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write ()
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the update ID so the next time we try and read the value
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we try and read it again.
1301fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_update_point.SetNeedsUpdate();
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: when Value has a method to write a value back, call it from here.
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1308b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType
1309b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage ()
1310b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
1311afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return ClangASTType::GetMinimumLanguage (GetClangAST(),
1312afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                             GetClangType());
1313b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
1314b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
131647da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj)
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_synthetic_children[key] = valobj;
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const
132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
132547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key);
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_synthetic_children.end())
132747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        synthetic_child_sp = pos->second->GetSP();
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType ()
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1334462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerType (GetClangType());
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133770c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool
133824b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType ()
133924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
134024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return ClangASTContext::IsArrayType (GetClangType());
134124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
134224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
134324b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool
13449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType ()
13459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
13469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return ClangASTContext::IsScalarType (GetClangType());
13479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
13489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
13499762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
135070c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed)
135170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{
135270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham    return ClangASTContext::IsIntegerType (GetClangType(), is_signed);
135370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham}
1354f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType ()
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
135882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPointerOrReferenceType (GetClangType());
135982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
136082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
136182f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
136282f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType ()
136382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
136482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType());
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1367917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
1368917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType ()
1369917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
1370917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType());
1371917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
1372917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsPointerType ())
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char index_str[64];
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(index_str, sizeof(index_str), "[%i]", index);
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString index_const_str(index_str);
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already created a synthetic array member in this
138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // valid object. If we have we will re-use it.
138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = GetSyntheticChild (index_const_str);
138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!synthetic_child_sp)
138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
138747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            ValueObject *synthetic_child;
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We haven't made a synthetic array member for INDEX yet, so
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // lets make one and cache it for any future reference.
139047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            synthetic_child = CreateChildAtIndex(0, true, index);
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Cache the value if we got one back...
139347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            if (synthetic_child)
139447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            {
139547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                AddSyntheticChild(index_const_str, synthetic_child);
139647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                synthetic_child_sp = synthetic_child->GetSP();
1397979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
1398886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                synthetic_child_sp->m_is_array_item_for_pointer = true;
139947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            }
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1404642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
140524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index
140624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array.
140724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as:
140824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection
140924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// {
141024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     uint32_t item_count;
141124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     Item item_array[0];
141224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// };
141324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice
141424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array".
141524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
141624b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP
141724b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create)
141824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
141924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    ValueObjectSP synthetic_child_sp;
142024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    if (IsArrayType ())
142124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    {
142224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        char index_str[64];
142324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        snprintf(index_str, sizeof(index_str), "[%i]", index);
142424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        ConstString index_const_str(index_str);
142524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // Check if we have already created a synthetic array member in this
142624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // valid object. If we have we will re-use it.
142724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        synthetic_child_sp = GetSyntheticChild (index_const_str);
142824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        if (!synthetic_child_sp)
142924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        {
143024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            ValueObject *synthetic_child;
143124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // We haven't made a synthetic array member for INDEX yet, so
143224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // lets make one and cache it for any future reference.
143324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            synthetic_child = CreateChildAtIndex(0, true, index);
143424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
143524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // Cache the value if we got one back...
143624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            if (synthetic_child)
143724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            {
143824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                AddSyntheticChild(index_const_str, synthetic_child);
143924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp = synthetic_child->GetSP();
1440979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
144124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp->m_is_array_item_for_pointer = true;
144224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            }
144324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        }
144424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    }
144524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return synthetic_child_sp;
144624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
144724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
14489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP
14499762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create)
14509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
14519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    ValueObjectSP synthetic_child_sp;
14529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (IsScalarType ())
14539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
14549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        char index_str[64];
14559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
14569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        ConstString index_const_str(index_str);
14579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // Check if we have already created a synthetic array member in this
14589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // valid object. If we have we will re-use it.
14599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        synthetic_child_sp = GetSyntheticChild (index_const_str);
14609762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (!synthetic_child_sp)
14619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
14629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            ValueObjectChild *synthetic_child;
14639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // We haven't made a synthetic array member for INDEX yet, so
14649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // lets make one and cache it for any future reference.
14659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            synthetic_child = new ValueObjectChild(*this,
14669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangAST(),
14679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangType(),
14689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      index_const_str,
14699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetByteSize(),
14709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      0,
14719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      to-from+1,
14729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      from,
14739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false,
14749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false);
14759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
14769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // Cache the value if we got one back...
14779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            if (synthetic_child)
14789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            {
14799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                AddSyntheticChild(index_const_str, synthetic_child);
14809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp = synthetic_child->GetSP();
1481979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
14829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp->m_is_bitfield_for_scalar = true;
14839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            }
14849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
14859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
14869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return synthetic_child_sp;
14879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
14889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
1489979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatalldb::ValueObjectSP
1490979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create)
1491979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
1492979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1493979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ValueObjectSP synthetic_child_sp;
1494979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    char name_str[64];
1496979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    snprintf(name_str, sizeof(name_str), "@%i", offset);
1497979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ConstString name_const_str(name_str);
1498979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1499979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    // Check if we have already created a synthetic array member in this
1500979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    // valid object. If we have we will re-use it.
1501979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    synthetic_child_sp = GetSyntheticChild (name_const_str);
1502979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (synthetic_child_sp.get())
1504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return synthetic_child_sp;
1505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (!can_create)
1507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return lldb::ValueObjectSP();
1508979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1509979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
1510979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetASTContext(),
1511979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetOpaqueQualType(),
1512979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             name_const_str,
1513979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetTypeByteSize(),
1514979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             offset,
1515979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             0,
1516979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             0,
1517979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             false,
1518979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             false);
1519979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (synthetic_child)
1520979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
1521979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        AddSyntheticChild(name_const_str, synthetic_child);
1522979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp = synthetic_child->GetSP();
1523979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp->SetName(name_const_str);
1524979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp->m_is_child_at_offset = true;
1525979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
1526979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    return synthetic_child_sp;
1527979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
1528979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1529e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or ->
1530e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has
1531e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown
1532e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means
1533e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off
1534e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char*
1535e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression)
1536e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1537e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!expression || !expression[0])
1538e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression;
1539e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '.')
1540e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+1;
1541e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '-' && expression[1] == '>')
1542e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+2;
1543e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return expression;
1544e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1545e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1546e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatalldb::ValueObjectSP
1547e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create)
1548e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1549e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ValueObjectSP synthetic_child_sp;
1550e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ConstString name_const_string(expression);
1551e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // Check if we have already created a synthetic array member in this
1552e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // valid object. If we have we will re-use it.
1553e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    synthetic_child_sp = GetSyntheticChild (name_const_string);
1554e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!synthetic_child_sp)
1555e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    {
1556e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // We haven't made a synthetic array member for expression yet, so
1557e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // lets make one and cache it for any future reference.
1558e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        synthetic_child_sp = GetValueForExpressionPath(expression);
1559e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1560e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // Cache the value if we got one back...
1561e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        if (synthetic_child_sp.get())
1562e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        {
1563e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            AddSyntheticChild(name_const_string, synthetic_child_sp.get());
1564979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression)));
1565e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            synthetic_child_sp->m_is_expression_path_child = true;
1566e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        }
1567e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    }
1568e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return synthetic_child_sp;
1569e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1570e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1571e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid
1572e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::CalculateSyntheticValue (lldb::SyntheticValueType use_synthetic)
1573e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1574e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1575e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1576e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1577afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
1578e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1579e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1580e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1581e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
15829ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata    if (m_synthetic_value == NULL)
15839ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata        m_synthetic_value = new ValueObjectSynthetic(*this, m_last_synthetic_filter);
1584e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1585e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1586e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1587e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid
158810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic)
1589642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
159010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
159110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return;
159210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
159347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (!m_dynamic_value && !IsDynamic())
1594e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
1595979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        Process *process = m_update_point.GetProcessSP().get();
1596e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool worth_having_dynamic_value = false;
1597642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1598e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1599e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // FIXME: Process should have some kind of "map over Runtimes" so we don't have to
1600e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // hard code this everywhere.
1601e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        lldb::LanguageType known_type = GetObjectRuntimeLanguage();
1602e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC)
1603e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1604e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *runtime = process->GetLanguageRuntime (known_type);
1605e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (runtime)
1606e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this);
1607e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1608e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        else
1609e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1610e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus);
1611e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (cpp_runtime)
1612e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this);
1613e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1614e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (!worth_having_dynamic_value)
1615e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
1616e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC);
1617e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                if (objc_runtime)
161810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham                    worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this);
1619e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
1620e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1621e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1622e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (worth_having_dynamic_value)
162310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
162447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
162547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//        if (worth_having_dynamic_value)
162647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//            printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager);
1627e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1628e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
1629e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
1630e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
163147da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
163210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic)
1633e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
163410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
163510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return ValueObjectSP();
163610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
163710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (!IsDynamic() && m_dynamic_value == NULL)
1638e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
163910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        CalculateDynamicValue(use_dynamic);
1640e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
164147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_dynamic_value)
164247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_dynamic_value->GetSP();
164347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    else
164447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
1645642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
164666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1647e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// GetDynamicValue() returns a NULL SharedPointer if the object is not dynamic
1648e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// or we do not really want a dynamic VO. this method instead returns this object
1649e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// itself when making it synthetic has no meaning. this makes it much simpler
1650e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to replace the SyntheticValue for the ValueObject
1651e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP
1652e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticValue (SyntheticValueType use_synthetic)
1653e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1654e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1655e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1656e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1657afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
1658e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1659e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1660e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1661e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1662e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    CalculateSyntheticValue(use_synthetic);
1663e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1664e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_synthetic_value)
1665e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return m_synthetic_value->GetSP();
1666e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    else
1667e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1668e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1669e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
167000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool
167100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s)
167200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
167300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (IsBaseClass())
167400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1675e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
167600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        clang_type_t clang_type = GetClangType();
167700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        std::string cxx_class_name;
167800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name);
167900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (this_had_base_class)
168000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        {
168100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (parent_had_base_class)
168200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString("::");
168300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            s.PutCString(cxx_class_name.c_str());
168400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        }
168500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        return parent_had_base_class || this_had_base_class;
168600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
168700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return false;
168800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
168900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
169000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
169100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject *
169200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent()
169300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
1694e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (GetParent())
169500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1696e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (GetParent()->IsBaseClass())
1697e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent()->GetNonBaseClassParent();
169800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        else
1699e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent();
170000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
170100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return NULL;
170200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
170366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
170466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid
17051391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
1706bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
170700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    const bool is_deref_of_parent = IsDereferenceOfParent ();
170800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
170990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
17101391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
17111391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
17121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // the eHonorPointers mode is meant to produce strings in this latter format
17131391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s.PutCString("*(");
17141391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
171500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
17161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    ValueObject* parent = GetParent();
17171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
17181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (parent)
17191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
1720886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
1721886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // if we are a deref_of_parent just because we are synthetic array
1722886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // members made up to allow ptr[%d] syntax to work in variable
1723886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // printing, then add our name ([%d]) to the expression path
172490d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (m_is_array_item_for_pointer && epformat == eHonorPointers)
1725886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        s.PutCString(m_name.AsCString());
17261391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
172700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (!IsBaseClass())
172800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
172900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (!is_deref_of_parent)
1730bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
173100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            ValueObject *non_base_class_parent = GetNonBaseClassParent();
173200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (non_base_class_parent)
1733bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
173400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType();
173500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (non_base_class_parent_clang_type)
173600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
173700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL);
173800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
173990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                    if (parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers)
174000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    {
174100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("->");
174200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
17431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    else
17441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    {
17451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer)
17461391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
17471391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutCString("->");
17481391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
17491391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) &&
17501391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                 !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray))
17511391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
17521391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutChar('.');
17531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
175400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
175500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
1756bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
175700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
175800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            const char *name = GetName().GetCString();
175900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (name)
1760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
176100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (qualify_cxx_base_classes)
176200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
176300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    if (GetBaseClassPath (s))
176400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("::");
176500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
176600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString(name);
1767bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1768bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
1769bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1770bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
17711391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
177200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        s.PutChar(')');
17731391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
1774bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1775bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1776ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1777ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression,
1778ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const char** first_unparsed,
1779ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathScanEndReason* reason_to_stop,
1780ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathEndResultType* final_value_type,
1781ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const GetValueForExpressionPathOptions& options,
1782ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathAftermath* final_task_on_target)
1783ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1784ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1785ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    const char* dummy_first_unparsed;
1786ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
1787ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathEndResultType dummy_final_value_type;
1788ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
1789ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1790ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
1791ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
1792ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
1793ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
1794ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           options,
1795ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
1796ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1797ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
1798ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1799ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ret_val;
1800ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1801ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
1802ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1803ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eDereference)
1804ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1805ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1806ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->Dereference(error);
1807ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1808ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1809ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eDereferencingFailed;
1810ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1811ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1812ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1813ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1814ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1815ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1816ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1818ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1819ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eTakeAddress)
1820ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1821ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1822ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->AddressOf(error);
1823ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1824ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1825ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eTakingAddressFailed;
1826ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1827ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1828ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1829ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1830ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1831ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1832ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1833ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1834ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1835ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1836ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    return ret_val; // final_task_on_target will still have its original value, so you know I did not do it
1837ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
1838ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
18391a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
18401a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression,
18411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
18421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
18431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
18441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_value_type,
18451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
18461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* final_task_on_target)
18471a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
18481a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const char* dummy_first_unparsed;
18491a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
18501a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathEndResultType dummy_final_value_type;
18511a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
18521a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18531a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
18541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
18551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
18561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
18571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           options,
18581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
18591a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18601a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!ret_val.get()) // if there are errors, I add nothing to the list
18611a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
18621a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18631a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (*reason_to_stop != eArrayRangeOperatorMet)
18641a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
18651a102087f54079c25c8827afac6153a44ca535daEnrico Granata        // I need not expand a range, just post-process the final value and return
18661a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
18671a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
18681a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(ret_val);
18691a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
18701a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
18711a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
18721a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
18731a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eDereference)
18741a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
18751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
18761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->Dereference(error);
18771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
18781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eDereferencingFailed;
18801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
18811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
18821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
18841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
18861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
18871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
18881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18891a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
18901a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eTakeAddress)
18911a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
18921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
18931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->AddressOf(error);
18941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
18951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eTakingAddressFailed;
18971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
18981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
18991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
19001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
19011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
19021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
19031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
19041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
19051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
19061a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
19071a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
19081a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
19091a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
19101a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
19111a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed,
19121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          first_unparsed ? first_unparsed : &dummy_first_unparsed,
19131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          ret_val,
19141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          list,
19151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
19161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_value_type ? final_value_type : &dummy_final_value_type,
19171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          options,
19181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
19191a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
19201a102087f54079c25c8827afac6153a44ca535daEnrico Granata    // in any non-covered case, just do the obviously right thing
19211a102087f54079c25c8827afac6153a44ca535daEnrico Granata    list->Append(ret_val);
19221a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return 1;
19231a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
19241a102087f54079c25c8827afac6153a44ca535daEnrico Granata
1925ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1926ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
1927ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const char** first_unparsed,
1928ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathScanEndReason* reason_to_stop,
1929ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathEndResultType* final_result,
1930ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const GetValueForExpressionPathOptions& options,
1931ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathAftermath* what_next)
1932ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1933ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP root = GetSP();
1934ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1935ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!root.get())
1936ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ValueObjectSP();
1937ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1938ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    *first_unparsed = expression_cstr;
1939ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1940ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    while (true)
1941ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1942ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1943ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
1944ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1945ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
19461a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
19471a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
19481a102087f54079c25c8827afac6153a44ca535daEnrico Granata
19491a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
19501a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
19511a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
1952ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1953ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (!expression_cstr || *expression_cstr == '\0')
1954ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            *reason_to_stop = ValueObject::eEndOfString;
1956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            return root;
1957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1958ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1959ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        switch (*expression_cstr)
1960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1961ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '-':
1962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax &&
19641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error
1965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eArrowInsteadOfDot;
1968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
19711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) &&  // if yo are trying to extract an ObjC IVar when this is forbidden
19721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) &&
1973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    options.m_no_fragile_ivar)
1974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eFragileIVarNotAllowed;
1977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1978ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1980ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (expression_cstr[1] != '>')
1981ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
1984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip the -
1988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '.': // or fallthrough from ->
1990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
19921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error
1993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eDotInsteadOfArrow;
1996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip .
2000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *next_separator = strpbrk(expression_cstr+1,"-.[");
2001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                ConstString child_name;
2002ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!next_separator) // if no other separator just expand this last layer
2003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2004ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCString (expression_cstr);
2005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
2006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // we know we are done, so just return
2007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = '\0';
2009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEndOfString;
2010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
2011ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
2017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2018ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // other layers do expand
2022ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
2024ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
2025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // store the new root and move on
2026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = next_separator;
2028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
2029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        continue;
2030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2031ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2033ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2034ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
2035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2036ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2038ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2039ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2040ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2041ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '[':
2042ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
20431a102087f54079c25c8827afac6153a44ca535daEnrico 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*
2044ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
20451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
2046ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2047ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2048ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorInvalid;
2049ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2050ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2051ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
2053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2054ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
2056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2057ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2058ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2059ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2060ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
2061ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
20621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2063ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2064ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2065ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
2066ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2067ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2068ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2069ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else // even if something follows, we cannot expand unbounded ranges, just let the caller do it
2070ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2071ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr+2;
2072ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2073ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eUnboundedRange;
2074ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2075ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2076ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2077ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
2078ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
2079ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
2080ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2081ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
2082ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
2083ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
2084ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2085ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2086ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
2087ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2088ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2089ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
2090ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2091ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2092ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2093ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2094ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2095ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2096ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2097ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
2098ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
20991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2100ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2101ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr+2;
2102ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2103ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eUnboundedRange;
2104ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2105ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2106ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2107ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2108ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2109ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
2110ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2111ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2112ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2113ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2114ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    // from here on we do have a valid index
21151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2116ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
211724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
211824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (!child_valobj_sp)
211924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true);
212024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (child_valobj_sp)
212124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        {
212224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            root = child_valobj_sp;
212324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *first_unparsed = end+1; // skip ]
212424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *final_result = ValueObject::ePlain;
212524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            continue;
212624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        }
212724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        else
2128ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2129ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2130ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2131ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2132ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2133ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2134ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
21351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
2136ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2137ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (*what_next == ValueObject::eDereference &&  // 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
21381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2139ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            Error error;
2141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            root = root->Dereference(error);
2142ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (error.Fail() || !root.get())
2143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
2146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2147ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2148ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2149ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2150ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2151ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *what_next = eNothing;
2152ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2153ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2154ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2155ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2156ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2157ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
2158ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (!root.get())
2159ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2160ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2161ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
2162ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2163ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2164ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2165ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2166ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2167ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = end+1; // skip ]
2168ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::ePlain;
2169ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2170ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2171ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2172ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2173ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
2174ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2175ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
2176ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2177ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2178ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2179ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2180ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2181ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2182ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
2184ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2186ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2187ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2188ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2189ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2190ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2191ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2192ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // we have a low and a high index
2193ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2194ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2195ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
2196ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an error
2197ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2198ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2199ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2200ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2201ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2202ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2203ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
2204ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2205ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2206ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2207ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2208ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2209ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2210ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2211ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (index_lower > index_higher) // swap indices if required
2212ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2213ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        unsigned long temp = index_lower;
2214ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_lower = index_higher;
2215ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_higher = temp;
2216ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
22171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
2218ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2219ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
2220ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2221ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2222ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2223ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2224ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2225ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2226ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2227ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2228ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2229ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2230ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2231ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2232ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2233ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2234ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
22351a102087f54079c25c8827afac6153a44ca535daEnrico 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
2236ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                             *what_next == ValueObject::eDereference &&
22371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2238ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2239ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        Error error;
2240ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->Dereference(error);
2241ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (error.Fail() || !root.get())
2242ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2243ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2244ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
2245ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2246ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2247ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2248ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2249ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2250ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *what_next = ValueObject::eNothing;
2251ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            continue;
2252ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2253ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2254ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2255ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2256ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2257ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2258ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eBoundedRange;
2259ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2260ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2261ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2262ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2263ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2264ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            default: // some non-separator is in the way
2265ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
2266ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *first_unparsed = expression_cstr;
2267ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
2268ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_result = ValueObject::eInvalid;
2269ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
2270ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2271ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2272ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
2273ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
2274ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
2275ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
22761a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
22771a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr,
22781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
22791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectSP root,
22801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
22811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
22821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_result,
22831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
22841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* what_next)
22851a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
22861a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!root.get())
22871a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
22881a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22891a102087f54079c25c8827afac6153a44ca535daEnrico Granata    *first_unparsed = expression_cstr;
22901a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22911a102087f54079c25c8827afac6153a44ca535daEnrico Granata    while (true)
22921a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
22931a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22941a102087f54079c25c8827afac6153a44ca535daEnrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
22951a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22961a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
22971a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
22981a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
22991a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23001a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
23011a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
23021a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
23031a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23041a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!expression_cstr || *expression_cstr == '\0')
23051a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
23061a102087f54079c25c8827afac6153a44ca535daEnrico Granata            *reason_to_stop = ValueObject::eEndOfString;
23071a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(root);
23081a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
23091a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
23101a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23111a102087f54079c25c8827afac6153a44ca535daEnrico Granata        switch (*expression_cstr)
23121a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
23131a102087f54079c25c8827afac6153a44ca535daEnrico Granata            case '[':
23141a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
23151a102087f54079c25c8827afac6153a44ca535daEnrico 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*
23161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
23181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorInvalid;
23211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
23251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
23281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
23331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
23351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
23381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else // expand this into list
23421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        int max_index = root->GetNumChildren() - 1;
23441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        for (int index = 0; index < max_index; index++)
23451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
23471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
23481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
23491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr+2;
23511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
23531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return max_index; // tell me number of items I added to the VOList
23541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
23571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
23581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
23591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *first_unparsed = expression_cstr;
23611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
23621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_result = ValueObject::eInvalid;
23631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
23641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
23661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
23681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
23691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
23701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
23731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
23771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
23791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            int max_index = root->GetNumChildren() - 1;
23811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            for (int index = 0; index < max_index; index++)
23821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
23831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                ValueObjectSP child =
23841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
23851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(child);
23861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
23871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr+2;
23881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
23901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return max_index; // tell me number of items I added to the VOList
23911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
23931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
23951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
23961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
23971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
23981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    // from here on we do have a valid index
24011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
24021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetChildAtIndex(index, true);
24041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
24051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
24081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
24141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
24151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
24171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
24181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
24211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (*what_next == ValueObject::eDereference &&  // 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
24231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
24241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            Error error;
24261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->Dereference(error);
24271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (error.Fail() || !root.get())
24281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
24301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
24311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *what_next = eNothing;
24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                continue;
24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (!root.get())
24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(root);
24531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = end+1; // skip ]
24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eValueObjectList;
24561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 1;
24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
24611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
24631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
24711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
24771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else // we have a low and a high index
24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
24821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an error
24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
24881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
24921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
24931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
24961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (index_lower > index_higher) // swap indices if required
25001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        unsigned long temp = index_lower;
25021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_lower = index_higher;
25031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_higher = temp;
25041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
25061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
25081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
25091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
25111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
25131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
25181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
25191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
25201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
25211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
25221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25241a102087f54079c25c8827afac6153a44ca535daEnrico 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
25251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             *what_next == ValueObject::eDereference &&
25261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
25271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Error error;
25291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->Dereference(error);
25301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (error.Fail() || !root.get())
25311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
25331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
25341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
25351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
25361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
25381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *what_next = ValueObject::eNothing;
25401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            continue;
25411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25452bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen                        for (unsigned long index = index_lower;
25461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             index <= index_higher; index++)
25471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
25491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
25501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
25511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = end+1;
25531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
25541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
25551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return index_higher-index_lower+1; // tell me number of items I added to the VOList
25561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
25581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
25591a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
25601a102087f54079c25c8827afac6153a44ca535daEnrico Granata            default: // some non-[ separator, or something entirely wrong, is in the way
25611a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
25621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *first_unparsed = expression_cstr;
25631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
25641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *final_result = ValueObject::eInvalid;
25651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                return 0;
25661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
25671a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
25681a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
25691a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
25701a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
25711a102087f54079c25c8827afac6153a44ca535daEnrico Granata
2572bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid
257366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject
257466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton(
257566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    Stream &s,
257666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ValueObject *valobj,
257766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    const char *root_valobj_name,
257866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t ptr_depth,
257966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t curr_depth,
258066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t max_depth,
258166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_types,
258266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_location,
258366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool use_objc,
258410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    lldb::DynamicValueType use_dynamic,
2585e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    bool use_synth,
2586bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool scope_already_checked,
25877f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    bool flat_output,
25887f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    uint32_t omit_summary_depth
258966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton)
259066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
259182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (valobj)
259266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
2593afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        bool update_success = valobj->UpdateValueIfNeeded (use_dynamic, true);
259482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
259582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (update_success && use_dynamic != lldb::eNoDynamicValues)
2596e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
259710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get();
2598e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (dynamic_value)
2599e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                valobj = dynamic_value;
2600e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
2601e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2602bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = valobj->GetClangType();
2603bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2604f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
2605bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *err_cstr = NULL;
2606f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
2607f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
2608bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2609bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const bool print_valobj = flat_output == false || has_value;
2610bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2611bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (print_valobj)
261266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2613bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (show_location)
2614bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2615fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                s.Printf("%s: ", valobj->GetLocationAsCString());
2616bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
261766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2618bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.Indent();
261966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2620a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            // Always show the type for the top level items.
262100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (show_types || (curr_depth == 0 && !flat_output))
2622afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            {
2623441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                const char* typeName = valobj->GetTypeName().AsCString("<invalid type>");
2624441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                s.Printf("(%s", typeName);
2625441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                // only show dynamic types if the user really wants to see types
2626441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                if (show_types && use_dynamic != lldb::eNoDynamicValues &&
2627441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                    (/*strstr(typeName, "id") == typeName ||*/
2628441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                     ClangASTType::GetMinimumLanguage(valobj->GetClangAST(), valobj->GetClangType()) == lldb::eLanguageTypeObjC))
2629afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                {
2630afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    Process* process = valobj->GetUpdatePoint().GetProcessSP().get();
2631afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    if (process == NULL)
2632441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                        s.Printf(", dynamic type: unknown) ");
2633afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    else
2634afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    {
2635afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
2636afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        if (runtime == NULL)
2637441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                            s.Printf(", dynamic type: unknown) ");
2638afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        else
2639afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        {
2640afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            ObjCLanguageRuntime::ObjCISA isa = runtime->GetISA(*valobj);
2641afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            if (!runtime->IsValidISA(isa))
2642441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                                s.Printf(", dynamic type: unknown) ");
2643afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            else
2644afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                s.Printf(", dynamic type: %s) ",
2645afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                         runtime->GetActualTypeName(isa).GetCString());
2646afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        }
2647afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    }
2648afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                }
2649afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                else
2650afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    s.Printf(") ");
2651afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            }
265266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
265366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2654bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (flat_output)
2655bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2656b01000fd063629facd45044f137446fb748ee179Greg Clayton                // If we are showing types, also qualify the C++ base classes
2657b01000fd063629facd45044f137446fb748ee179Greg Clayton                const bool qualify_cxx_base_classes = show_types;
2658b01000fd063629facd45044f137446fb748ee179Greg Clayton                valobj->GetExpressionPath(s, qualify_cxx_base_classes);
2659bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString(" =");
2660bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2661bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else
2662bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2663bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
2664bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf ("%s =", name_cstr);
2665bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2666bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2667fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (!scope_already_checked && !valobj->IsInScope())
2668bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
266982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                err_cstr = "out of scope";
2670bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
267166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
267266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2673bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *val_cstr = NULL;
26741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        const char *sum_cstr = NULL;
26751a102087f54079c25c8827afac6153a44ca535daEnrico Granata        SummaryFormat* entry = valobj->GetSummaryFormat().get();
2676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
26777f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        if (omit_summary_depth > 0)
26787f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            entry = NULL;
26797f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
2680bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (err_cstr == NULL)
2681bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
2682fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            val_cstr = valobj->GetValueAsCString();
2683bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            err_cstr = valobj->GetError().AsCString();
2684bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
268566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
268666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        if (err_cstr)
268766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
268882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            s.Printf (" <%s>\n", err_cstr);
268966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
269066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        else
269166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2692f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
2693bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (print_valobj)
2694bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
26951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
26967f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL;
269766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
26981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // We must calculate this value in realtime because entry might alter this variable's value
26991391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // (e.g. by saying ${var%fmt}) and render precached values useless
27001391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr))
27011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    s.Printf(" %s", valobj->GetValueAsCString());
270266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
270390d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                if (sum_cstr)
2704886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                {
2705886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // for some reason, using %@ (ObjC description) in a summary string, makes
2706886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // us believe we need to reset ourselves, thus invalidating the content of
2707886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty
2708886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // let us recalculate it!
2709886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (sum_cstr[0] == '\0')
2710886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", valobj->GetSummaryAsCString());
2711886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    else
2712886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", sum_cstr);
2713886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
2714bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2715bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (use_objc)
2716bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
2717fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    const char *object_desc = valobj->GetObjectDescription();
2718bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (object_desc)
2719bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        s.Printf(" %s\n", object_desc);
2720bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2721e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan                        s.Printf (" [no Objective-C description available]\n");
2722bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    return;
2723886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
272466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
272566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
272666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            if (curr_depth < max_depth)
272766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We will show children for all concrete types. We won't show
2729f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // pointer contents unless a pointer depth has been specified.
2730f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We won't reference contents unless the reference is the
2731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // root object (depth of zero).
2732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                bool print_children = true;
2733f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // Use a new temporary pointer depth in case we override the
2735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // current pointer depth below...
2736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                uint32_t curr_ptr_depth = ptr_depth;
2737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2738f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
2739f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (is_ptr || is_ref)
2740f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer or reference whose value is an address.
2742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // Make sure that address is not NULL
2743b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType ptr_address_type;
2744f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (valobj->GetPointerValue (ptr_address_type, true) == 0)
2745f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    else if (is_ref && curr_depth == 0)
2748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2749f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // If this is the root object (depth is zero) that we are showing
2750f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // and it is a reference, and no pointer depth has been supplied
2751f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // print out what it references. Don't do this at deeper depths
2752f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // otherwise we can end up with infinite recursion...
2753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        curr_ptr_depth = 1;
2754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (curr_ptr_depth == 0)
2757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
275966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2760886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr))
276166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2762e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    ValueObjectSP synth_vobj = valobj->GetSyntheticValue(use_synth ?
2763e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eUseSyntheticFilter :
2764e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eNoSyntheticFilter);
2765e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    const uint32_t num_children = synth_vobj->GetNumChildren();
2766bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (num_children)
276766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    {
2768bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (flat_output)
276966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        {
2770bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
2771bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                s.EOL();
2772bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2773bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        else
2774bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2775bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
27763f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                                s.PutCString(is_ref ? ": {\n" : " {\n");
2777bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentMore();
2778bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2779bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2780bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        for (uint32_t idx=0; idx<num_children; ++idx)
2781bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2782e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                            ValueObjectSP child_sp(synth_vobj->GetChildAtIndex(idx, true));
2783bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (child_sp.get())
2784bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            {
2785bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                DumpValueObject (s,
2786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 child_sp.get(),
2787bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 NULL,
2788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                 (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
2789bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 curr_depth + 1,
2790bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 max_depth,
2791bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_types,
2792bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_location,
2793bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 false,
2794e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                                 use_dynamic,
2795e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                 use_synth,
2796bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 true,
27977f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 flat_output,
27987f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 omit_summary_depth > 1 ? omit_summary_depth - 1 : 0);
2799bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            }
2800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2801bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2802bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (!flat_output)
2803bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2804bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentLess();
2805bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.Indent("}\n");
280666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        }
280766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    }
2808bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else if (has_children)
2809bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2810bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        // Aggregate, no children...
2811bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2812f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            s.PutCString(" {}\n");
2813bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2814bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2815bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2816bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2817bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.EOL();
2818bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2819bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
282066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
2821bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                else
2822bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
282366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    s.EOL();
282466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
282566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
282666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            else
282766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2828bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (has_children && print_valobj)
282966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2830bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutCString("{...}\n");
283166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
283266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
283366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
283466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
283566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
283666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2837427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2838427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP
2839fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name)
2840427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
2841427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueObjectSP valobj_sp;
2842427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2843afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (UpdateValueIfNeeded(false) && m_error.Success())
2844427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2845fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        ExecutionContextScope *exe_scope = GetExecutionContextScope();
2846fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_scope)
2847fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
2848fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            ExecutionContext exe_ctx;
2849fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            exe_scope->CalculateExecutionContext(exe_ctx);
2850427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2851fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            clang::ASTContext *ast = GetClangAST ();
2852427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2853fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            DataExtractor data;
2854fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetByteOrder (m_data.GetByteOrder());
2855fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetAddressByteSize(m_data.GetAddressByteSize());
2856427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2857801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule());
2858427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
285947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            valobj_sp = ValueObjectConstResult::Create (exe_scope,
286047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        ast,
286147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        GetClangType(),
286247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        name,
286347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        data);
2864fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2866fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2867fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!valobj_sp)
2868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
286947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        valobj_sp = ValueObjectConstResult::Create (NULL, m_error);
2870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2871427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
2872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2873427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2874427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
2875bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error)
2876427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
287747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
287847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
2879e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2880c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const bool is_pointer_type = IsPointerType();
2881c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (is_pointer_type)
2882427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool omit_empty_base_classes = true;
288424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        bool ignore_array_bounds = false;
2885427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2886427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        std::string child_name_str;
2887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_byte_size = 0;
2888427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        int32_t child_byte_offset = 0;
2889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_size = 0;
2890427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_offset = 0;
2891427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool child_is_base_class = false;
289200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool child_is_deref_of_parent = false;
2893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const bool transparent_pointers = false;
2894427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *clang_ast = GetClangAST();
2895427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t clang_type = GetClangType();
2896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t child_clang_type;
289758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
289858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        ExecutionContext exe_ctx;
289958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
290058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
290158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
290258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                                      clang_ast,
2903427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetName().GetCString(),
2904427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      clang_type,
2905427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      0,
2906427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      transparent_pointers,
2907427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      omit_empty_base_classes,
290824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                      ignore_array_bounds,
2909427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_name_str,
2910427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_size,
2911427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_offset,
2912427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_size,
2913427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_offset,
291400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_base_class,
291500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_deref_of_parent);
2916a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (child_clang_type && child_byte_size)
2917427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
2918427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ConstString child_name;
2919427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (!child_name_str.empty())
2920427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                child_name.SetCString (child_name_str.c_str());
2921427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
292247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            m_deref_valobj = new ValueObjectChild (*this,
292347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   clang_ast,
292447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_clang_type,
292547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_name,
292647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_size,
292747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_offset,
292847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_size,
292947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_offset,
293047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_base_class,
293147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_deref_of_parent);
2932427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
2933427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2934c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
293547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
2936c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
2937c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        error.Clear();
293847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
2939c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2940427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
2941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2942c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        StreamString strm;
2943b01000fd063629facd45044f137446fb748ee179Greg Clayton        GetExpressionPath(strm, true);
2944c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2945c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        if (is_pointer_type)
2946c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
2947c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        else
2948c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
294947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
2950427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2951427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2952427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2953e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP
2954c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error)
2955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
2956e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_addr_of_valobj_sp)
2957e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_addr_of_valobj_sp;
2958e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2959b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType address_type = eAddressTypeInvalid;
2960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const bool scalar_is_load_address = false;
2961427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address);
2962c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    error.Clear();
2963427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (addr != LLDB_INVALID_ADDRESS)
2964427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2965427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        switch (address_type)
2966427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
2967c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        default:
2968427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeInvalid:
2969c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2970c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                StreamString expr_path_strm;
2971b01000fd063629facd45044f137446fb748ee179Greg Clayton                GetExpressionPath(expr_path_strm, true);
2972c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
2973c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
2974427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
2975c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2976427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeFile:
2977427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeLoad:
2978427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeHost:
2979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
2980427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang::ASTContext *ast = GetClangAST();
2981427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang_type_t clang_type = GetClangType();
2982427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (ast && clang_type)
2983427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                {
2984427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    std::string name (1, '&');
2985427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    name.append (m_name.AsCString(""));
298647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                    m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(),
298747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ast,
298847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ClangASTContext::CreatePointerType (ast, clang_type),
298947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ConstString (name.c_str()),
299047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          addr,
299147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          eAddressTypeInvalid,
299247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          m_data.GetAddressByteSize());
2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                }
2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
2997427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2998e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_addr_of_valobj_sp;
2999427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
3000427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
30010039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30020039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
30030039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type)
30040039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
30050039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
30060039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
30070039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
30080039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
30090039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30100039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
30110039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
30120039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
30130039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30140039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
30150039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
30160039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
30170039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               clang_ast_type);
30180039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
30190039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
30200039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
30210039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30220039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
30230039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp)
30240039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
30250039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
30260039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
30270039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
30280039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
30290039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30300039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
30310039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
30320039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
30330039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30340039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
30350039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
30360039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
30370039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               type_sp);
30380039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
30390039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
30400039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
30410039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
3042fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () :
3043dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread_id (LLDB_INVALID_UID),
3044dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
3045fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3046fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3047fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3048fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
3049fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update (true),
3050dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update (true),
305191635093b0282d888fcde84a276ae518643c7fcaJim Ingham    m_thread_id (LLDB_INVALID_THREAD_ID),
3052dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
3053dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson
3054fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3055fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext exe_ctx;
3056fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *computed_exe_scope = exe_scope;  // If use_selected is true, we may find a better scope,
3057fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                            // and if so we want to cache that not the original.
3058fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
3059fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
3060fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_ctx.target != NULL)
3061fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3062fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_target_sp = exe_ctx.target->GetSP();
3063fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3064fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_ctx.process == NULL)
3065fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.target->GetProcessSP();
3066fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3067fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.process->GetSP();
3068fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3069fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_process_sp != NULL)
3070fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3071fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stop_id = m_process_sp->GetStopID();
3072fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = NULL;
3073fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3074fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (exe_ctx.thread == NULL)
3075fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3076fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (use_selected)
3077fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3078fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    thread = m_process_sp->GetThreadList().GetSelectedThread().get();
3079fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (thread)
3080fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        computed_exe_scope = thread;
3081fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3082fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3083fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
3084fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                thread = exe_ctx.thread;
3085fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3086fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
3087fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3088fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = thread->GetIndexID();
3089fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (exe_ctx.frame == NULL)
3090fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3091fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (use_selected)
3092fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
3093fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get();
3094fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (frame)
3095fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
3096fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_stack_id = frame->GetStackID();
3097fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            computed_exe_scope = frame;
3098fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        }
3099fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
3100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id = exe_ctx.frame->GetStackID();
3103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = computed_exe_scope;
3107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
3110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope (rhs.m_exe_scope),
3111dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_needs_update(true),
3112dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update(true),
3113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_target_sp (rhs.m_target_sp),
3114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_process_sp (rhs.m_process_sp),
3115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_thread_id (rhs.m_thread_id),
3116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stack_id (rhs.m_stack_id),
3117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stop_id (0)
3118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint ()
3122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope *
3126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope ()
3127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // We have to update before giving out the scope, or we could be handing out stale pointers.
3129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    SyncWithProcessState();
3130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3131fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_exe_scope;
3132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state.  If the current
3135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return
3136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change".  If the current state is different, we update our state, and return
3137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
3138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true.
3139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3140fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState()
3142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we're already invalid, we don't need to do anything, and nothing has changed:
3144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_stop_id == LLDB_INVALID_UID)
3145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Can't update with an invalid state.
3147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = false;
3148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we don't have a process nothing can change.
3152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_process_sp)
3153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If our stop id is the current stop ID, nothing has changed:
3156e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    uint32_t cur_stop_id = m_process_sp->GetStopID();
3157e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_stop_id == cur_stop_id)
3158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3160e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
3161e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // In either case, we aren't going to be able to sync with the process state.
3162e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (cur_stop_id == 0)
3163e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return false;
3164e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
3165e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_stop_id = cur_stop_id;
3166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update = true;
3167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = m_process_sp.get();
3168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // Something has changed, so we will return true.  Now make sure the thread & frame still exist, and if either
3170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // doesn't, mark ourselves as invalid.
3171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_thread_id != LLDB_INVALID_THREAD_ID)
3173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get();
3175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (our_thread == NULL)
3176bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        {
317791635093b0282d888fcde84a276ae518643c7fcaJim Ingham            SetInvalid();
3178bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        }
3179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_exe_scope = our_thread;
3182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_stack_id.IsValid())
3184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get();
3186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (our_frame == NULL)
3187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    SetInvalid();
3188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_exe_scope = our_frame;
3190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return true;
3194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3196ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
3197ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated ()
3198ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
3199ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_first_update = false;
3200ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_needs_update = false;
3201ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (m_process_sp)
3202ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_stop_id = m_process_sp->GetStopID();
3203ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
3204ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3205ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope)
3208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!IsValid())
3210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3211fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool needs_update = false;
3213fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = NULL;
3214fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3215fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // The target has to be non-null, and the
3216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    Target *target = exe_scope->CalculateTarget();
3217fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (target != NULL)
3218fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3219fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Target *old_target = m_target_sp.get();
3220fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        assert (target == old_target);
3221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Process *process = exe_scope->CalculateProcess();
3222fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (process != NULL)
3223fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3224fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // FOR NOW - assume you can't update variable objects across process boundaries.
3225fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Process *old_process = m_process_sp.get();
3226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            assert (process == old_process);
3227fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3228fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            lldb::user_id_t stop_id = process->GetStopID();
3229fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (stop_id != m_stop_id)
3230fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3231fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
3232fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stop_id = stop_id;
3233fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3234fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // See if we're switching the thread or stack context.  If no thread is given, this is
3235fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // being evaluated in a global context.
3236fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = exe_scope->CalculateThread();
3237fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
3238fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3239fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                lldb::user_id_t new_thread_index = thread->GetIndexID();
3240fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_thread_index != m_thread_id)
3241fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3242fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3243fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = new_thread_index;
3244fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3245fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3246fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3247fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *new_frame = exe_scope->CalculateStackFrame();
3248fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_frame != NULL)
3249fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (new_frame->GetStackID() != m_stack_id)
3251fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
3252fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        needs_update = true;
3253fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        m_stack_id = new_frame->GetStackID();
3254fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
3255fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3257fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3258fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3259fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3260fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3261fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3262fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
3263fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3264fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // If this had been given a thread, and now there is none, we should update.
3265fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // Otherwise we don't have to do anything.
3266fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (m_thread_id != LLDB_INVALID_UID)
3267fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3268fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = LLDB_INVALID_UID;
3269fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3270fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3271fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3272fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3273fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3274fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3276fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // If there is no process, then we don't need to update anything.
3277fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // But if we're switching from having a process to not, we should try to update.
3278fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_process_sp.get() != NULL)
3279fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
3281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_process_sp.reset();
3282fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = LLDB_INVALID_UID;
3283fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stack_id.Clear();
3284fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3285fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3286fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3287fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    else
3288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3289fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // If there's no target, nothing can change so we don't need to update anything.
3290fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // But if we're switching from having a target to not, we should try to update.
3291fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_target_sp.get() != NULL)
3292fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3293fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            needs_update = true;
3294fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_target_sp.reset();
3295fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp.reset();
3296fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_thread_id = LLDB_INVALID_UID;
3297fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stack_id.Clear();
3298fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3299fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3300fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_needs_update)
3301fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = needs_update;
3302fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3303fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return needs_update;
3304fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3305f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
3306f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid
3307f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico GranataValueObject::ClearUserVisibleData()
3308f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{
3309f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_location_str.clear();
3310f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_value_str.clear();
3311f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_summary_str.clear();
3312f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_object_desc_str.clear();
33132bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen}
3314