ValueObject.cpp revision 801417e453f8531ac176cd952200587bf15d9ccf
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"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h"
25427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h"
26e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectDynamicValue.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
280039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/ValueObjectMemory.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
31cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton
321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
364ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h"
37b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
40eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0;
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
51fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) :
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (++g_value_obj_uid), // Unique identifier for every value object
53fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (&parent),
54dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (parent.GetUpdatePoint ()),
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (),
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data (),
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value (),
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error (),
5917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_str (),
6017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_old_value_str (),
6117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_location_str (),
6217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_summary_str (),
634ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    m_object_desc_str (),
6447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(parent.GetManager()),
6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children (),
6617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_synthetic_children (),
6747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
6847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
6911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_format (eFormatDefault),
7017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid (false),
7117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change (false),
7217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid (false),
73427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_old_value_valid (false),
7400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    m_pointers_point_to_load_addrs (false),
751391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
76886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_last_format_mgr_revision(0),
791391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_last_summary_format(),
801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_last_value_format()
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject(this);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
86fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
88fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ExecutionContextScope *exe_scope) :
89fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    UserID (++g_value_obj_uid), // Unique identifier for every value object
90fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (NULL),
91dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (exe_scope),
92fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_name (),
93fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_data (),
94fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value (),
95fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_error (),
96fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_str (),
97fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_str (),
98fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_location_str (),
99fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_summary_str (),
100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_object_desc_str (),
10147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(),
102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children (),
103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_synthetic_children (),
10447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
10547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_format (eFormatDefault),
107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_is_valid (false),
108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_did_change (false),
109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children_count_valid (false),
110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_valid (false),
111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_pointers_point_to_load_addrs (false),
1121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
113886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
1149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
1151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_last_format_mgr_revision(0),
1161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_last_summary_format(),
1171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_last_value_format()
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager = new ValueObjectManager();
12047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject (this);
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor
125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject ()
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
131886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format)
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
134886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (update_format)
135886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        UpdateFormatsIfNeeded();
1361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
137d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // If this is a constant value, then our success is predicated on whether
138d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // we have an error or not
139d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    if (GetIsConstant())
140d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        return m_error.Success();
141d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton
142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool first_update = m_update_point.IsFirstEvaluation();
143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_update_point.NeedsUpdating())
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_update_point.SetUpdated();
147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Save the old value using swap to avoid a string copy which
149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // also will clear our m_value_str
150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_value_str.empty())
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = false;
153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = true;
157fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_str.swap (m_value_str);
158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_value_str.clear();
159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_location_str.clear();
161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_summary_str.clear();
162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_object_desc_str.clear();
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        const bool value_was_valid = GetValueIsValid();
165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueDidChange (false);
166ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_error.Clear();
168ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Call the pure virtual function to update the value
170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        bool success = UpdateValue ();
171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueIsValid (success);
173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (first_update)
175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (false);
176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else if (!m_value_did_change && success == false)
177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
178fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // The value wasn't gotten successfully, so we mark this
179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // as changed if the value used to be valid and now isn't
180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (value_was_valid);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error.Success();
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1861391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granatavoid
1871391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::UpdateFormatsIfNeeded()
1881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{
1891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    /*printf("CHECKING FOR UPDATES. I am at revision %d, while the format manager is at revision %d\n",
1901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata           m_last_format_mgr_revision,
1911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata           Debugger::ValueFormats::GetCurrentRevision());*/
1921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (m_last_format_mgr_revision != Debugger::ValueFormats::GetCurrentRevision())
1931391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
1941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_summary_format.get())
1951391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            m_last_summary_format.reset((SummaryFormat*)NULL);
1961391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_value_format.get())
1971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            m_last_value_format.reset((ValueFormat*)NULL);
1981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        Debugger::ValueFormats::Get(*this, m_last_value_format);
199886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        if (!Debugger::SummaryFormats::Get(*this, m_last_summary_format))
200886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            Debugger::RegexSummaryFormats::Get(*this, m_last_summary_format);
2011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        m_last_format_mgr_revision = Debugger::ValueFormats::GetCurrentRevision();
2021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        m_value_str.clear();
2031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        m_summary_str.clear();
2041391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
2051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata}
2061391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor &
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor ()
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
210e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    UpdateValueIfNeeded();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error &
215bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError()
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
217bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton    UpdateValueIfNeeded();
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
228fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString ()
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
230fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (UpdateValueIfNeeded())
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_location_str.empty())
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_value.GetValueType())
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeScalar:
2426916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RegisterInfo *reg_info = m_value.GetRegisterInfo();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (reg_info)
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info->name)
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->name;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (reg_info->alt_name)
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->alt_name;
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str = "scalar";
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeLoadAddress:
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeFileAddress:
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeHostAddress:
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_location_str.swap(sstr.GetString());
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_location_str.c_str();
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue &
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue()
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value &
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
285fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar)
2860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
2870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ExecutionContext exe_ctx;
288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
289fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
290fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
2910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ());
2920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return scalar.IsValid();
2930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
2940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
2950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool
29617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_is_valid;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b)
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid = b;
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
309fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange ()
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
311fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    GetValueAsCString ();
31217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_did_change;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed)
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change = value_changed;
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
325917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
326917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
327917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        UpdateValueIfNeeded();
328917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (idx < GetNumChildren())
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
330917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        // Check if we have already made the child value object?
331917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (can_create && m_children[idx] == NULL)
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
333917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // No we haven't created the child at this index, so lets have our
334917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // subclass do it and cache the result for quick future access.
335917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            m_children[idx] = CreateChildAtIndex (idx, false, 0);
336e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
337917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
338917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_children[idx] != NULL)
339917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            return m_children[idx]->GetSP();
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name)
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
349462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                     GetClangType(),
350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name.GetCString(),
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes);
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3575d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // when getting a child by name, it could be buried inside some base
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // classes (which really aren't part of the expression path), so we
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // need a vector of indexes that can get us down to the correct child
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
362917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
363917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
364917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        UpdateValueIfNeeded();
365917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
366917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::vector<uint32_t> child_indexes;
367917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
368917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    void *clang_type = GetClangType();
369917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
370917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
371917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      clang_type,
372917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      name.GetCString(),
373917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      omit_empty_base_classes,
374917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      child_indexes);
375917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (num_child_indexes > 0)
376e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
377917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
379e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        child_sp = GetChildAtIndex(*pos, can_create);
381917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        for (++pos; pos != end; ++pos)
382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            if (child_sp)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp = new_child_sp;
387917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
388917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            else
389917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
390917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp.reset();
391e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
392917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren ()
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    if (!m_children_count_valid)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetNumChildren (CalculateNumChildren());
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_children.size();
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children)
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid = true;
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_children.resize(num_children);
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name)
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name.SetCString(name);
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = name;
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject *
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
430bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham    ValueObject *valobj = NULL;
431e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::string child_name_str;
435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_byte_size = 0;
436917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    int32_t child_byte_offset = 0;
437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_size = 0;
438917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_offset = 0;
439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_base_class = false;
440917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_deref_of_parent = false;
441917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
442917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const bool transparent_pointers = synthetic_array_member == false;
443917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
444917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t clang_type = GetClangType();
445917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t child_clang_type;
446917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
447917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    ExecutionContext exe_ctx;
448917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
449917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
450917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
451917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_ast,
452917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  GetName().GetCString(),
453917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_type,
454917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  idx,
455917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  transparent_pointers,
456917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  omit_empty_base_classes,
457917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_name_str,
458917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_size,
459917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_offset,
460917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_size,
461917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_offset,
462917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_base_class,
463917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_deref_of_parent);
464917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (child_clang_type && child_byte_size)
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
466917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (synthetic_index)
467917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_byte_offset += child_byte_size * synthetic_index;
468917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
469917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        ConstString child_name;
470917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (!child_name_str.empty())
471917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_name.SetCString (child_name_str.c_str());
472917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
473917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        valobj = new ValueObjectChild (*this,
474917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       clang_ast,
475917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_clang_type,
476917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_name,
477917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_size,
478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_offset,
479917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_size,
480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_offset,
481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_base_class,
482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_deref_of_parent);
483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_pointers_point_to_load_addrs)
484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs);
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
486e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
48747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return valobj;
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
491fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString ()
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
493fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (UpdateValueIfNeeded ())
4941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_summary_str.empty())
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4971391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            if (m_last_summary_format.get())
4981391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            {
4991391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                StreamString s;
5001391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                ExecutionContext exe_ctx;
5011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                this->GetExecutionContextScope()->CalculateExecutionContext(exe_ctx);
5021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                SymbolContext sc = exe_ctx.frame->GetSymbolContext(eSymbolContextEverything);
503886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
504886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                if (m_last_summary_format->m_show_members_oneliner)
505886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                {
506886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    const uint32_t num_children = GetNumChildren();
507886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (num_children)
508886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    {
509886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
510886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.PutChar('(');
511886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
512886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        for (uint32_t idx=0; idx<num_children; ++idx)
513886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        {
514886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            ValueObjectSP child_sp(GetChildAtIndex(idx, true));
515886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            if (child_sp.get())
516886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            {
517886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                if (idx)
518886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                    s.PutCString(", ");
519886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                s.PutCString(child_sp.get()->GetName().AsCString());
520886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                s.PutChar('=');
5219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                s.PutCString(child_sp.get()->GetPrintableRepresentation());
522886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            }
523886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        }
524886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
525886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.PutChar(')');
526886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
527886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        m_summary_str.swap(s.GetString());
528886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        return m_summary_str.c_str();
529886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    }
530886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    else
531886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        return "()";
532886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
533886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
534886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                else
5351391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                {
536886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (Debugger::FormatPrompt(m_last_summary_format->m_format.c_str(), &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, NULL, this))
537886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    {
538886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        m_summary_str.swap(s.GetString());
539886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        return m_summary_str.c_str();
540886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    }
541886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    else
542886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        return NULL;
5431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                }
5441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            }
5451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
546f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            clang_type_t clang_type = GetClangType();
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // See if this is a pointer to a C string?
54903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (clang_type)
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
55103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                StreamString sstr;
552f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t elem_or_pointee_clang_type;
553f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetClangAST(),
555427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      &elem_or_pointee_clang_type));
55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
557fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                ExecutionContextScope *exe_scope = GetExecutionContextScope();
558fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (exe_scope)
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
560fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
561fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        ClangASTContext::IsCharType (elem_or_pointee_clang_type))
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
563fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        Process *process = exe_scope->CalculateProcess();
564fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (process != NULL)
565f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        {
566fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
567fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            AddressType cstr_address_type = eAddressTypeInvalid;
568fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
569fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            size_t cstr_len = 0;
570fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            if (type_flags.Test (ClangASTContext::eTypeIsArray))
57103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            {
572fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                // We have an array
573fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                cstr_len = ClangASTContext::GetArraySize (clang_type);
574fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                cstr_address = GetAddressOf (cstr_address_type, true);
57503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            }
57603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            else
57703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            {
578fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                // We have a pointer
579fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                cstr_address = GetPointerValue (cstr_address_type, true);
580fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            }
581fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            if (cstr_address != LLDB_INVALID_ADDRESS)
582fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            {
583fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                DataExtractor data;
584fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                size_t bytes_read = 0;
585fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                std::vector<char> data_buffer;
586fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                Error error;
587fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                if (cstr_len > 0)
588fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                {
589fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    data_buffer.resize(cstr_len);
590fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder());
591fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), cstr_len, error);
592fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    if (bytes_read > 0)
593fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    {
594fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        sstr << '"';
595fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        data.Dump (&sstr,
596fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   0,                 // Start offset in "data"
597307fa07606d519d427c812802aff5f9727e7047cGreg Clayton                                                   eFormatCharArray,  // Print as characters
598fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   1,                 // Size of item (1 byte for a char!)
599fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   bytes_read,        // How many bytes to print?
600fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   UINT32_MAX,        // num per line
601fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   LLDB_INVALID_ADDRESS,// base address
602fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   0,                 // bitfield bit size
603fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   0);                // bitfield bit offset
604fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        sstr << '"';
605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    }
606fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                }
607fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                else
608fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                {
609fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    const size_t k_max_buf_size = 256;
610fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    data_buffer.resize (k_max_buf_size + 1);
611fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    // NULL terminate in case we don't get the entire C string
612fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    data_buffer.back() = '\0';
6135c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton
614fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    sstr << '"';
61503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
616fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder());
617fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0)
618fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    {
619fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        size_t len = strlen(&data_buffer.front());
620fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        if (len == 0)
621fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                            break;
622fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        if (len > bytes_read)
623fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                            len = bytes_read;
624fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
625fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        data.Dump (&sstr,
626fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   0,                 // Start offset in "data"
627307fa07606d519d427c812802aff5f9727e7047cGreg Clayton                                                   eFormatCharArray,  // Print as characters
628fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   1,                 // Size of item (1 byte for a char!)
629fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   len,               // How many bytes to print?
630fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   UINT32_MAX,        // num per line
631fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   LLDB_INVALID_ADDRESS,// base address
632fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   0,                 // bitfield bit size
633fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                   0);                // bitfield bit offset
634fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
635fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        if (len < k_max_buf_size)
636fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                            break;
637fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        cstr_address += k_max_buf_size;
638fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    }
639fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    sstr << '"';
64003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
64103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            }
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
643fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
644fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (sstr.GetSize() > 0)
645fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_summary_str.assign (sstr.GetData(), sstr.GetSize());
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
647fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    else if (ClangASTContext::IsFunctionPointerType (clang_type))
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
649fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        AddressType func_ptr_address_type = eAddressTypeInvalid;
650fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true);
65103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
652fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
653fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
654fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            switch (func_ptr_address_type)
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
656fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            case eAddressTypeInvalid:
657fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            case eAddressTypeFile:
658fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                break;
659fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
660fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            case eAddressTypeLoad:
66103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
662fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    Address so_addr;
663fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    Target *target = exe_scope->CalculateTarget();
664fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                    if (target && target->GetSectionLoadList().IsEmpty() == false)
66503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    {
666fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
667fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        {
668fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                            so_addr.Dump (&sstr,
669fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                          exe_scope,
670fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                          Address::DumpStyleResolvedDescription,
671fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                          Address::DumpStyleSectionNameOffset);
672fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        }
67303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    }
67403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
675fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                break;
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
677fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            case eAddressTypeHost:
678fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                break;
679fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            }
680fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        }
681fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (sstr.GetSize() > 0)
682fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
683fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_summary_str.assign (1, '(');
684fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_summary_str.append (sstr.GetData(), sstr.GetSize());
685fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_summary_str.append (1, ')');
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_summary_str.empty())
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_summary_str.c_str();
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6974ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char *
698fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription ()
6994ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{
700886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
701fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!UpdateValueIfNeeded ())
7024ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
703886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
704886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (!m_object_desc_str.empty())
705886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        return m_object_desc_str.c_str();
706886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
707fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
708fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope == NULL)
709fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return NULL;
710fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
7114ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    Process *process = exe_scope->CalculateProcess();
712b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (process == NULL)
7134ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
714b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
715b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    StreamString s;
7164ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
717b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    lldb::LanguageType language = GetObjectRuntimeLanguage();
718b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
7194ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
7200e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    if (runtime == NULL)
7210e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    {
72270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham        // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway...
7230e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        clang_type_t opaque_qual_type = GetClangType();
7240e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        if (opaque_qual_type != NULL)
7250e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        {
72670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            bool is_signed;
72770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed)
72870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham                || ClangASTContext::IsPointerType (opaque_qual_type))
72970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            {
7300e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham                runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
73170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            }
7320e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        }
7330e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    }
7340e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham
7350de37195f17fefb536157b3296a18999116b8125Jim Ingham    if (runtime && runtime->GetObjectDescription(s, *this))
7364ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    {
7374ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        m_object_desc_str.append (s.GetData());
7384ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    }
739e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan
740e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    if (m_object_desc_str.empty())
741e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return NULL;
742e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    else
743e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return m_object_desc_str.c_str();
7444ae519666628cca07c194bf677163009cc2e5a8bJim Ingham}
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
747fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString ()
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If our byte size is zero this is an aggregate type that has children
750462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
752fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (UpdateValueIfNeeded())
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_value_str.empty())
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Value::ContextType context_type = m_value.GetContextType();
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (context_type)
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
7606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeClangType:
7616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeLLDBType:
7626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeVariable:
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        clang_type_t clang_type = GetClangType ();
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (clang_type)
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString sstr;
76856bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton                            Format format = GetFormat();
7691391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            if (format == eFormatDefault)
7701391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            {
7711391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                if (m_last_value_format)
7721391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                    format = m_last_value_format->m_format;
7731391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                else
7749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                    // force the system into using unsigned integers for bitfields
7759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                    format = (m_is_bitfield_for_scalar ? eFormatUnsigned :
7769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                    ClangASTType::GetFormat(clang_type));
7771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            }
77811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton
77911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                            if (ClangASTType::DumpTypeValue (GetClangAST(),            // The clang AST
78011730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             clang_type,               // The clang type to display
78111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             &sstr,
7821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                                             format,                   // Format to display this type with
78311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             m_data,                   // Data to extract from
78411730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             0,                        // Byte offset into "m_data"
78511730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetByteSize(),            // Byte size of item in "m_data"
78611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetBitfieldBitSize(),     // Bitfield bit size
78711730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetBitfieldBitOffset()))  // Bitfield bit offset
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value_str.swap(sstr.GetString());
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
79082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            {
79182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)",
79282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                                                  m_data.GetByteSize(),
79382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                                                  GetByteSize());
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value_str.clear();
79582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            }
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeRegisterInfo:
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info)
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString reg_sstr;
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_data.Dump(&reg_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_str.swap(reg_sstr.GetString());
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
81154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
81254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                default:
81354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    break;
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
81617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
81717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            if (!m_value_did_change && m_old_value_valid)
81817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            {
81917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // The value was gotten successfully, so we consider the
82017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // value as changed if the value string differs
82117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                SetValueDidChange (m_old_value_str != m_value_str);
82217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            }
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_value_str.empty())
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_str.c_str();
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
830886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granataconst char *
831886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::GetPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display,
832886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                        lldb::Format custom_format)
833886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{
834886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if(custom_format != lldb::eFormatInvalid)
835886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        SetFormat(custom_format);
836886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
837886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    const char * return_value;
838886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
839886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    switch(val_obj_display)
840886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    {
841886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayValue:
842886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetValueAsCString();
843886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
844886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplaySummary:
845886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetSummaryAsCString();
846886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
847886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayLanguageSpecific:
848886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetObjectDescription();
849886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
850886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    }
851886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
8529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (!return_value)
8539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
8549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // try to pick the other choice
8559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (val_obj_display == eDisplayValue)
8569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return_value = GetSummaryAsCString();
8579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else if (val_obj_display == eDisplaySummary)
8589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return_value = GetValueAsCString();
8599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else
8609762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return_value = "";
8619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
862886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
8639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return (return_value ? return_value : "");
8649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
8659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
866886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
8679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
8689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s,
8699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         ValueObjectRepresentationStyle val_obj_display,
8709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         lldb::Format custom_format)
8719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
8729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    const char *targetvalue = GetPrintableRepresentation(val_obj_display, custom_format);
8739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if(targetvalue)
8749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        s.PutCString(targetvalue);
8759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    bool var_success = (targetvalue != NULL);
8769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if(custom_format != eFormatInvalid)
8779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        SetFormat(eFormatDefault);
8789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return var_success;
879886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata}
880886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
88103e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t
882b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address)
883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
884e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (!UpdateValueIfNeeded())
885e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return LLDB_INVALID_ADDRESS;
886e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
887f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
888f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
889f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeScalar:
890f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (scalar_is_load_address)
891f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
892f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = eAddressTypeLoad;
893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
895f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
896f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
897f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeLoadAddress:
898f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeFileAddress:
899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeHostAddress:
900f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
901f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = m_value.GetValueAddressType ();
902f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
903f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
904f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
905f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
906f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    address_type = eAddressTypeInvalid;
907f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return LLDB_INVALID_ADDRESS;
908f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
909f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
910f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t
911b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address)
91203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
91303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    lldb::addr_t address = LLDB_INVALID_ADDRESS;
91403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    address_type = eAddressTypeInvalid;
915e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
916e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (!UpdateValueIfNeeded())
917e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return address;
918e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
919f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
92003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
92103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeScalar:
92203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (scalar_is_load_address)
92303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
92403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
92503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = eAddressTypeLoad;
92603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
92703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
92803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
92903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeLoadAddress:
93003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeFileAddress:
93103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeHostAddress:
93203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
93303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            uint32_t data_offset = 0;
93403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_data.GetPointer(&data_offset);
93503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = m_value.GetValueAddressType();
93603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (address_type == eAddressTypeInvalid)
93703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                address_type = eAddressTypeLoad;
93803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
93903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
94003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (m_pointers_point_to_load_addrs)
943427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        address_type = eAddressTypeLoad;
944427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
94503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return address;
94603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
94703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str)
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our value is up to date first so that our location and location
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type is valid.
953fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!UpdateValueIfNeeded())
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
957462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *end = NULL;
960bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    const size_t byte_size = GetByteSize();
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(unsigned long long))
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            unsigned long long ull_val = strtoull(value_str, &end, 0);
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
976801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = ull_val;
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(long long))
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            long long sll_val = strtoll(value_str, &end, 0);
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
992801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = sll_val;
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const off_t byte_offset = GetByteOffset();
100154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size));
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst != NULL)
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We are decoding a float into host byte order below, so make
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // sure m_data knows what it contains.
1006cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                m_data.SetByteOrder(lldb::endian::InlHostByteOrder());
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue (
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        GetClangAST(),
1009462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                        GetClangType(),
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        value_str,
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        dst,
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        byte_size);
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (converted_byte_size == byte_size)
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we have made it here the value is in m_data and we should write it
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out to the target
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write ();
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write ()
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the update ID so the next time we try and read the value
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we try and read it again.
1038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_update_point.SetNeedsUpdate();
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: when Value has a method to write a value back, call it from here.
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1045b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType
1046b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage ()
1047b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
1048f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t opaque_qual_type = GetClangType();
1049b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (opaque_qual_type == NULL)
1050b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        return lldb::eLanguageTypeC;
1051b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
1052b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    // If the type is a reference, then resolve it to what it refers to first:
1053b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType());
1054b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (qual_type->isAnyPointerType())
1055b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
1056b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (qual_type->isObjCObjectPointerType())
1057b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1058b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
1059b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        clang::QualType pointee_type (qual_type->getPointeeType());
1060b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->getCXXRecordDeclForPointerType() != NULL)
1061b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
1062b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCObjectOrInterfaceType())
1063b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1064b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCClassType())
1065b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1066b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
1067b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    else
1068b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
1069b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (ClangASTContext::IsObjCClassType (opaque_qual_type))
1070b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1071974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        if (ClangASTContext::IsCXXClassType (opaque_qual_type))
1072b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
1073b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
1074b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
1075b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    return lldb::eLanguageTypeC;
1076b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
1077b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
107947da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj)
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
108147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_synthetic_children[key] = valobj;
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
108847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key);
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_synthetic_children.end())
109047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        synthetic_child_sp = pos->second->GetSP();
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType ()
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1097462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerType (GetClangType());
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110070c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool
11019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType ()
11029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
11039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return ClangASTContext::IsScalarType (GetClangType());
11049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
11059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
11069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
110770c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed)
110870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{
110970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham    return ClangASTContext::IsIntegerType (GetClangType(), is_signed);
111070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham}
1111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType ()
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
111582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPointerOrReferenceType (GetClangType());
111682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
111782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
111882f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
111982f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType ()
112082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
112182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType());
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1124917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
1125917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType ()
1126917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
1127917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType());
1128917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
1129917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsPointerType ())
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char index_str[64];
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(index_str, sizeof(index_str), "[%i]", index);
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString index_const_str(index_str);
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already created a synthetic array member in this
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // valid object. If we have we will re-use it.
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = GetSyntheticChild (index_const_str);
114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!synthetic_child_sp)
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
114447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            ValueObject *synthetic_child;
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We haven't made a synthetic array member for INDEX yet, so
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // lets make one and cache it for any future reference.
114747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            synthetic_child = CreateChildAtIndex(0, true, index);
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Cache the value if we got one back...
115047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            if (synthetic_child)
115147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            {
115247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                AddSyntheticChild(index_const_str, synthetic_child);
115347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                synthetic_child_sp = synthetic_child->GetSP();
1154886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                synthetic_child_sp->SetName(index_str);
1155886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                synthetic_child_sp->m_is_array_item_for_pointer = true;
115647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            }
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1161642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
11629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP
11639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create)
11649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
11659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    ValueObjectSP synthetic_child_sp;
11669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (IsScalarType ())
11679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
11689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        char index_str[64];
11699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
11709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        ConstString index_const_str(index_str);
11719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // Check if we have already created a synthetic array member in this
11729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // valid object. If we have we will re-use it.
11739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        synthetic_child_sp = GetSyntheticChild (index_const_str);
11749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (!synthetic_child_sp)
11759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
11769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            ValueObjectChild *synthetic_child;
11779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // We haven't made a synthetic array member for INDEX yet, so
11789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // lets make one and cache it for any future reference.
11799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            synthetic_child = new ValueObjectChild(*this,
11809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangAST(),
11819762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangType(),
11829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      index_const_str,
11839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetByteSize(),
11849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      0,
11859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      to-from+1,
11869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      from,
11879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false,
11889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false);
11899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
11909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // Cache the value if we got one back...
11919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            if (synthetic_child)
11929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            {
11939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                AddSyntheticChild(index_const_str, synthetic_child);
11949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp = synthetic_child->GetSP();
11959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp->SetName(index_str);
11969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp->m_is_bitfield_for_scalar = true;
11979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            }
11989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
11999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
12009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return synthetic_child_sp;
12019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
12029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
1203e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid
120410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic)
1205642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
120610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
120710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return;
120810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
120947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (!m_dynamic_value && !IsDynamic())
1210e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
1211e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        Process *process = m_update_point.GetProcess();
1212e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool worth_having_dynamic_value = false;
1213642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1214e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1215e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // FIXME: Process should have some kind of "map over Runtimes" so we don't have to
1216e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // hard code this everywhere.
1217e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        lldb::LanguageType known_type = GetObjectRuntimeLanguage();
1218e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC)
1219e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1220e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *runtime = process->GetLanguageRuntime (known_type);
1221e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (runtime)
1222e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this);
1223e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1224e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        else
1225e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1226e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus);
1227e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (cpp_runtime)
1228e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this);
1229e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1230e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (!worth_having_dynamic_value)
1231e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
1232e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC);
1233e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                if (objc_runtime)
123410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham                    worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this);
1235e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
1236e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1237e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1238e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (worth_having_dynamic_value)
123910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
124047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
124147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//        if (worth_having_dynamic_value)
124247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//            printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager);
1243e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1244e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
1245e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
1246e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
124747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
124810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic)
1249e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
125010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
125110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return ValueObjectSP();
125210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
125310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (!IsDynamic() && m_dynamic_value == NULL)
1254e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
125510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        CalculateDynamicValue(use_dynamic);
1256e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
125747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_dynamic_value)
125847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_dynamic_value->GetSP();
125947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    else
126047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
1261642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
126266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
126300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool
126400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s)
126500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
126600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (IsBaseClass())
126700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1268e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
126900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        clang_type_t clang_type = GetClangType();
127000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        std::string cxx_class_name;
127100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name);
127200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (this_had_base_class)
127300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        {
127400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (parent_had_base_class)
127500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString("::");
127600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            s.PutCString(cxx_class_name.c_str());
127700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        }
127800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        return parent_had_base_class || this_had_base_class;
127900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
128000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return false;
128100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
128200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
128300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
128400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject *
128500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent()
128600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
1287e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (GetParent())
128800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1289e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (GetParent()->IsBaseClass())
1290e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent()->GetNonBaseClassParent();
129100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        else
1292e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent();
129300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
129400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return NULL;
129500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
129666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
129766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid
12981391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
1299bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
130000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    const bool is_deref_of_parent = IsDereferenceOfParent ();
130100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
13021391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if(is_deref_of_parent && epformat == eDereferencePointers) {
13031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
13041391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
13051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // the eHonorPointers mode is meant to produce strings in this latter format
13061391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s.PutCString("*(");
13071391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
130800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
13091391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    ValueObject* parent = GetParent();
13101391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
13111391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (parent)
13121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
1313886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
1314886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // if we are a deref_of_parent just because we are synthetic array
1315886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // members made up to allow ptr[%d] syntax to work in variable
1316886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // printing, then add our name ([%d]) to the expression path
1317886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if(m_is_array_item_for_pointer && epformat == eHonorPointers)
1318886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        s.PutCString(m_name.AsCString());
13191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
132000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (!IsBaseClass())
132100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
132200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (!is_deref_of_parent)
1323bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
132400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            ValueObject *non_base_class_parent = GetNonBaseClassParent();
132500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (non_base_class_parent)
1326bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
132700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType();
132800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (non_base_class_parent_clang_type)
132900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
133000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL);
133100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
13321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    if(parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers)
133300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    {
133400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("->");
133500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
13361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    else
13371391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    {
13381391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer)
13391391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
13401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutCString("->");
13411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
13421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) &&
13431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                 !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray))
13441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
13451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutChar('.');
13461391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
134700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
134800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
1349bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
135000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
135100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            const char *name = GetName().GetCString();
135200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (name)
1353bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
135400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (qualify_cxx_base_classes)
135500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
135600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    if (GetBaseClassPath (s))
135700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("::");
135800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
135900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString(name);
1360bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1361bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
1362bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1363bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
13641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
136500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        s.PutChar(')');
13661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
1367bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1368bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1369bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid
137066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject
137166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton(
137266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    Stream &s,
137366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ValueObject *valobj,
137466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    const char *root_valobj_name,
137566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t ptr_depth,
137666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t curr_depth,
137766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t max_depth,
137866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_types,
137966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_location,
138066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool use_objc,
138110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    lldb::DynamicValueType use_dynamic,
1382bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool scope_already_checked,
1383bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool flat_output
138466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton)
138566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
138682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (valobj)
138766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
138882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        bool update_success = valobj->UpdateValueIfNeeded ();
138982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
139082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (update_success && use_dynamic != lldb::eNoDynamicValues)
1391e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
139210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get();
1393e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (dynamic_value)
1394e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                valobj = dynamic_value;
1395e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1396e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1397bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = valobj->GetClangType();
1398bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1399f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
1400bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *err_cstr = NULL;
1401f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
1402f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
1403bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1404bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const bool print_valobj = flat_output == false || has_value;
1405bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1406bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (print_valobj)
140766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1408bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (show_location)
1409bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1410fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                s.Printf("%s: ", valobj->GetLocationAsCString());
1411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
141266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1413bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.Indent();
141466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1415a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            // Always show the type for the top level items.
141600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (show_types || (curr_depth == 0 && !flat_output))
1417427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>"));
141866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
141966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1420bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (flat_output)
1421bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1422b01000fd063629facd45044f137446fb748ee179Greg Clayton                // If we are showing types, also qualify the C++ base classes
1423b01000fd063629facd45044f137446fb748ee179Greg Clayton                const bool qualify_cxx_base_classes = show_types;
1424b01000fd063629facd45044f137446fb748ee179Greg Clayton                valobj->GetExpressionPath(s, qualify_cxx_base_classes);
1425bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString(" =");
1426bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1427bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else
1428bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1429bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
1430bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf ("%s =", name_cstr);
1431bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1432bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1433fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (!scope_already_checked && !valobj->IsInScope())
1434bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
143582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                err_cstr = "out of scope";
1436bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
143766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
143866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1439bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *val_cstr = NULL;
14401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        const char *sum_cstr = NULL;
14411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        SummaryFormat* entry = valobj->m_last_summary_format.get();
1442bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1443bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (err_cstr == NULL)
1444bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
1445fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            val_cstr = valobj->GetValueAsCString();
1446bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            err_cstr = valobj->GetError().AsCString();
1447bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
144866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
144966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        if (err_cstr)
145066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
145182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            s.Printf (" <%s>\n", err_cstr);
145266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
145366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        else
145466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1455f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
1456bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (print_valobj)
1457bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
14581391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
14591391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                sum_cstr = valobj->GetSummaryAsCString();
146066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
14611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // We must calculate this value in realtime because entry might alter this variable's value
14621391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // (e.g. by saying ${var%fmt}) and render precached values useless
14631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr))
14641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    s.Printf(" %s", valobj->GetValueAsCString());
146566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1466886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                if(sum_cstr)
1467886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                {
1468886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // for some reason, using %@ (ObjC description) in a summary string, makes
1469886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // us believe we need to reset ourselves, thus invalidating the content of
1470886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty
1471886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // let us recalculate it!
1472886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (sum_cstr[0] == '\0')
1473886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", valobj->GetSummaryAsCString());
1474886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    else
1475886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", sum_cstr);
1476886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
1477bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1478bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (use_objc)
1479bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
1480fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    const char *object_desc = valobj->GetObjectDescription();
1481bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (object_desc)
1482bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        s.Printf(" %s\n", object_desc);
1483bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
1484e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan                        s.Printf (" [no Objective-C description available]\n");
1485bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    return;
1486886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
148766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
148866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
148966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            if (curr_depth < max_depth)
149066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
1491f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We will show children for all concrete types. We won't show
1492f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // pointer contents unless a pointer depth has been specified.
1493f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We won't reference contents unless the reference is the
1494f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // root object (depth of zero).
1495f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                bool print_children = true;
1496f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1497f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // Use a new temporary pointer depth in case we override the
1498f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // current pointer depth below...
1499f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                uint32_t curr_ptr_depth = ptr_depth;
1500f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1501f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
1502f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (is_ptr || is_ref)
1503f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
1504f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer or reference whose value is an address.
1505f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // Make sure that address is not NULL
1506b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType ptr_address_type;
1507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (valobj->GetPointerValue (ptr_address_type, true) == 0)
1508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
1509f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    else if (is_ref && curr_depth == 0)
1511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
1512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // If this is the root object (depth is zero) that we are showing
1513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // and it is a reference, and no pointer depth has been supplied
1514f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // print out what it references. Don't do this at deeper depths
1515f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // otherwise we can end up with infinite recursion...
1516f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        curr_ptr_depth = 1;
1517f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
1518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (curr_ptr_depth == 0)
1520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
1521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
152266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1523886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr))
152466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
1525bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    const uint32_t num_children = valobj->GetNumChildren();
1526bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (num_children)
152766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    {
1528bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (flat_output)
152966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        {
1530bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
1531bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                s.EOL();
1532bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1533bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        else
1534bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1535bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
15363f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                                s.PutCString(is_ref ? ": {\n" : " {\n");
1537bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentMore();
1538bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1539bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1540bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        for (uint32_t idx=0; idx<num_children; ++idx)
1541bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            ValueObjectSP child_sp(valobj->GetChildAtIndex(idx, true));
1543bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (child_sp.get())
1544bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            {
1545bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                DumpValueObject (s,
1546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 child_sp.get(),
1547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 NULL,
1548f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                 (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
1549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 curr_depth + 1,
1550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 max_depth,
1551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_types,
1552bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_location,
1553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 false,
1554e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                                 use_dynamic,
1555bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 true,
1556bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 flat_output);
1557bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            }
1558bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1559bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1560bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (!flat_output)
1561bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1562bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentLess();
1563bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.Indent("}\n");
156466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        }
156566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    }
1566bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else if (has_children)
1567bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
1568bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        // Aggregate, no children...
1569bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
1570f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            s.PutCString(" {}\n");
1571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
1572bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
1573bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
1574bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
1575bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.EOL();
1576bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
1577bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
157866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
1579bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                else
1580bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
158166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    s.EOL();
158266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
158366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
158466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            else
158566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
1586bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (has_children && print_valobj)
158766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
1588bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutCString("{...}\n");
158966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
159066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
159166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
159266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
159366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
159466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP
1597fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name)
1598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1599427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueObjectSP valobj_sp;
1600427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1601fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (UpdateValueIfNeeded() && m_error.Success())
1602427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1603fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        ExecutionContextScope *exe_scope = GetExecutionContextScope();
1604fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_scope)
1605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
1606fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            ExecutionContext exe_ctx;
1607fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            exe_scope->CalculateExecutionContext(exe_ctx);
1608427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1609fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            clang::ASTContext *ast = GetClangAST ();
1610427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1611fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            DataExtractor data;
1612fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetByteOrder (m_data.GetByteOrder());
1613fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetAddressByteSize(m_data.GetAddressByteSize());
1614427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1615801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule());
1616427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
161747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            valobj_sp = ValueObjectConstResult::Create (exe_scope,
161847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        ast,
161947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        GetClangType(),
162047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        name,
162147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        data);
1622fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
1623427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1624fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1625fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!valobj_sp)
1626427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
162747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        valobj_sp = ValueObjectConstResult::Create (NULL, m_error);
1628427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1629427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
1630427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1631427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1632427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
1633bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error)
1634427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
163547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
163647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
1637e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1638c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const bool is_pointer_type = IsPointerType();
1639c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (is_pointer_type)
1640427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool omit_empty_base_classes = true;
1642427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1643427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        std::string child_name_str;
1644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_byte_size = 0;
1645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        int32_t child_byte_offset = 0;
1646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_size = 0;
1647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_offset = 0;
1648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool child_is_base_class = false;
164900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool child_is_deref_of_parent = false;
1650427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const bool transparent_pointers = false;
1651427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *clang_ast = GetClangAST();
1652427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t clang_type = GetClangType();
1653427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t child_clang_type;
165458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
165558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        ExecutionContext exe_ctx;
165658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
165758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
165858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
165958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                                      clang_ast,
1660427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetName().GetCString(),
1661427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      clang_type,
1662427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      0,
1663427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      transparent_pointers,
1664427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      omit_empty_base_classes,
1665427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_name_str,
1666427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_size,
1667427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_offset,
1668427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_size,
1669427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_offset,
167000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_base_class,
167100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_deref_of_parent);
1672a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (child_clang_type && child_byte_size)
1673427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
1674427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ConstString child_name;
1675427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (!child_name_str.empty())
1676427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                child_name.SetCString (child_name_str.c_str());
1677427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
167847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            m_deref_valobj = new ValueObjectChild (*this,
167947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   clang_ast,
168047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_clang_type,
168147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_name,
168247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_size,
168347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_offset,
168447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_size,
168547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_offset,
168647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_base_class,
168747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_deref_of_parent);
1688427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
1689427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1690c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
169147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
1692c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
1693c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        error.Clear();
169447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
1695c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
1696427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
1697427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1698c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        StreamString strm;
1699b01000fd063629facd45044f137446fb748ee179Greg Clayton        GetExpressionPath(strm, true);
1700c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1701c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        if (is_pointer_type)
1702c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
1703c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        else
1704c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
170547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
1706427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1707427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1708427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1709e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP
1710c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error)
1711427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1712e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_addr_of_valobj_sp)
1713e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_addr_of_valobj_sp;
1714e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1715b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType address_type = eAddressTypeInvalid;
1716427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const bool scalar_is_load_address = false;
1717427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address);
1718c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    error.Clear();
1719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (addr != LLDB_INVALID_ADDRESS)
1720427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1721427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        switch (address_type)
1722427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
1723c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        default:
1724427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeInvalid:
1725c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
1726c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                StreamString expr_path_strm;
1727b01000fd063629facd45044f137446fb748ee179Greg Clayton                GetExpressionPath(expr_path_strm, true);
1728c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
1729c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
1730427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
1731c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1732427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeFile:
1733427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeLoad:
1734427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeHost:
1735427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
1736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang::ASTContext *ast = GetClangAST();
1737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang_type_t clang_type = GetClangType();
1738427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (ast && clang_type)
1739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                {
1740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    std::string name (1, '&');
1741427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    name.append (m_name.AsCString(""));
174247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                    m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(),
174347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ast,
174447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ClangASTContext::CreatePointerType (ast, clang_type),
174547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ConstString (name.c_str()),
174647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          addr,
174747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          eAddressTypeInvalid,
174847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          m_data.GetAddressByteSize());
1749427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                }
1750427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
1751427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
1752427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
1753427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1754e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_addr_of_valobj_sp;
1755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1756427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
17570039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
17580039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
17590039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type)
17600039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
17610039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
17620039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
17630039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
17640039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
17650039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
17660039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
17670039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
17680039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
17690039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
17700039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
17710039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
17720039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
17730039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               clang_ast_type);
17740039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
17750039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
17760039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
17770039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
17780039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
17790039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp)
17800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
17810039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
17820039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
17830039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
17840039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
17850039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
17860039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
17870039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
17880039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
17890039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
17900039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
17910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
17920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
17930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               type_sp);
17940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
17950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
17960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
17970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
17980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
1799fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () :
1800dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread_id (LLDB_INVALID_UID),
1801dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
1802fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
1803fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
1804fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1805fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
1806fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update (true),
1807dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update (true),
180891635093b0282d888fcde84a276ae518643c7fcaJim Ingham    m_thread_id (LLDB_INVALID_THREAD_ID),
1809dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
1810dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson
1811fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
1812fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext exe_ctx;
1813fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *computed_exe_scope = exe_scope;  // If use_selected is true, we may find a better scope,
1814fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                            // and if so we want to cache that not the original.
1815fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
1816fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
1817fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_ctx.target != NULL)
1818fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
1819fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_target_sp = exe_ctx.target->GetSP();
1820fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1821fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_ctx.process == NULL)
1822fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.target->GetProcessSP();
1823fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
1824fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.process->GetSP();
1825fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1826fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_process_sp != NULL)
1827fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
1828fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stop_id = m_process_sp->GetStopID();
1829fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = NULL;
1830fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1831fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (exe_ctx.thread == NULL)
1832fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
1833fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (use_selected)
1834fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
1835fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    thread = m_process_sp->GetThreadList().GetSelectedThread().get();
1836fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (thread)
1837fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        computed_exe_scope = thread;
1838fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
1839fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
1840fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
1841fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                thread = exe_ctx.thread;
1842fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1843fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
1844fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
1845fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = thread->GetIndexID();
1846fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (exe_ctx.frame == NULL)
1847fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
1848fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (use_selected)
1849fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
1850fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get();
1851fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (frame)
1852fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
1853fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_stack_id = frame->GetStackID();
1854fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            computed_exe_scope = frame;
1855fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        }
1856fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
1857fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
1858fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
1859fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id = exe_ctx.frame->GetStackID();
1860fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
1861fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
1862fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
1863fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = computed_exe_scope;
1864fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
1865fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1866fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
1867fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope (rhs.m_exe_scope),
1868dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_needs_update(true),
1869dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update(true),
1870fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_target_sp (rhs.m_target_sp),
1871fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_process_sp (rhs.m_process_sp),
1872fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_thread_id (rhs.m_thread_id),
1873fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stack_id (rhs.m_stack_id),
1874fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stop_id (0)
1875fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
1876fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
1877fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1878fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint ()
1879fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
1880fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
1881fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1882fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope *
1883fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope ()
1884fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
1885fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // We have to update before giving out the scope, or we could be handing out stale pointers.
1886fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    SyncWithProcessState();
1887fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1888fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_exe_scope;
1889fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
1890fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1891fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state.  If the current
1892fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return
1893fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change".  If the current state is different, we update our state, and return
1894fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
1895fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true.
1896fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1897fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
1898fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState()
1899fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
1900fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we're already invalid, we don't need to do anything, and nothing has changed:
1901fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_stop_id == LLDB_INVALID_UID)
1902fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
1903fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Can't update with an invalid state.
1904fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = false;
1905fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
1906fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
1907fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1908fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we don't have a process nothing can change.
1909fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_process_sp)
1910fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
1911fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1912fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If our stop id is the current stop ID, nothing has changed:
1913e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    uint32_t cur_stop_id = m_process_sp->GetStopID();
1914e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_stop_id == cur_stop_id)
1915fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
1916fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1917e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
1918e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // In either case, we aren't going to be able to sync with the process state.
1919e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (cur_stop_id == 0)
1920e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return false;
1921e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1922e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_stop_id = cur_stop_id;
1923fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update = true;
1924fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = m_process_sp.get();
1925fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1926fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // Something has changed, so we will return true.  Now make sure the thread & frame still exist, and if either
1927fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // doesn't, mark ourselves as invalid.
1928fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1929fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_thread_id != LLDB_INVALID_THREAD_ID)
1930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
1931fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get();
1932fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (our_thread == NULL)
1933bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        {
193491635093b0282d888fcde84a276ae518643c7fcaJim Ingham            SetInvalid();
1935bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        }
1936fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
1937fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
1938fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_exe_scope = our_thread;
1939fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1940fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_stack_id.IsValid())
1941fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
1942fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get();
1943fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (our_frame == NULL)
1944fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    SetInvalid();
1945fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
1946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_exe_scope = our_frame;
1947fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
1948fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
1949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
1950fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return true;
1951fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
1952fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1953ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
1954ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated ()
1955ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
1956ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_first_update = false;
1957ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_needs_update = false;
1958ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (m_process_sp)
1959ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_stop_id = m_process_sp->GetStopID();
1960ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
1961ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
1962ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
1963fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
1964fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope)
1965fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
1966fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!IsValid())
1967fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
1968fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1969fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool needs_update = false;
1970fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = NULL;
1971fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1972fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // The target has to be non-null, and the
1973fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    Target *target = exe_scope->CalculateTarget();
1974fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (target != NULL)
1975fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
1976fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Target *old_target = m_target_sp.get();
1977fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        assert (target == old_target);
1978fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Process *process = exe_scope->CalculateProcess();
1979fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (process != NULL)
1980fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
1981fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // FOR NOW - assume you can't update variable objects across process boundaries.
1982fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Process *old_process = m_process_sp.get();
1983fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            assert (process == old_process);
1984fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
1985fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            lldb::user_id_t stop_id = process->GetStopID();
1986fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (stop_id != m_stop_id)
1987fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
1988fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
1989fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stop_id = stop_id;
1990fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
1991fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // See if we're switching the thread or stack context.  If no thread is given, this is
1992fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // being evaluated in a global context.
1993fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = exe_scope->CalculateThread();
1994fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
1995fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
1996fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                lldb::user_id_t new_thread_index = thread->GetIndexID();
1997fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_thread_index != m_thread_id)
1998fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
1999fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
2000fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = new_thread_index;
2001fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
2002fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
2003fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2004fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *new_frame = exe_scope->CalculateStackFrame();
2005fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_frame != NULL)
2006fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
2007fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (new_frame->GetStackID() != m_stack_id)
2008fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
2009fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        needs_update = true;
2010fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        m_stack_id = new_frame->GetStackID();
2011fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
2012fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
2013fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
2014fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
2015fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
2016fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
2017fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
2018fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
2019fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
2020fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
2021fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // If this had been given a thread, and now there is none, we should update.
2022fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // Otherwise we don't have to do anything.
2023fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (m_thread_id != LLDB_INVALID_UID)
2024fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
2025fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = LLDB_INVALID_UID;
2026fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
2027fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
2028fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
2029fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
2030fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2031fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
2032fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
2033fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // If there is no process, then we don't need to update anything.
2034fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // But if we're switching from having a process to not, we should try to update.
2035fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_process_sp.get() != NULL)
2036fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
2037fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
2038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_process_sp.reset();
2039fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = LLDB_INVALID_UID;
2040fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stack_id.Clear();
2041fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
2042fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2043fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
2044fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    else
2045fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
2046fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // If there's no target, nothing can change so we don't need to update anything.
2047fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // But if we're switching from having a target to not, we should try to update.
2048fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_target_sp.get() != NULL)
2049fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
2050fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            needs_update = true;
2051fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_target_sp.reset();
2052fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp.reset();
2053fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_thread_id = LLDB_INVALID_UID;
2054fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stack_id.Clear();
2055fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2056fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
2057fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_needs_update)
2058fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = needs_update;
2059fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2060fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return needs_update;
2061fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
2062