ValueObject.cpp revision 441f08ca9d17fad237b93a71aeab9dad74ea1258
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{
3340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ExecutionContext exe_ctx;
335fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
336fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
337fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
3380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ());
3390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return scalar.IsValid();
3400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
3410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
3420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool
34317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_is_valid;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid = b;
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
356fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange ()
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
358fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    GetValueAsCString ();
35917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_did_change;
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed)
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change = value_changed;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
372917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
373917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
374afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateValueIfNeeded(false);
375917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (idx < GetNumChildren())
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
377917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        // Check if we have already made the child value object?
378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (can_create && m_children[idx] == NULL)
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // No we haven't created the child at this index, so lets have our
381917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // subclass do it and cache the result for quick future access.
382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            m_children[idx] = CreateChildAtIndex (idx, false, 0);
383e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
384917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_children[idx] != NULL)
386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            return m_children[idx]->GetSP();
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name)
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
396462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                     GetClangType(),
397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name.GetCString(),
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes);
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4045d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // when getting a child by name, it could be buried inside some base
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // classes (which really aren't part of the expression path), so we
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // need a vector of indexes that can get us down to the correct child
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
409917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
410917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
411afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateValueIfNeeded(false);
412917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
413917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::vector<uint32_t> child_indexes;
414917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
415917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    void *clang_type = GetClangType();
416917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
417917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
418917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      clang_type,
419917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      name.GetCString(),
420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      omit_empty_base_classes,
421917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      child_indexes);
422917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (num_child_indexes > 0)
423e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
424917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
425917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
426e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        child_sp = GetChildAtIndex(*pos, can_create);
428917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        for (++pos; pos != end; ++pos)
429917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
430917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            if (child_sp)
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp = new_child_sp;
434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            else
436917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp.reset();
438e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren ()
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    if (!m_children_count_valid)
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetNumChildren (CalculateNumChildren());
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_children.size();
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children)
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid = true;
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_children.resize(num_children);
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name)
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = name;
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46847da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject *
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
471bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham    ValueObject *valobj = NULL;
472e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
473917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
47424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    bool ignore_array_bounds = synthetic_array_member;
475917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::string child_name_str;
476917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_byte_size = 0;
477917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    int32_t child_byte_offset = 0;
478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_size = 0;
479917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_offset = 0;
480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_base_class = false;
481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_deref_of_parent = false;
482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const bool transparent_pointers = synthetic_array_member == false;
484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
485917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t clang_type = GetClangType();
486917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t child_clang_type;
487917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
488917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    ExecutionContext exe_ctx;
489917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
490917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
491917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
492917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_ast,
493917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  GetName().GetCString(),
494917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_type,
495917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  idx,
496917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  transparent_pointers,
497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  omit_empty_base_classes,
49824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                  ignore_array_bounds,
499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_name_str,
500917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_size,
501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_offset,
502917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_size,
503917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_offset,
504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_base_class,
505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_deref_of_parent);
506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (child_clang_type && child_byte_size)
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (synthetic_index)
509917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_byte_offset += child_byte_size * synthetic_index;
510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        ConstString child_name;
512917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (!child_name_str.empty())
513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_name.SetCString (child_name_str.c_str());
514917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
515917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        valobj = new ValueObjectChild (*this,
516917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       clang_ast,
517917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_clang_type,
518917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_name,
519917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_size,
520917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_offset,
521917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_size,
522917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_offset,
523917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_base_class,
524917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_deref_of_parent);
525917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_pointers_point_to_load_addrs)
526917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs);
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
528e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
52947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return valobj;
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
533fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString ()
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5357dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    if (UpdateValueIfNeeded (true))
5361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_summary_str.empty())
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
539f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            SummaryFormat *summary_format = GetSummaryFormat().get();
5401a102087f54079c25c8827afac6153a44ca535daEnrico Granata
5411a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (summary_format)
5421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            {
543f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                m_summary_str = summary_format->FormatObject(GetSP());
5441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            }
545f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            else
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
547f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                clang_type_t clang_type = GetClangType();
548f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
54990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                // Do some default printout for function pointers
550f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                if (clang_type)
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
552f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    StreamString sstr;
553f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    clang_type_t elem_or_pointee_clang_type;
554f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
555f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          GetClangAST(),
556f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          &elem_or_pointee_clang_type));
557f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
558f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    ExecutionContextScope *exe_scope = GetExecutionContextScope();
559f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    if (exe_scope)
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
56190d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                        if (ClangASTContext::IsFunctionPointerType (clang_type))
562fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
563f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            AddressType func_ptr_address_type = eAddressTypeInvalid;
564f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true);
565fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
566f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
567f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
568f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                switch (func_ptr_address_type)
56903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
570f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeInvalid:
571f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeFile:
572f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
573f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
574f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeLoad:
57503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    {
576f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Address so_addr;
577f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Target *target = exe_scope->CalculateTarget();
578f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        if (target && target->GetSectionLoadList().IsEmpty() == false)
579fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        {
580f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
581f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            {
582f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                so_addr.Dump (&sstr,
583f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              exe_scope,
584f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleResolvedDescription,
585f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleSectionNameOffset);
586f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            }
587fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        }
58803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    }
589f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
591f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeHost:
592f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
593f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
594f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            }
595f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (sstr.GetSize() > 0)
596f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
597f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.assign (1, '(');
598f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (sstr.GetData(), sstr.GetSize());
599f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (1, ')');
600fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            }
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_summary_str.empty())
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_summary_str.c_str();
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6121a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool
6131a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer)
6141a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6151a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6161a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(),
6171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6191a102087f54079c25c8827afac6153a44ca535daEnrico Granata    bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6201a102087f54079c25c8827afac6153a44ca535daEnrico Granata            ClangASTContext::IsCharType (elem_or_pointee_clang_type));
6211a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!is_char_arr_ptr)
6221a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return false;
6231a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!check_pointer)
6241a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6251a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.Test(ClangASTContext::eTypeIsArray))
6261a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6271a102087f54079c25c8827afac6153a44ca535daEnrico Granata    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6281a102087f54079c25c8827afac6153a44ca535daEnrico Granata    AddressType cstr_address_type = eAddressTypeInvalid;
6291a102087f54079c25c8827afac6153a44ca535daEnrico Granata    cstr_address = GetAddressOf (cstr_address_type, true);
6301a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return (cstr_address != LLDB_INVALID_ADDRESS);
6311a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
6321a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6331a102087f54079c25c8827afac6153a44ca535daEnrico Granatavoid
6341a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ReadPointedString(Stream& s,
6351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                               Error& error,
63686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               uint32_t max_length,
63786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               bool honor_array,
63886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               lldb::Format item_format)
6391a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6401a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6411a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (max_length == 0)
64286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        max_length = 128;   // FIXME this should be a setting, or a formatting parameter
6431a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6441a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t clang_type = GetClangType();
6451a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6461a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
6471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6491a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6501a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ClangASTContext::IsCharType (elem_or_pointee_clang_type))
6511a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
6521a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ExecutionContextScope *exe_scope = GetExecutionContextScope();
6531a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (exe_scope)
6541a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
6551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Target *target = exe_scope->CalculateTarget();
656979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                if (target == NULL)
657979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                {
658979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    s << "<no target to read from>";
659979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                }
660979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                else
6611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
6621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    AddressType cstr_address_type = eAddressTypeInvalid;
6641a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    size_t cstr_len = 0;
6661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    bool capped_data = false;
6671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (type_flags.Test (ClangASTContext::eTypeIsArray))
6681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have an array
6701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_len = ClangASTContext::GetArraySize (clang_type);
67186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > max_length)
6721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
67386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            capped_data = true;
67486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
6751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
6761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetAddressOf (cstr_address_type, true);
6771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
6781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
6791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have a pointer
6811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetPointerValue (cstr_address_type, true);
6821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
683979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    if (cstr_address == LLDB_INVALID_ADDRESS)
684979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    {
685979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                        s << "<invalid address for data>";
686979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    }
687979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    else
6881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Address cstr_so_addr (NULL, cstr_address);
6901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        DataExtractor data;
6911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        size_t bytes_read = 0;
6921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        std::vector<char> data_buffer;
6931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        bool prefer_file_cache = false;
69486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > 0 && honor_array)
6951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
6961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize(cstr_len);
6971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder());
6981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            bytes_read = target->ReadMemory (cstr_so_addr,
6991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             prefer_file_cache,
7001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             &data_buffer.front(),
7011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             cstr_len,
7021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             error);
7031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (bytes_read > 0)
7041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
7051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
7061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
7071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
70886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
7091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
7101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           bytes_read,        // How many bytes to print?
7111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
7121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
7131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
7141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
7151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (capped_data)
7161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    s << "...";
7171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
7181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
719979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            else
720979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                s << "\"<data not available>\"";
7211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
7221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
7231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
72486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
72586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            const size_t k_max_buf_size = 64;
7261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize (k_max_buf_size + 1);
7271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            // NULL terminate in case we don't get the entire C string
7281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.back() = '\0';
7291a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7311a102087f54079c25c8827afac6153a44ca535daEnrico Granata
732979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            bool any_data = false;
733979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
7341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder());
7351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            while ((bytes_read = target->ReadMemory (cstr_so_addr,
7361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     prefer_file_cache,
7371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     &data_buffer.front(),
7381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     k_max_buf_size,
7391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     error)) > 0)
7401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
741979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                any_data = true;
7421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                size_t len = strlen(&data_buffer.front());
7431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len == 0)
7441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
7451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len > bytes_read)
7461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    len = bytes_read;
74786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len > cstr_len)
74886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    len = cstr_len;
7491a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
7511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
75286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
7531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
7541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           len,               // How many bytes to print?
7551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
7561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
7571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
7581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
7591a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len < k_max_buf_size)
7611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
76286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len >= cstr_len)
76386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                {
76486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    s << "...";
76586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    break;
76686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                }
76786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                cstr_len -= len;
7681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                cstr_so_addr.Slide (k_max_buf_size);
7691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
770979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
771979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            if (any_data == false)
772979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                s << "<data not available>";
773979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
7741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
7761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
7771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
7781a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
7791a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7801a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
7811a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
7821a102087f54079c25c8827afac6153a44ca535daEnrico Granata        error.SetErrorString("impossible to read a string from this object");
783979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        s << "<not a string object>";
7841a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7851a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
7861a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7874ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char *
788fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription ()
7894ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{
790886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
7917dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    if (!UpdateValueIfNeeded (true))
7924ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
793886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
794886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (!m_object_desc_str.empty())
795886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        return m_object_desc_str.c_str();
796886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
797fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
798fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope == NULL)
799fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return NULL;
800fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
8014ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    Process *process = exe_scope->CalculateProcess();
802b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (process == NULL)
8034ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
804b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
805b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    StreamString s;
8064ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
807b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    lldb::LanguageType language = GetObjectRuntimeLanguage();
808b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
8094ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
8100e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    if (runtime == NULL)
8110e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    {
81270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham        // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway...
8130e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        clang_type_t opaque_qual_type = GetClangType();
8140e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        if (opaque_qual_type != NULL)
8150e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        {
81670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            bool is_signed;
81770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed)
81870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham                || ClangASTContext::IsPointerType (opaque_qual_type))
81970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            {
8200e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham                runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
82170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            }
8220e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        }
8230e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    }
8240e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham
8250de37195f17fefb536157b3296a18999116b8125Jim Ingham    if (runtime && runtime->GetObjectDescription(s, *this))
8264ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    {
8274ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        m_object_desc_str.append (s.GetData());
8284ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    }
829e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan
830e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    if (m_object_desc_str.empty())
831e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return NULL;
832e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    else
833e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return m_object_desc_str.c_str();
8344ae519666628cca07c194bf677163009cc2e5a8bJim Ingham}
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
837fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString ()
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If our byte size is zero this is an aggregate type that has children
840462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
842afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        if (UpdateValueIfNeeded(true))
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_value_str.empty())
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Value::ContextType context_type = m_value.GetContextType();
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (context_type)
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
8506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeClangType:
8516916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeLLDBType:
8526916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeVariable:
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
854f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        clang_type_t clang_type = GetClangType ();
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (clang_type)
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
857afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            if (m_format == lldb::eFormatDefault && m_last_value_format)
8581391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            {
859f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_value_str = m_last_value_format->FormatObject(GetSP());
8601391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            }
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
86282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            {
863f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                StreamString sstr;
864f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                Format format = GetFormat();
865f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (format == eFormatDefault)
866f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        format = (m_is_bitfield_for_scalar ? eFormatUnsigned :
867f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        ClangASTType::GetFormat(clang_type));
868f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
869f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (ClangASTType::DumpTypeValue (GetClangAST(),            // The clang AST
870f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 clang_type,               // The clang type to display
871f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 &sstr,
872f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 format,                   // Format to display this type with
873f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 m_data,                   // Data to extract from
874f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 0,                        // Byte offset into "m_data"
875f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetByteSize(),            // Byte size of item in "m_data"
876f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitSize(),     // Bitfield bit size
877f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitOffset()))  // Bitfield bit offset
878f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.swap(sstr.GetString());
879f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                else
880f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                {
881f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)",
882f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      m_data.GetByteSize(),
883f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      GetByteSize());
884f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.clear();
885f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
88682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            }
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8916916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeRegisterInfo:
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info)
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString reg_sstr;
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_data.Dump(&reg_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_str.swap(reg_sstr.GetString());
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
90254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
90354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                default:
90454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    break;
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
90717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
90817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            if (!m_value_did_change && m_old_value_valid)
90917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            {
91017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // The value was gotten successfully, so we consider the
91117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // value as changed if the value string differs
91217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                SetValueDidChange (m_old_value_str != m_value_str);
91317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            }
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_value_str.empty())
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_str.c_str();
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
921afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used
922afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers
923afb7c85df796f74262917e44dd68f668dade3911Enrico Granataunsigned long long
924afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::GetValueAsUnsigned()
925afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{
926afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    // If our byte size is zero this is an aggregate type that has children
927afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
928afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    {
929afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        if (UpdateValueIfNeeded(true))
930afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        {
931afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            uint32_t offset = 0;
932afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            return m_data.GetMaxU64(&offset,
933afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                    m_data.GetByteSize());
934afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        }
935afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    }
936afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return 0;
937afb7c85df796f74262917e44dd68f668dade3911Enrico Granata}
938afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
939de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// this call should only return pointers to data that needs no special memory management
940de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// (either because they are hardcoded strings, or because they are backed by some other
941de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// object); returning any new()-ed or malloc()-ed data here, will lead to leaks!
942886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granataconst char *
943886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::GetPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display,
944886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                        lldb::Format custom_format)
945886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{
94686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
94786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    RefCounter ref(&m_dump_printable_counter);
94886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
94990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != lldb::eFormatInvalid)
950886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        SetFormat(custom_format);
951886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
952886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    const char * return_value;
953886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
954886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    switch(val_obj_display)
955886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    {
956886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayValue:
957886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetValueAsCString();
958886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
959886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplaySummary:
960886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetSummaryAsCString();
961886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
962886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayLanguageSpecific:
963886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetObjectDescription();
964886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
965f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        case eDisplayLocation:
966f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            return_value = GetLocationAsCString();
967f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            break;
968886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    }
969886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
97086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // this code snippet might lead to endless recursion, thus we use a RefCounter here to
97186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // check that we are not looping endlessly
97286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (!return_value && (m_dump_printable_counter < 3))
9739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
9749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // try to pick the other choice
9759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (val_obj_display == eDisplayValue)
9769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return_value = GetSummaryAsCString();
9779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else if (val_obj_display == eDisplaySummary)
978de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        {
979de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (ClangASTContext::IsAggregateType (GetClangType()) == true)
980de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            {
981de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                // this thing has no value
982de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                return_value = "<no summary defined for this datatype>";
983de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            }
984de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else
985de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                return_value = GetValueAsCString();
986de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        }
9879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
988886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
989de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    return (return_value ? return_value : "<no printable representation>");
9909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
9919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
992886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
9939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
9949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s,
9959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         ValueObjectRepresentationStyle val_obj_display,
9969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         lldb::Format custom_format)
9979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
99886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
99986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    clang_type_t elem_or_pointee_type;
100086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type));
10011a102087f54079c25c8827afac6153a44ca535daEnrico Granata
100286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer)
100386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata         && val_obj_display == ValueObject::eDisplayValue)
10041a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
100586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // when being asked to get a printable display an array or pointer type directly,
100686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // try to "do the right thing"
100786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
100886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (IsCStringContainer(true) &&
100986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCString ||
101086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatCharArray ||
101186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatChar ||
101286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatVectorOfChar)) // print char[] & char* directly
101386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
101486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            Error error;
101586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            ReadPointedString(s,
101686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              error,
101786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              0,
101886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatVectorOfChar) ||
101986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatCharArray));
102086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return !error.Fail();
102186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
102286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
102386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (custom_format == lldb::eFormatEnum)
102486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
102586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
102686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // this only works for arrays, because I have no way to know when
102786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // the pointed memory ends, and no special \0 end of data marker
102886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (flags.Test(ClangASTContext::eTypeIsArray))
102986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
103086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatBytes) ||
103186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatBytesWithASCII))
103286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
103386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
103486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
103586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
103686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
103786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
103886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
103986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
104086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
104186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
104286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
104386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
104486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
1045de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
104686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
104786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
104886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, custom_format);
104986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
105086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
105186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
105286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
105386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
105486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
105586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
105686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatVectorOfChar) ||
105786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat32) ||
105886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat64) ||
105986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt16) ||
106086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt32) ||
106186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt64) ||
106286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt8) ||
106386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt128) ||
106486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt16) ||
106586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt32) ||
106686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt64) ||
106786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly
106886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
106986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
107086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
107186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                lldb::Format format = FormatManager::GetSingleItemFormat(custom_format);
107286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
107386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
107486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
107586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
107686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
107786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
107886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
107986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
108086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
108186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
108286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
1083de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
108486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
108586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
108686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, format);
108786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
108886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
108986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
109086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
109186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
109286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
109386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
109486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
109586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if ((custom_format == lldb::eFormatBoolean) ||
109686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatBinary) ||
109786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatChar) ||
109886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCharPrintable) ||
109986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexFloat) ||
110086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDecimal) ||
110186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatHex) ||
110286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatFloat) ||
110386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOctal) ||
110486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOSType) ||
110586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode16) ||
110686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode32) ||
110786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnsigned) ||
110886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatPointer) ||
110986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexInteger) ||
111086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplex) ||
111186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDefault)) // use the [] operator
111286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
11131a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
111486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    const char *targetvalue = GetPrintableRepresentation(val_obj_display, custom_format);
111590d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (targetvalue)
111686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        s.PutCString(targetvalue);
111786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    bool var_success = (targetvalue != NULL);
111890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != eFormatInvalid)
111986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        SetFormat(eFormatDefault);
112086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    return var_success;
1121886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata}
1122886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
112303e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t
1124b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address)
1125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
1126afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
1127e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return LLDB_INVALID_ADDRESS;
1128e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
1130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
1131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeScalar:
1132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (scalar_is_load_address)
1133f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = eAddressTypeLoad;
1135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1137f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeLoadAddress:
1140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeFileAddress:
1141f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeHostAddress:
1142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = m_value.GetValueAddressType ();
1144f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
1148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    address_type = eAddressTypeInvalid;
1149f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return LLDB_INVALID_ADDRESS;
1150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
1151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t
1153b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address)
115403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
115503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    lldb::addr_t address = LLDB_INVALID_ADDRESS;
115603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    address_type = eAddressTypeInvalid;
1157e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1158afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
1159e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return address;
1160e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
116203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
116303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeScalar:
116403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (scalar_is_load_address)
116503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
116603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
116703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = eAddressTypeLoad;
116803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
116903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
117003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
117103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeLoadAddress:
117203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeFileAddress:
117303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeHostAddress:
117403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
117503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            uint32_t data_offset = 0;
117603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_data.GetPointer(&data_offset);
117703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = m_value.GetValueAddressType();
117803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (address_type == eAddressTypeInvalid)
117903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                address_type = eAddressTypeLoad;
118003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
118103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
118203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
1183427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1184427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (m_pointers_point_to_load_addrs)
1185427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        address_type = eAddressTypeLoad;
1186427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
118703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return address;
118803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
118903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str)
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our value is up to date first so that our location and location
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type is valid.
1195afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
1199462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *end = NULL;
1202bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    const size_t byte_size = GetByteSize();
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(unsigned long long))
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            unsigned long long ull_val = strtoull(value_str, &end, 0);
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
1218801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = ull_val;
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(long long))
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            long long sll_val = strtoll(value_str, &end, 0);
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
1234801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = sll_val;
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const off_t byte_offset = GetByteOffset();
124354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size));
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst != NULL)
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We are decoding a float into host byte order below, so make
124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // sure m_data knows what it contains.
1248cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                m_data.SetByteOrder(lldb::endian::InlHostByteOrder());
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue (
125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        GetClangAST(),
1251462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                        GetClangType(),
125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        value_str,
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        dst,
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        byte_size);
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (converted_byte_size == byte_size)
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we have made it here the value is in m_data and we should write it
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out to the target
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write ();
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write ()
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the update ID so the next time we try and read the value
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we try and read it again.
1280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_update_point.SetNeedsUpdate();
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: when Value has a method to write a value back, call it from here.
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1287b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType
1288b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage ()
1289b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
1290afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return ClangASTType::GetMinimumLanguage (GetClangAST(),
1291afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                             GetClangType());
1292b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
1293b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
129547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj)
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
129747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_synthetic_children[key] = valobj;
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
130447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key);
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_synthetic_children.end())
130647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        synthetic_child_sp = pos->second->GetSP();
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType ()
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1313462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerType (GetClangType());
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131670c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool
131724b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType ()
131824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
131924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return ClangASTContext::IsArrayType (GetClangType());
132024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
132124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
132224b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool
13239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType ()
13249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
13259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return ClangASTContext::IsScalarType (GetClangType());
13269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
13279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
13289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
132970c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed)
133070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{
133170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham    return ClangASTContext::IsIntegerType (GetClangType(), is_signed);
133270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham}
1333f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType ()
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
133782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPointerOrReferenceType (GetClangType());
133882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
133982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
134082f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
134182f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType ()
134282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
134382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType());
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1346917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
1347917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType ()
1348917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
1349917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType());
1350917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
1351917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsPointerType ())
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char index_str[64];
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(index_str, sizeof(index_str), "[%i]", index);
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString index_const_str(index_str);
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already created a synthetic array member in this
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // valid object. If we have we will re-use it.
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = GetSyntheticChild (index_const_str);
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!synthetic_child_sp)
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
136647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            ValueObject *synthetic_child;
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We haven't made a synthetic array member for INDEX yet, so
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // lets make one and cache it for any future reference.
136947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            synthetic_child = CreateChildAtIndex(0, true, index);
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Cache the value if we got one back...
137247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            if (synthetic_child)
137347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            {
137447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                AddSyntheticChild(index_const_str, synthetic_child);
137547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                synthetic_child_sp = synthetic_child->GetSP();
1376979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
1377886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                synthetic_child_sp->m_is_array_item_for_pointer = true;
137847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            }
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1383642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
138424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index
138524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array.
138624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as:
138724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection
138824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// {
138924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     uint32_t item_count;
139024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     Item item_array[0];
139124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// };
139224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice
139324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array".
139424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
139524b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP
139624b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create)
139724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
139824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    ValueObjectSP synthetic_child_sp;
139924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    if (IsArrayType ())
140024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    {
140124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        char index_str[64];
140224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        snprintf(index_str, sizeof(index_str), "[%i]", index);
140324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        ConstString index_const_str(index_str);
140424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // Check if we have already created a synthetic array member in this
140524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // valid object. If we have we will re-use it.
140624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        synthetic_child_sp = GetSyntheticChild (index_const_str);
140724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        if (!synthetic_child_sp)
140824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        {
140924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            ValueObject *synthetic_child;
141024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // We haven't made a synthetic array member for INDEX yet, so
141124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // lets make one and cache it for any future reference.
141224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            synthetic_child = CreateChildAtIndex(0, true, index);
141324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
141424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // Cache the value if we got one back...
141524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            if (synthetic_child)
141624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            {
141724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                AddSyntheticChild(index_const_str, synthetic_child);
141824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp = synthetic_child->GetSP();
1419979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
142024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp->m_is_array_item_for_pointer = true;
142124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            }
142224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        }
142324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    }
142424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return synthetic_child_sp;
142524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
142624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
14279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP
14289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create)
14299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
14309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    ValueObjectSP synthetic_child_sp;
14319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (IsScalarType ())
14329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
14339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        char index_str[64];
14349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
14359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        ConstString index_const_str(index_str);
14369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // Check if we have already created a synthetic array member in this
14379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // valid object. If we have we will re-use it.
14389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        synthetic_child_sp = GetSyntheticChild (index_const_str);
14399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (!synthetic_child_sp)
14409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
14419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            ValueObjectChild *synthetic_child;
14429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // We haven't made a synthetic array member for INDEX yet, so
14439762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // lets make one and cache it for any future reference.
14449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            synthetic_child = new ValueObjectChild(*this,
14459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangAST(),
14469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangType(),
14479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      index_const_str,
14489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetByteSize(),
14499762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      0,
14509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      to-from+1,
14519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      from,
14529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false,
14539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false);
14549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
14559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // Cache the value if we got one back...
14569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            if (synthetic_child)
14579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            {
14589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                AddSyntheticChild(index_const_str, synthetic_child);
14599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp = synthetic_child->GetSP();
1460979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
14619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp->m_is_bitfield_for_scalar = true;
14629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            }
14639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
14649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
14659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return synthetic_child_sp;
14669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
14679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
1468979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatalldb::ValueObjectSP
1469979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create)
1470979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
1471979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1472979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ValueObjectSP synthetic_child_sp;
1473979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1474979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    char name_str[64];
1475979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    snprintf(name_str, sizeof(name_str), "@%i", offset);
1476979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ConstString name_const_str(name_str);
1477979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1478979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    // Check if we have already created a synthetic array member in this
1479979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    // valid object. If we have we will re-use it.
1480979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    synthetic_child_sp = GetSyntheticChild (name_const_str);
1481979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1482979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (synthetic_child_sp.get())
1483979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return synthetic_child_sp;
1484979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1485979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (!can_create)
1486979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return lldb::ValueObjectSP();
1487979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1488979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
1489979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetASTContext(),
1490979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetOpaqueQualType(),
1491979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             name_const_str,
1492979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetTypeByteSize(),
1493979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             offset,
1494979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             0,
1495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             0,
1496979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             false,
1497979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             false);
1498979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (synthetic_child)
1499979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
1500979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        AddSyntheticChild(name_const_str, synthetic_child);
1501979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp = synthetic_child->GetSP();
1502979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp->SetName(name_const_str);
1503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp->m_is_child_at_offset = true;
1504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
1505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    return synthetic_child_sp;
1506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
1507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1508e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or ->
1509e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has
1510e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown
1511e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means
1512e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off
1513e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char*
1514e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression)
1515e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1516e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!expression || !expression[0])
1517e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression;
1518e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '.')
1519e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+1;
1520e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '-' && expression[1] == '>')
1521e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+2;
1522e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return expression;
1523e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1524e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1525e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatalldb::ValueObjectSP
1526e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create)
1527e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1528e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ValueObjectSP synthetic_child_sp;
1529e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ConstString name_const_string(expression);
1530e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // Check if we have already created a synthetic array member in this
1531e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // valid object. If we have we will re-use it.
1532e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    synthetic_child_sp = GetSyntheticChild (name_const_string);
1533e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!synthetic_child_sp)
1534e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    {
1535e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // We haven't made a synthetic array member for expression yet, so
1536e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // lets make one and cache it for any future reference.
1537e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        synthetic_child_sp = GetValueForExpressionPath(expression);
1538e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1539e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // Cache the value if we got one back...
1540e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        if (synthetic_child_sp.get())
1541e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        {
1542e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            AddSyntheticChild(name_const_string, synthetic_child_sp.get());
1543979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression)));
1544e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            synthetic_child_sp->m_is_expression_path_child = true;
1545e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        }
1546e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    }
1547e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return synthetic_child_sp;
1548e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1549e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1550e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid
1551e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::CalculateSyntheticValue (lldb::SyntheticValueType use_synthetic)
1552e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1553e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1554e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1555e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1556afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
1557e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1558e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1559e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1560e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
15619ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata    if (m_synthetic_value == NULL)
15629ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata        m_synthetic_value = new ValueObjectSynthetic(*this, m_last_synthetic_filter);
1563e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1565e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1566e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid
156710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic)
1568642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
156910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
157010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return;
157110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
157247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (!m_dynamic_value && !IsDynamic())
1573e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
1574979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        Process *process = m_update_point.GetProcessSP().get();
1575e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool worth_having_dynamic_value = false;
1576642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1577e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1578e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // FIXME: Process should have some kind of "map over Runtimes" so we don't have to
1579e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // hard code this everywhere.
1580e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        lldb::LanguageType known_type = GetObjectRuntimeLanguage();
1581e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC)
1582e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1583e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *runtime = process->GetLanguageRuntime (known_type);
1584e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (runtime)
1585e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this);
1586e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1587e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        else
1588e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1589e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus);
1590e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (cpp_runtime)
1591e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this);
1592e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1593e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (!worth_having_dynamic_value)
1594e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
1595e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC);
1596e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                if (objc_runtime)
159710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham                    worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this);
1598e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
1599e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1600e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1601e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (worth_having_dynamic_value)
160210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
160347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
160447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//        if (worth_having_dynamic_value)
160547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//            printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager);
1606e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1607e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
1608e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
1609e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
161047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
161110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic)
1612e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
161310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
161410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return ValueObjectSP();
161510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
161610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (!IsDynamic() && m_dynamic_value == NULL)
1617e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
161810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        CalculateDynamicValue(use_dynamic);
1619e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
162047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_dynamic_value)
162147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_dynamic_value->GetSP();
162247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    else
162347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
1624642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
162566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1626e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// GetDynamicValue() returns a NULL SharedPointer if the object is not dynamic
1627e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// or we do not really want a dynamic VO. this method instead returns this object
1628e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// itself when making it synthetic has no meaning. this makes it much simpler
1629e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to replace the SyntheticValue for the ValueObject
1630e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP
1631e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticValue (SyntheticValueType use_synthetic)
1632e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1633e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1634e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1635e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1636afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
1637e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1638e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1639e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1640e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1641e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    CalculateSyntheticValue(use_synthetic);
1642e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1643e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_synthetic_value)
1644e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return m_synthetic_value->GetSP();
1645e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    else
1646e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1647e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1648e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
164900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool
165000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s)
165100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
165200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (IsBaseClass())
165300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1654e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
165500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        clang_type_t clang_type = GetClangType();
165600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        std::string cxx_class_name;
165700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name);
165800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (this_had_base_class)
165900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        {
166000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (parent_had_base_class)
166100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString("::");
166200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            s.PutCString(cxx_class_name.c_str());
166300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        }
166400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        return parent_had_base_class || this_had_base_class;
166500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
166600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return false;
166700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
166800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
166900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
167000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject *
167100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent()
167200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
1673e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (GetParent())
167400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1675e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (GetParent()->IsBaseClass())
1676e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent()->GetNonBaseClassParent();
167700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        else
1678e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent();
167900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
168000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return NULL;
168100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
168266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
168366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid
16841391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
1685bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
168600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    const bool is_deref_of_parent = IsDereferenceOfParent ();
168700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
168890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
16891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
16901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
16911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // the eHonorPointers mode is meant to produce strings in this latter format
16921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s.PutCString("*(");
16931391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
169400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
16951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    ValueObject* parent = GetParent();
16961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
16971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (parent)
16981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
1699886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
1700886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // if we are a deref_of_parent just because we are synthetic array
1701886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // members made up to allow ptr[%d] syntax to work in variable
1702886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // printing, then add our name ([%d]) to the expression path
170390d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (m_is_array_item_for_pointer && epformat == eHonorPointers)
1704886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        s.PutCString(m_name.AsCString());
17051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
170600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (!IsBaseClass())
170700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
170800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (!is_deref_of_parent)
1709bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
171000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            ValueObject *non_base_class_parent = GetNonBaseClassParent();
171100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (non_base_class_parent)
1712bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
171300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType();
171400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (non_base_class_parent_clang_type)
171500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
171600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL);
171700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
171890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                    if (parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers)
171900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    {
172000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("->");
172100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
17221391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    else
17231391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    {
17241391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer)
17251391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
17261391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutCString("->");
17271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
17281391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) &&
17291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                 !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray))
17301391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
17311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutChar('.');
17321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
173300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
173400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
1735bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
173600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
173700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            const char *name = GetName().GetCString();
173800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (name)
1739bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
174000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (qualify_cxx_base_classes)
174100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
174200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    if (GetBaseClassPath (s))
174300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("::");
174400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
174500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString(name);
1746bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1747bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
1748bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1749bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
17501391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
175100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        s.PutChar(')');
17521391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
1753bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1754bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1755ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1756ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression,
1757ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const char** first_unparsed,
1758ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathScanEndReason* reason_to_stop,
1759ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathEndResultType* final_value_type,
1760ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const GetValueForExpressionPathOptions& options,
1761ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathAftermath* final_task_on_target)
1762ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1763ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1764ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    const char* dummy_first_unparsed;
1765ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
1766ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathEndResultType dummy_final_value_type;
1767ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
1768ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1769ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
1770ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
1771ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
1772ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
1773ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           options,
1774ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
1775ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1776ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
1777ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1778ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ret_val;
1779ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1780ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
1781ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1782ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eDereference)
1783ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1784ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1785ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->Dereference(error);
1786ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1787ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1788ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eDereferencingFailed;
1789ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1790ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1791ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1792ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1793ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1794ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1795ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1796ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1797ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1798ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eTakeAddress)
1799ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1800ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1801ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->AddressOf(error);
1802ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1803ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1804ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eTakingAddressFailed;
1805ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1806ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1807ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1808ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1809ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1810ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1811ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1812ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1813ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1814ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1815ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    return ret_val; // final_task_on_target will still have its original value, so you know I did not do it
1816ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
1817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
18181a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
18191a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression,
18201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
18211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
18221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
18231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_value_type,
18241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
18251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* final_task_on_target)
18261a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
18271a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const char* dummy_first_unparsed;
18281a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
18291a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathEndResultType dummy_final_value_type;
18301a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
18311a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18321a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
18331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
18341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
18351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
18361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           options,
18371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
18381a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18391a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!ret_val.get()) // if there are errors, I add nothing to the list
18401a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
18411a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18421a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (*reason_to_stop != eArrayRangeOperatorMet)
18431a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
18441a102087f54079c25c8827afac6153a44ca535daEnrico Granata        // I need not expand a range, just post-process the final value and return
18451a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
18461a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
18471a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(ret_val);
18481a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
18491a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
18501a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
18511a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
18521a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eDereference)
18531a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
18541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
18551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->Dereference(error);
18561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
18571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eDereferencingFailed;
18591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
18601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
18611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
18631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
18651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
18661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
18671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18681a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
18691a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eTakeAddress)
18701a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
18711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
18721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->AddressOf(error);
18731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
18741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eTakingAddressFailed;
18761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
18771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
18781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
18801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
18821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
18831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
18841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18851a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
18861a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
18871a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
18881a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
18891a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
18901a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed,
18911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          first_unparsed ? first_unparsed : &dummy_first_unparsed,
18921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          ret_val,
18931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          list,
18941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
18951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_value_type ? final_value_type : &dummy_final_value_type,
18961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          options,
18971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
18981a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
18991a102087f54079c25c8827afac6153a44ca535daEnrico Granata    // in any non-covered case, just do the obviously right thing
19001a102087f54079c25c8827afac6153a44ca535daEnrico Granata    list->Append(ret_val);
19011a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return 1;
19021a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
19031a102087f54079c25c8827afac6153a44ca535daEnrico Granata
1904ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1905ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
1906ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const char** first_unparsed,
1907ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathScanEndReason* reason_to_stop,
1908ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathEndResultType* final_result,
1909ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const GetValueForExpressionPathOptions& options,
1910ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathAftermath* what_next)
1911ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1912ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP root = GetSP();
1913ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1914ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!root.get())
1915ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ValueObjectSP();
1916ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1917ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    *first_unparsed = expression_cstr;
1918ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1919ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    while (true)
1920ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1921ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1922ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
1923ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1924ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
19251a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
19261a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
19271a102087f54079c25c8827afac6153a44ca535daEnrico Granata
19281a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
19291a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
19301a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
1931ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1932ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (!expression_cstr || *expression_cstr == '\0')
1933ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1934ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            *reason_to_stop = ValueObject::eEndOfString;
1935ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            return root;
1936ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1937ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1938ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        switch (*expression_cstr)
1939ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1940ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '-':
1941ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1942ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax &&
19431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error
1944ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1945ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1946ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eArrowInsteadOfDot;
1947ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1948ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1949ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
19501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) &&  // if yo are trying to extract an ObjC IVar when this is forbidden
19511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) &&
1952ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    options.m_no_fragile_ivar)
1953ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1954ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eFragileIVarNotAllowed;
1956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1958ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1959ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (expression_cstr[1] != '>')
1960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1961ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
1963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1964ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip the -
1967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '.': // or fallthrough from ->
1969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
19711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error
1972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eDotInsteadOfArrow;
1975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1978ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip .
1979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *next_separator = strpbrk(expression_cstr+1,"-.[");
1980ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                ConstString child_name;
1981ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!next_separator) // if no other separator just expand this last layer
1982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCString (expression_cstr);
1984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
1985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // we know we are done, so just return
1986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = '\0';
1988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEndOfString;
1989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
1990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
1991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
1993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
1995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
1996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
1997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
1998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // other layers do expand
2001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2002ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
2003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
2004ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // store the new root and move on
2005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = next_separator;
2007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
2008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        continue;
2009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2011ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
2014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2018ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '[':
2021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
20221a102087f54079c25c8827afac6153a44ca535daEnrico 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*
2023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
20241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
2025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorInvalid;
2028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2031ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
2032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2033ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2034ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
2035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2036ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2038ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2039ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
2040ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
20411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2042ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2043ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2044ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
2045ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2046ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2047ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2048ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else // even if something follows, we cannot expand unbounded ranges, just let the caller do it
2049ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2050ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr+2;
2051ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eUnboundedRange;
2053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2054ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
2057ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
2058ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
2059ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2060ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
2061ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
2062ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
2063ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2064ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2065ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
2066ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2067ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2068ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
2069ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2070ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2071ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2072ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2073ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2074ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2075ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2076ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
2077ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
20781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2079ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2080ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr+2;
2081ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2082ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eUnboundedRange;
2083ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2084ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2085ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2086ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2087ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2088ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
2089ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2090ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2091ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2092ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2093ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    // from here on we do have a valid index
20941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2095ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
209624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
209724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (!child_valobj_sp)
209824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true);
209924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (child_valobj_sp)
210024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        {
210124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            root = child_valobj_sp;
210224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *first_unparsed = end+1; // skip ]
210324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *final_result = ValueObject::ePlain;
210424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            continue;
210524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        }
210624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        else
2107ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2108ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2109ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2110ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2111ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2112ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2113ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
21141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
2115ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2116ff78238a2ebc66a683dded02c2f99fba85077d05Enrico 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
21171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2118ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2119ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            Error error;
2120ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            root = root->Dereference(error);
2121ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (error.Fail() || !root.get())
2122ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2123ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2124ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
2125ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2126ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2127ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2128ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2129ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2130ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *what_next = eNothing;
2131ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2132ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2133ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2134ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2135ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2136ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
2137ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (!root.get())
2138ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2139ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
2141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2142ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = end+1; // skip ]
2147ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::ePlain;
2148ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2149ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2150ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2151ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2152ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
2153ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2154ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
2155ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2156ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2157ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2158ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2159ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2160ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2161ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2162ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
2163ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2164ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2165ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2166ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2167ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2168ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2169ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2170ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2171ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // we have a low and a high index
2172ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2173ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2174ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
2175ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an error
2176ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2177ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2178ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2179ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2180ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2181ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2182ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
2183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2184ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2186ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2187ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2188ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2189ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2190ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (index_lower > index_higher) // swap indices if required
2191ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2192ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        unsigned long temp = index_lower;
2193ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_lower = index_higher;
2194ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_higher = temp;
2195ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
21961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
2197ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2198ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
2199ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2200ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2201ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2202ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2203ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2204ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2205ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2206ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2207ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2208ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2209ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2210ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2211ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2212ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2213ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
22141a102087f54079c25c8827afac6153a44ca535daEnrico 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
2215ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                             *what_next == ValueObject::eDereference &&
22161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2217ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2218ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        Error error;
2219ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->Dereference(error);
2220ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (error.Fail() || !root.get())
2221ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2222ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2223ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
2224ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2225ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2226ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2227ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2228ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2229ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *what_next = ValueObject::eNothing;
2230ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            continue;
2231ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2232ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2233ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2234ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2235ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2236ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2237ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eBoundedRange;
2238ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2239ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2240ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2241ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2242ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2243ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            default: // some non-separator is in the way
2244ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
2245ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *first_unparsed = expression_cstr;
2246ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
2247ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_result = ValueObject::eInvalid;
2248ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
2249ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2250ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2251ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
2252ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
2253ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
2254ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
22551a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
22561a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr,
22571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
22581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectSP root,
22591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
22601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
22611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_result,
22621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
22631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* what_next)
22641a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
22651a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!root.get())
22661a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
22671a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22681a102087f54079c25c8827afac6153a44ca535daEnrico Granata    *first_unparsed = expression_cstr;
22691a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22701a102087f54079c25c8827afac6153a44ca535daEnrico Granata    while (true)
22711a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
22721a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22731a102087f54079c25c8827afac6153a44ca535daEnrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
22741a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22751a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
22761a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
22771a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
22781a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22791a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
22801a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
22811a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
22821a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22831a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!expression_cstr || *expression_cstr == '\0')
22841a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
22851a102087f54079c25c8827afac6153a44ca535daEnrico Granata            *reason_to_stop = ValueObject::eEndOfString;
22861a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(root);
22871a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
22881a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
22891a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22901a102087f54079c25c8827afac6153a44ca535daEnrico Granata        switch (*expression_cstr)
22911a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
22921a102087f54079c25c8827afac6153a44ca535daEnrico Granata            case '[':
22931a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
22941a102087f54079c25c8827afac6153a44ca535daEnrico 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*
22951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
22961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
22971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
22981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
22991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorInvalid;
23001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
23041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
23071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
23121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
23141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
23171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else // expand this into list
23211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        int max_index = root->GetNumChildren() - 1;
23231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        for (int index = 0; index < max_index; index++)
23241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
23261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
23271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
23281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr+2;
23301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
23321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return max_index; // tell me number of items I added to the VOList
23331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
23361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
23371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
23381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *first_unparsed = expression_cstr;
23401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
23411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_result = ValueObject::eInvalid;
23421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
23431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
23451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
23471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
23481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
23491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
23521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
23561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
23581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            int max_index = root->GetNumChildren() - 1;
23601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            for (int index = 0; index < max_index; index++)
23611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
23621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                ValueObjectSP child =
23631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
23641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(child);
23651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
23661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr+2;
23671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
23691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return max_index; // tell me number of items I added to the VOList
23701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
23721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
23741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
23751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
23761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
23771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    // from here on we do have a valid index
23801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
23811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetChildAtIndex(index, true);
23831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
23841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
23861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
23871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
23881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
23891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
23911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
23931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
23941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
23961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
23971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
24001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24011a102087f54079c25c8827afac6153a44ca535daEnrico 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
24021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
24031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            Error error;
24051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->Dereference(error);
24061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (error.Fail() || !root.get())
24071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
24091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
24101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
24111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
24121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
24141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *what_next = eNothing;
24161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                continue;
24171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
24221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (!root.get())
24231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
24251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
24261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
24271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
24281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
24301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(root);
24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = end+1; // skip ]
24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eValueObjectList;
24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 1;
24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
24401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
24531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
24561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else // we have a low and a high index
24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
24611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
24631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an error
24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
24711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
24721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (index_lower > index_higher) // swap indices if required
24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        unsigned long temp = index_lower;
24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_lower = index_higher;
24821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_higher = temp;
24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
24881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
24911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
24971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
24981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
25001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
25011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25031a102087f54079c25c8827afac6153a44ca535daEnrico 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
25041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             *what_next == ValueObject::eDereference &&
25051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
25061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Error error;
25081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->Dereference(error);
25091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (error.Fail() || !root.get())
25101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
25131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *what_next = ValueObject::eNothing;
25191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            continue;
25201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
25231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25242bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen                        for (unsigned long index = index_lower;
25251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             index <= index_higher; index++)
25261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
25281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
25291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
25301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = end+1;
25321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
25331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
25341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return index_higher-index_lower+1; // tell me number of items I added to the VOList
25351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
25371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
25381a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
25391a102087f54079c25c8827afac6153a44ca535daEnrico Granata            default: // some non-[ separator, or something entirely wrong, is in the way
25401a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
25411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *first_unparsed = expression_cstr;
25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
25431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *final_result = ValueObject::eInvalid;
25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                return 0;
25451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
25461a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
25471a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
25481a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
25491a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
25501a102087f54079c25c8827afac6153a44ca535daEnrico Granata
2551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid
255266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject
255366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton(
255466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    Stream &s,
255566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ValueObject *valobj,
255666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    const char *root_valobj_name,
255766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t ptr_depth,
255866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t curr_depth,
255966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t max_depth,
256066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_types,
256166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_location,
256266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool use_objc,
256310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    lldb::DynamicValueType use_dynamic,
2564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    bool use_synth,
2565bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool scope_already_checked,
25667f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    bool flat_output,
25677f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    uint32_t omit_summary_depth
256866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton)
256966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
257082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (valobj)
257166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
2572afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        bool update_success = valobj->UpdateValueIfNeeded (use_dynamic, true);
257382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
257482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (update_success && use_dynamic != lldb::eNoDynamicValues)
2575e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
257610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get();
2577e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (dynamic_value)
2578e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                valobj = dynamic_value;
2579e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
2580e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2581bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = valobj->GetClangType();
2582bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2583f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
2584bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *err_cstr = NULL;
2585f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
2586f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
2587bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2588bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const bool print_valobj = flat_output == false || has_value;
2589bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2590bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (print_valobj)
259166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2592bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (show_location)
2593bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2594fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                s.Printf("%s: ", valobj->GetLocationAsCString());
2595bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
259666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2597bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.Indent();
259866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2599a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            // Always show the type for the top level items.
260000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (show_types || (curr_depth == 0 && !flat_output))
2601afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            {
2602441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                const char* typeName = valobj->GetTypeName().AsCString("<invalid type>");
2603441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                s.Printf("(%s", typeName);
2604441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                // only show dynamic types if the user really wants to see types
2605441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                if (show_types && use_dynamic != lldb::eNoDynamicValues &&
2606441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                    (/*strstr(typeName, "id") == typeName ||*/
2607441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                     ClangASTType::GetMinimumLanguage(valobj->GetClangAST(), valobj->GetClangType()) == lldb::eLanguageTypeObjC))
2608afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                {
2609afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    Process* process = valobj->GetUpdatePoint().GetProcessSP().get();
2610afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    if (process == NULL)
2611441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                        s.Printf(", dynamic type: unknown) ");
2612afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    else
2613afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    {
2614afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
2615afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        if (runtime == NULL)
2616441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                            s.Printf(", dynamic type: unknown) ");
2617afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        else
2618afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        {
2619afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            ObjCLanguageRuntime::ObjCISA isa = runtime->GetISA(*valobj);
2620afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            if (!runtime->IsValidISA(isa))
2621441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                                s.Printf(", dynamic type: unknown) ");
2622afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            else
2623afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                s.Printf(", dynamic type: %s) ",
2624afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                         runtime->GetActualTypeName(isa).GetCString());
2625afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        }
2626afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    }
2627afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                }
2628afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                else
2629afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    s.Printf(") ");
2630afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            }
263166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
263266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2633bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (flat_output)
2634bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2635b01000fd063629facd45044f137446fb748ee179Greg Clayton                // If we are showing types, also qualify the C++ base classes
2636b01000fd063629facd45044f137446fb748ee179Greg Clayton                const bool qualify_cxx_base_classes = show_types;
2637b01000fd063629facd45044f137446fb748ee179Greg Clayton                valobj->GetExpressionPath(s, qualify_cxx_base_classes);
2638bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString(" =");
2639bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2640bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else
2641bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2642bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
2643bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf ("%s =", name_cstr);
2644bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2645bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2646fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (!scope_already_checked && !valobj->IsInScope())
2647bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
264882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                err_cstr = "out of scope";
2649bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
265066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
265166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2652bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *val_cstr = NULL;
26531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        const char *sum_cstr = NULL;
26541a102087f54079c25c8827afac6153a44ca535daEnrico Granata        SummaryFormat* entry = valobj->GetSummaryFormat().get();
2655bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
26567f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        if (omit_summary_depth > 0)
26577f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            entry = NULL;
26587f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
2659bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (err_cstr == NULL)
2660bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
2661fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            val_cstr = valobj->GetValueAsCString();
2662bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            err_cstr = valobj->GetError().AsCString();
2663bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
266466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
266566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        if (err_cstr)
266666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
266782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            s.Printf (" <%s>\n", err_cstr);
266866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
266966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        else
267066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2671f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
2672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (print_valobj)
2673bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
26741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
26757f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL;
267666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
26771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // We must calculate this value in realtime because entry might alter this variable's value
26781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // (e.g. by saying ${var%fmt}) and render precached values useless
26791391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr))
26801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    s.Printf(" %s", valobj->GetValueAsCString());
268166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
268290d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                if (sum_cstr)
2683886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                {
2684886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // for some reason, using %@ (ObjC description) in a summary string, makes
2685886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // us believe we need to reset ourselves, thus invalidating the content of
2686886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty
2687886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // let us recalculate it!
2688886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (sum_cstr[0] == '\0')
2689886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", valobj->GetSummaryAsCString());
2690886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    else
2691886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", sum_cstr);
2692886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
2693bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2694bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (use_objc)
2695bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
2696fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    const char *object_desc = valobj->GetObjectDescription();
2697bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (object_desc)
2698bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        s.Printf(" %s\n", object_desc);
2699bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2700e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan                        s.Printf (" [no Objective-C description available]\n");
2701bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    return;
2702886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
270366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
270466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
270566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            if (curr_depth < max_depth)
270666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We will show children for all concrete types. We won't show
2708f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // pointer contents unless a pointer depth has been specified.
2709f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We won't reference contents unless the reference is the
2710f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // root object (depth of zero).
2711f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                bool print_children = true;
2712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2713f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // Use a new temporary pointer depth in case we override the
2714f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // current pointer depth below...
2715f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                uint32_t curr_ptr_depth = ptr_depth;
2716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2717f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
2718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (is_ptr || is_ref)
2719f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2720f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer or reference whose value is an address.
2721f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // Make sure that address is not NULL
2722b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType ptr_address_type;
2723f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (valobj->GetPointerValue (ptr_address_type, true) == 0)
2724f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2725f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2726f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    else if (is_ref && curr_depth == 0)
2727f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // If this is the root object (depth is zero) that we are showing
2729f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // and it is a reference, and no pointer depth has been supplied
2730f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // print out what it references. Don't do this at deeper depths
2731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // otherwise we can end up with infinite recursion...
2732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        curr_ptr_depth = 1;
2733f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (curr_ptr_depth == 0)
2736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
273866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2739886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr))
274066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2741e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    ValueObjectSP synth_vobj = valobj->GetSyntheticValue(use_synth ?
2742e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eUseSyntheticFilter :
2743e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eNoSyntheticFilter);
2744e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    const uint32_t num_children = synth_vobj->GetNumChildren();
2745bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (num_children)
274666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    {
2747bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (flat_output)
274866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        {
2749bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
2750bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                s.EOL();
2751bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2752bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        else
2753bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2754bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
27553f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                                s.PutCString(is_ref ? ": {\n" : " {\n");
2756bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentMore();
2757bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2758bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2759bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        for (uint32_t idx=0; idx<num_children; ++idx)
2760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2761e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                            ValueObjectSP child_sp(synth_vobj->GetChildAtIndex(idx, true));
2762bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (child_sp.get())
2763bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            {
2764bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                DumpValueObject (s,
2765bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 child_sp.get(),
2766bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 NULL,
2767f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                 (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
2768bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 curr_depth + 1,
2769bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 max_depth,
2770bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_types,
2771bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_location,
2772bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 false,
2773e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                                 use_dynamic,
2774e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                 use_synth,
2775bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 true,
27767f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 flat_output,
27777f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 omit_summary_depth > 1 ? omit_summary_depth - 1 : 0);
2778bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            }
2779bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2780bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2781bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (!flat_output)
2782bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2783bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentLess();
2784bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.Indent("}\n");
278566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        }
278666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    }
2787bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else if (has_children)
2788bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2789bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        // Aggregate, no children...
2790bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2791f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            s.PutCString(" {}\n");
2792bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2793bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2794bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2795bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2796bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.EOL();
2797bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2798bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
279966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
2800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                else
2801bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
280266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    s.EOL();
280366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
280466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
280566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            else
280666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2807bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (has_children && print_valobj)
280866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2809bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutCString("{...}\n");
281066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
281166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
281266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
281366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
281466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
281566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP
2818fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name)
2819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
2820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueObjectSP valobj_sp;
2821427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2822afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (UpdateValueIfNeeded(false) && m_error.Success())
2823427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2824fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        ExecutionContextScope *exe_scope = GetExecutionContextScope();
2825fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_scope)
2826fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
2827fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            ExecutionContext exe_ctx;
2828fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            exe_scope->CalculateExecutionContext(exe_ctx);
2829427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2830fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            clang::ASTContext *ast = GetClangAST ();
2831427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2832fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            DataExtractor data;
2833fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetByteOrder (m_data.GetByteOrder());
2834fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetAddressByteSize(m_data.GetAddressByteSize());
2835427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2836801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule());
2837427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
283847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            valobj_sp = ValueObjectConstResult::Create (exe_scope,
283947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        ast,
284047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        GetClangType(),
284147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        name,
284247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        data);
2843fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2844427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2845fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2846fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!valobj_sp)
2847427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
284847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        valobj_sp = ValueObjectConstResult::Create (NULL, m_error);
2849427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2850427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
2851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2852427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2853427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
2854bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error)
2855427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
285647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
285747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
2858e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2859c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const bool is_pointer_type = IsPointerType();
2860c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (is_pointer_type)
2861427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2862427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool omit_empty_base_classes = true;
286324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        bool ignore_array_bounds = false;
2864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        std::string child_name_str;
2866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_byte_size = 0;
2867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        int32_t child_byte_offset = 0;
2868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_size = 0;
2869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_offset = 0;
2870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool child_is_base_class = false;
287100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool child_is_deref_of_parent = false;
2872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const bool transparent_pointers = false;
2873427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *clang_ast = GetClangAST();
2874427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t clang_type = GetClangType();
2875427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t child_clang_type;
287658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
287758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        ExecutionContext exe_ctx;
287858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
287958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
288058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
288158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                                      clang_ast,
2882427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetName().GetCString(),
2883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      clang_type,
2884427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      0,
2885427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      transparent_pointers,
2886427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      omit_empty_base_classes,
288724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                      ignore_array_bounds,
2888427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_name_str,
2889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_size,
2890427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_offset,
2891427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_size,
2892427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_offset,
289300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_base_class,
289400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_deref_of_parent);
2895a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (child_clang_type && child_byte_size)
2896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
2897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ConstString child_name;
2898427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (!child_name_str.empty())
2899427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                child_name.SetCString (child_name_str.c_str());
2900427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
290147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            m_deref_valobj = new ValueObjectChild (*this,
290247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   clang_ast,
290347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_clang_type,
290447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_name,
290547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_size,
290647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_offset,
290747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_size,
290847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_offset,
290947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_base_class,
291047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_deref_of_parent);
2911427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
2912427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2913c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
291447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
2915c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
2916c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        error.Clear();
291747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
2918c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2919427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
2920427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2921c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        StreamString strm;
2922b01000fd063629facd45044f137446fb748ee179Greg Clayton        GetExpressionPath(strm, true);
2923c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2924c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        if (is_pointer_type)
2925c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
2926c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        else
2927c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
292847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
2929427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2930427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2931427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2932e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP
2933c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error)
2934427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
2935e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_addr_of_valobj_sp)
2936e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_addr_of_valobj_sp;
2937e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2938b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType address_type = eAddressTypeInvalid;
2939427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const bool scalar_is_load_address = false;
2940427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address);
2941c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    error.Clear();
2942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (addr != LLDB_INVALID_ADDRESS)
2943427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2944427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        switch (address_type)
2945427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
2946c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        default:
2947427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeInvalid:
2948c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2949c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                StreamString expr_path_strm;
2950b01000fd063629facd45044f137446fb748ee179Greg Clayton                GetExpressionPath(expr_path_strm, true);
2951c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
2952c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
2953427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
2954c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeFile:
2956427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeLoad:
2957427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeHost:
2958427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
2959427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang::ASTContext *ast = GetClangAST();
2960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang_type_t clang_type = GetClangType();
2961427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (ast && clang_type)
2962427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                {
2963427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    std::string name (1, '&');
2964427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    name.append (m_name.AsCString(""));
296547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                    m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(),
296647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ast,
296747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ClangASTContext::CreatePointerType (ast, clang_type),
296847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ConstString (name.c_str()),
296947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          addr,
297047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          eAddressTypeInvalid,
297147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          m_data.GetAddressByteSize());
2972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                }
2973427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
2974427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
2975427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
2976427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2977e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_addr_of_valobj_sp;
2978427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
29800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29810039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
29820039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type)
29830039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
29840039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
29850039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
29860039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
29870039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
29880039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29890039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
29900039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
29910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
29920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
29940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
29950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
29960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               clang_ast_type);
29970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
29980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
29990039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
30000039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30010039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
30020039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp)
30030039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
30040039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
30050039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
30060039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
30070039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
30080039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30090039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
30100039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
30110039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
30120039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30130039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
30140039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
30150039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
30160039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               type_sp);
30170039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
30180039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
30190039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
30200039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
3021fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () :
3022dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread_id (LLDB_INVALID_UID),
3023dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
3024fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3025fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3026fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3027fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
3028fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update (true),
3029dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update (true),
303091635093b0282d888fcde84a276ae518643c7fcaJim Ingham    m_thread_id (LLDB_INVALID_THREAD_ID),
3031dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
3032dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson
3033fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3034fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext exe_ctx;
3035fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *computed_exe_scope = exe_scope;  // If use_selected is true, we may find a better scope,
3036fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                            // and if so we want to cache that not the original.
3037fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
3038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
3039fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_ctx.target != NULL)
3040fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3041fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_target_sp = exe_ctx.target->GetSP();
3042fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3043fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_ctx.process == NULL)
3044fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.target->GetProcessSP();
3045fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3046fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.process->GetSP();
3047fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3048fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_process_sp != NULL)
3049fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3050fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stop_id = m_process_sp->GetStopID();
3051fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = NULL;
3052fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3053fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (exe_ctx.thread == NULL)
3054fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3055fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (use_selected)
3056fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3057fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    thread = m_process_sp->GetThreadList().GetSelectedThread().get();
3058fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (thread)
3059fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        computed_exe_scope = thread;
3060fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3061fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3062fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
3063fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                thread = exe_ctx.thread;
3064fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3065fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
3066fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3067fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = thread->GetIndexID();
3068fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (exe_ctx.frame == NULL)
3069fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3070fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (use_selected)
3071fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
3072fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get();
3073fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (frame)
3074fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
3075fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_stack_id = frame->GetStackID();
3076fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            computed_exe_scope = frame;
3077fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        }
3078fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
3079fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3080fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3081fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id = exe_ctx.frame->GetStackID();
3082fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3083fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3084fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3085fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = computed_exe_scope;
3086fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3087fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3088fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
3089fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope (rhs.m_exe_scope),
3090dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_needs_update(true),
3091dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update(true),
3092fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_target_sp (rhs.m_target_sp),
3093fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_process_sp (rhs.m_process_sp),
3094fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_thread_id (rhs.m_thread_id),
3095fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stack_id (rhs.m_stack_id),
3096fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stop_id (0)
3097fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3098fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3099fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint ()
3101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope *
3105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope ()
3106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // We have to update before giving out the scope, or we could be handing out stale pointers.
3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    SyncWithProcessState();
3109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_exe_scope;
3111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state.  If the current
3114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return
3115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change".  If the current state is different, we update our state, and return
3116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
3117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true.
3118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState()
3121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we're already invalid, we don't need to do anything, and nothing has changed:
3123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_stop_id == LLDB_INVALID_UID)
3124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Can't update with an invalid state.
3126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = false;
3127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we don't have a process nothing can change.
3131fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_process_sp)
3132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If our stop id is the current stop ID, nothing has changed:
3135e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    uint32_t cur_stop_id = m_process_sp->GetStopID();
3136e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_stop_id == cur_stop_id)
3137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3139e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
3140e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // In either case, we aren't going to be able to sync with the process state.
3141e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (cur_stop_id == 0)
3142e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return false;
3143e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
3144e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_stop_id = cur_stop_id;
3145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update = true;
3146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = m_process_sp.get();
3147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // Something has changed, so we will return true.  Now make sure the thread & frame still exist, and if either
3149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // doesn't, mark ourselves as invalid.
3150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_thread_id != LLDB_INVALID_THREAD_ID)
3152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get();
3154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (our_thread == NULL)
3155bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        {
315691635093b0282d888fcde84a276ae518643c7fcaJim Ingham            SetInvalid();
3157bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        }
3158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_exe_scope = our_thread;
3161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_stack_id.IsValid())
3163fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get();
3165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (our_frame == NULL)
3166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    SetInvalid();
3167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_exe_scope = our_frame;
3169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return true;
3173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3175ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
3176ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated ()
3177ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
3178ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_first_update = false;
3179ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_needs_update = false;
3180ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (m_process_sp)
3181ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_stop_id = m_process_sp->GetStopID();
3182ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
3183ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3184ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope)
3187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!IsValid())
3189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool needs_update = false;
3192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = NULL;
3193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // The target has to be non-null, and the
3195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    Target *target = exe_scope->CalculateTarget();
3196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (target != NULL)
3197fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Target *old_target = m_target_sp.get();
3199fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        assert (target == old_target);
3200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Process *process = exe_scope->CalculateProcess();
3201fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (process != NULL)
3202fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // FOR NOW - assume you can't update variable objects across process boundaries.
3204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Process *old_process = m_process_sp.get();
3205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            assert (process == old_process);
3206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            lldb::user_id_t stop_id = process->GetStopID();
3208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (stop_id != m_stop_id)
3209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
3211fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stop_id = stop_id;
3212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3213fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // See if we're switching the thread or stack context.  If no thread is given, this is
3214fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // being evaluated in a global context.
3215fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = exe_scope->CalculateThread();
3216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
3217fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3218fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                lldb::user_id_t new_thread_index = thread->GetIndexID();
3219fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_thread_index != m_thread_id)
3220fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3222fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = new_thread_index;
3223fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3224fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3225fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *new_frame = exe_scope->CalculateStackFrame();
3227fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_frame != NULL)
3228fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3229fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (new_frame->GetStackID() != m_stack_id)
3230fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
3231fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        needs_update = true;
3232fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        m_stack_id = new_frame->GetStackID();
3233fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
3234fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3235fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3236fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3237fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3238fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3239fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3240fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3241fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
3242fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3243fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // If this had been given a thread, and now there is none, we should update.
3244fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // Otherwise we don't have to do anything.
3245fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (m_thread_id != LLDB_INVALID_UID)
3246fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3247fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = LLDB_INVALID_UID;
3248fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3249fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3251fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3252fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3253fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3254fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3255fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // If there is no process, then we don't need to update anything.
3256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // But if we're switching from having a process to not, we should try to update.
3257fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_process_sp.get() != NULL)
3258fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3259fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
3260fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_process_sp.reset();
3261fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = LLDB_INVALID_UID;
3262fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stack_id.Clear();
3263fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3264fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3265fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3266fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    else
3267fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3268fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // If there's no target, nothing can change so we don't need to update anything.
3269fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // But if we're switching from having a target to not, we should try to update.
3270fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_target_sp.get() != NULL)
3271fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3272fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            needs_update = true;
3273fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_target_sp.reset();
3274fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp.reset();
3275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_thread_id = LLDB_INVALID_UID;
3276fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stack_id.Clear();
3277fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3278fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3279fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_needs_update)
3280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = needs_update;
3281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3282fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return needs_update;
3283fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3284f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
3285f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid
3286f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico GranataValueObject::ClearUserVisibleData()
3287f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{
3288f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_location_str.clear();
3289f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_value_str.clear();
3290f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_summary_str.clear();
3291f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_object_desc_str.clear();
32922bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen}
3293