ValueObject.cpp revision 00c3ae7dac4cf9654d1569735c41e58fb2fd8969
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"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h"
24427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
314ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h"
32b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
35eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
46bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonValueObject::ValueObject (ValueObject *parent) :
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (++g_value_obj_uid), // Unique identifier for every value object
48bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    m_parent (parent),
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_update_id (0),    // Value object lists always start at 1, value objects start at zero
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (),
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data (),
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value (),
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error (),
5417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_str (),
5517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_old_value_str (),
5617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_location_str (),
5717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_summary_str (),
584ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    m_object_desc_str (),
5917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children (),
6017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_synthetic_children (),
6111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_dynamic_value_sp (),
6211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_format (eFormatDefault),
6317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid (false),
6417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change (false),
6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid (false),
66427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_old_value_valid (false),
6700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    m_pointers_point_to_load_addrs (false),
6800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    m_is_deref_of_parent (false)
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::~ValueObject ()
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruser_id_t
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetUpdateID() const
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_update_id;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::UpdateValueIfNeeded (ExecutionContextScope *exe_scope)
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // If this is a constant value, then our success is predicated on whether
89d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // we have an error or not
90d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    if (GetIsConstant())
91d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        return m_error.Success();
92d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (exe_scope)
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Process *process = exe_scope->CalculateProcess();
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const user_id_t stop_id = process->GetStopID();
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_update_id != stop_id)
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
10117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                bool first_update = m_update_id == 0;
102ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // Save the old value using swap to avoid a string copy which
103ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // also will clear our m_value_str
10417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                if (m_value_str.empty())
10517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                {
10617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_old_value_valid = false;
10717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                }
10817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                else
10917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                {
11017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_old_value_valid = true;
11117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_old_value_str.swap (m_value_str);
11217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_value_str.clear();
11317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                }
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str.clear();
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_summary_str.clear();
1164ae519666628cca07c194bf677163009cc2e5a8bJim Ingham                m_object_desc_str.clear();
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                const bool value_was_valid = GetValueIsValid();
119ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                SetValueDidChange (false);
120ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
121ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                m_error.Clear();
122ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
123ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // Call the pure virtual function to update the value
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                UpdateValue (exe_scope);
125ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
126ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // Update the fact that we tried to update the value for this
127fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton                // value object whether or not we succeed
128ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                m_update_id = stop_id;
129ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                bool success = m_error.Success();
130ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                SetValueIsValid (success);
13117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
13217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                if (first_update)
13317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    SetValueDidChange (false);
13417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                else if (!m_value_did_change && success == false)
135ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                {
13617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    // The value wasn't gotten successfully, so we mark this
13717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    // as changed if the value used to be valid and now isn't
13817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    SetValueDidChange (value_was_valid);
139ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                }
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error.Success();
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor &
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () const
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor &
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor ()
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error &
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetError() const
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetLocationAsCString (ExecutionContextScope *exe_scope)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (UpdateValueIfNeeded(exe_scope))
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_location_str.empty())
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_value.GetValueType())
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeScalar:
1856916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RegisterInfo *reg_info = m_value.GetRegisterInfo();
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (reg_info)
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info->name)
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->name;
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (reg_info->alt_name)
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->alt_name;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str = "scalar";
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeLoadAddress:
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeFileAddress:
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeHostAddress:
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2;
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_location_str.swap(sstr.GetString());
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_location_str.c_str();
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue &
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue()
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value &
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
2280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonValueObject::ResolveValue (ExecutionContextScope *exe_scope, Scalar &scalar)
2290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
2300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ExecutionContext exe_ctx;
2310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    exe_scope->CalculateExecutionContext(exe_ctx);
2320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ());
2330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return scalar.IsValid();
2340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
2350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
2360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool
23717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_is_valid;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b)
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid = b;
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
25017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueDidChange (ExecutionContextScope *exe_scope)
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    GetValueAsCString (exe_scope);
25317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_did_change;
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed)
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change = value_changed;
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < GetNumChildren())
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already made the child value object?
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (can_create && m_children[idx].get() == NULL)
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No we haven't created the child at this index, so lets have our
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // subclass do it and cache the result for quick future access.
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_children[idx] = CreateChildAtIndex (idx, false, 0);
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_sp = m_children[idx];
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name)
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
286462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                     GetClangType(),
287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name.GetCString(),
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes);
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2945d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // when getting a child by name, it could be buried inside some base
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // classes (which really aren't part of the expression path), so we
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // need a vector of indexes that can get us down to the correct child
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t> child_indexes;
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *clang_ast = GetClangAST();
299462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    void *clang_type = GetClangType();
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      clang_type,
303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                                      name.GetCString(),
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      omit_empty_base_classes,
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      child_indexes);
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_child_indexes > 0)
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_sp = GetChildAtIndex(*pos, can_create);
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (++pos; pos != end; ++pos)
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (child_sp)
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                child_sp = new_child_sp;
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                child_sp.reset();
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren ()
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    if (!m_children_count_valid)
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetNumChildren (CalculateNumChildren());
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_children.size();
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children)
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid = true;
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_children.resize(num_children);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name)
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name.SetCString(name);
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name)
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = name;
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP valobj_sp;
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string child_name_str;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_byte_size = 0;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t child_byte_offset = 0;
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_bitfield_bit_size = 0;
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_bitfield_bit_offset = 0;
370bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool child_is_base_class = false;
37100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool child_is_deref_of_parent = false;
37200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const bool transparent_pointers = synthetic_array_member == false;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *clang_ast = GetClangAST();
375f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type = GetClangType();
376f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t child_clang_type;
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast,
378427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                  GetName().GetCString(),
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  clang_type,
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  idx,
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  transparent_pointers,
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  omit_empty_base_classes,
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_name_str,
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_byte_size,
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_byte_offset,
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_bitfield_bit_size,
387bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                                  child_bitfield_bit_offset,
38800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                  child_is_base_class,
38900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                  child_is_deref_of_parent);
3909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton    if (child_clang_type && child_byte_size)
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (synthetic_index)
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            child_byte_offset += child_byte_size * synthetic_index;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString child_name;
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!child_name_str.empty())
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            child_name.SetCString (child_name_str.c_str());
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        valobj_sp.reset (new ValueObjectChild (this,
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               clang_ast,
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_clang_type,
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_name,
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_byte_size,
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_byte_offset,
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_bitfield_bit_size,
406bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                               child_bitfield_bit_offset,
40700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                               child_is_base_class,
40800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                               child_is_deref_of_parent));
409427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (m_pointers_point_to_load_addrs)
410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            valobj_sp->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs);
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return valobj_sp;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSummaryAsCString (ExecutionContextScope *exe_scope)
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (UpdateValueIfNeeded (exe_scope))
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_summary_str.empty())
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
422f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            clang_type_t clang_type = GetClangType();
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // See if this is a pointer to a C string?
42503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (clang_type)
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
42703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                StreamString sstr;
428f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t elem_or_pointee_clang_type;
429f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetClangAST(),
431427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      &elem_or_pointee_clang_type));
43203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
433f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
434f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    ClangASTContext::IsCharType (elem_or_pointee_clang_type))
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
43603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    Process *process = exe_scope->CalculateProcess();
43703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (process != NULL)
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
439f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
44003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        lldb::AddressType cstr_address_type = eAddressTypeInvalid;
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
442f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        size_t cstr_len = 0;
443f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        if (type_flags.Test (ClangASTContext::eTypeIsArray))
444f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        {
445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            // We have an array
446f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            cstr_len = ClangASTContext::GetArraySize (clang_type);
447f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            cstr_address = GetAddressOf (cstr_address_type, true);
448f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        }
449f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        else
450f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        {
451f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            // We have a pointer
452f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            cstr_address = GetPointerValue (cstr_address_type, true);
453f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        }
45403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        if (cstr_address != LLDB_INVALID_ADDRESS)
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
45603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            DataExtractor data;
45703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            size_t bytes_read = 0;
45803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            std::vector<char> data_buffer;
45903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            Error error;
460f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            if (cstr_len > 0)
46103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            {
462f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                data_buffer.resize(cstr_len);
46303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost);
464f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), cstr_len, error);
46503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                if (bytes_read > 0)
46603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
46703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    sstr << '"';
4685c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                    data.Dump (&sstr,
4695c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               0,                 // Start offset in "data"
4705c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               eFormatChar,       // Print as characters
4715c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               1,                 // Size of item (1 byte for a char!)
4725c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               bytes_read,        // How many bytes to print?
4735c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               UINT32_MAX,        // num per line
4745c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               LLDB_INVALID_ADDRESS,// base address
4755c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               0,                 // bitfield bit size
4765c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               0);                // bitfield bit offset
47703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    sstr << '"';
47803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
47903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            }
48003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            else
48103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            {
48203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                const size_t k_max_buf_size = 256;
48303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data_buffer.resize (k_max_buf_size + 1);
48403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                // NULL terminate in case we don't get the entire C string
48503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data_buffer.back() = '\0';
4865c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton
4875c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                sstr << '"';
48803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
48903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost);
49003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0)
49103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
49203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    size_t len = strlen(&data_buffer.front());
49303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    if (len == 0)
49403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        break;
49503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    if (len > bytes_read)
49603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        len = bytes_read;
49703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
4985c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                    data.Dump (&sstr,
4995c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               0,                 // Start offset in "data"
5005c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               eFormatChar,       // Print as characters
5015c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               1,                 // Size of item (1 byte for a char!)
5025c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               len,               // How many bytes to print?
5035c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               UINT32_MAX,        // num per line
5045c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               LLDB_INVALID_ADDRESS,// base address
5055c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               0,                 // bitfield bit size
5065c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                               0);                // bitfield bit offset
5075c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton
50803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    if (len < k_max_buf_size)
50903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        break;
5105c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                    cstr_address += k_max_buf_size;
51103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
5125c9721abf957d95d3ccdb01596bbac42c112f863Greg Clayton                                sstr << '"';
51303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            }
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
51603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
51703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (sstr.GetSize() > 0)
51803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.assign (sstr.GetData(), sstr.GetSize());
51903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                }
52003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                else if (ClangASTContext::IsFunctionPointerType (clang_type))
52103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                {
52203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    lldb::AddressType func_ptr_address_type = eAddressTypeInvalid;
52303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true);
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
52703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        switch (func_ptr_address_type)
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
52903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeInvalid:
53003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeFile:
53103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            break;
53203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
53303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeLoad:
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
53503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                Address so_addr;
536eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                                Target *target = exe_scope->CalculateTarget();
537eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                                if (target && target->GetSectionLoadList().IsEmpty() == false)
53803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
539eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                                    if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
54003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    {
54103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        so_addr.Dump (&sstr,
54203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                      exe_scope,
54303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                      Address::DumpStyleResolvedDescription,
54403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                      Address::DumpStyleSectionNameOffset);
54503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    }
54603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
54803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            break;
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeHost:
55103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            break;
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
55303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    }
55403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (sstr.GetSize() > 0)
55503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    {
55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.assign (1, '(');
55703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.append (sstr.GetData(), sstr.GetSize());
55803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.append (1, ')');
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_summary_str.empty())
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_summary_str.c_str();
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5694ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char *
5704ae519666628cca07c194bf677163009cc2e5a8bJim InghamValueObject::GetObjectDescription (ExecutionContextScope *exe_scope)
5714ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{
5724ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    if (!m_object_desc_str.empty())
5734ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return m_object_desc_str.c_str();
5744ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
5754ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    if (!GetValueIsValid())
5764ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
5774ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
5784ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    Process *process = exe_scope->CalculateProcess();
579b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (process == NULL)
5804ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
581b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
582b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    StreamString s;
5834ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
584b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    lldb::LanguageType language = GetObjectRuntimeLanguage();
585b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
5864ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
5870e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    if (runtime == NULL)
5880e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    {
5890e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        // Aw, hell, if the things a pointer, let's try ObjC anyway...
5900e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        clang_type_t opaque_qual_type = GetClangType();
5910e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        if (opaque_qual_type != NULL)
5920e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        {
5930e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham            clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType());
5940e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham            if (qual_type->isAnyPointerType())
5950e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham                runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
5960e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        }
5970e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    }
5980e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham
599b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (runtime && runtime->GetObjectDescription(s, *this, exe_scope))
6004ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    {
6014ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        m_object_desc_str.append (s.GetData());
6024ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    }
603e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan
604e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    if (m_object_desc_str.empty())
605e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return NULL;
606e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    else
607e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return m_object_desc_str.c_str();
6084ae519666628cca07c194bf677163009cc2e5a8bJim Ingham}
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValueAsCString (ExecutionContextScope *exe_scope)
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If our byte size is zero this is an aggregate type that has children
614462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (UpdateValueIfNeeded(exe_scope))
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_value_str.empty())
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Value::ContextType context_type = m_value.GetContextType();
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (context_type)
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
6246916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeClangType:
6256916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeLLDBType:
6266916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeVariable:
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
628f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        clang_type_t clang_type = GetClangType ();
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (clang_type)
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString sstr;
63211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                            if (m_format == eFormatDefault)
63311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                m_format = ClangASTType::GetFormat(clang_type);
63411730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton
63511730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                            if (ClangASTType::DumpTypeValue (GetClangAST(),            // The clang AST
63611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             clang_type,               // The clang type to display
63711730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             &sstr,
63811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             m_format,                 // Format to display this type with
63911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             m_data,                   // Data to extract from
64011730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             0,                        // Byte offset into "m_data"
64111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetByteSize(),            // Byte size of item in "m_data"
64211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetBitfieldBitSize(),     // Bitfield bit size
64311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetBitfieldBitOffset()))  // Bitfield bit offset
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value_str.swap(sstr.GetString());
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value_str.clear();
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6516916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeRegisterInfo:
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info)
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString reg_sstr;
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_data.Dump(&reg_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_str.swap(reg_sstr.GetString());
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
66254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
66354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                default:
66454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    break;
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
66717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
66817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            if (!m_value_did_change && m_old_value_valid)
66917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            {
67017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // The value was gotten successfully, so we consider the
67117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // value as changed if the value string differs
67217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                SetValueDidChange (m_old_value_str != m_value_str);
67317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            }
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_value_str.empty())
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_str.c_str();
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68103e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t
682f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonValueObject::GetAddressOf (lldb::AddressType &address_type, bool scalar_is_load_address)
683f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
684f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
685f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
686f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeScalar:
687f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (scalar_is_load_address)
688f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = eAddressTypeLoad;
690f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
691f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
692f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
693f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
694f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeLoadAddress:
695f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeFileAddress:
696f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeHostAddress:
697f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
698f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = m_value.GetValueAddressType ();
699f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
700f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
701f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
702f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
703f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    address_type = eAddressTypeInvalid;
704f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return LLDB_INVALID_ADDRESS;
705f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t
70803e0f97cfa469792dd69b36f782d33a014225788Greg ClaytonValueObject::GetPointerValue (lldb::AddressType &address_type, bool scalar_is_load_address)
70903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
71003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    lldb::addr_t address = LLDB_INVALID_ADDRESS;
71103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    address_type = eAddressTypeInvalid;
712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
71303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
71403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeScalar:
71503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (scalar_is_load_address)
71603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
71703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
71803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = eAddressTypeLoad;
71903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
72003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
72103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
72203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeLoadAddress:
72303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeFileAddress:
72403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeHostAddress:
72503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
72603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            uint32_t data_offset = 0;
72703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_data.GetPointer(&data_offset);
72803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = m_value.GetValueAddressType();
72903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (address_type == eAddressTypeInvalid)
73003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                address_type = eAddressTypeLoad;
73103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
73203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
73303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
734427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
735427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (m_pointers_point_to_load_addrs)
736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        address_type = eAddressTypeLoad;
737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
73803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return address;
73903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
74003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueFromCString (ExecutionContextScope *exe_scope, const char *value_str)
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our value is up to date first so that our location and location
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type is valid.
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!UpdateValueIfNeeded(exe_scope))
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
750462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *end = NULL;
753bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    const size_t byte_size = GetByteSize();
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(unsigned long long))
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            unsigned long long ull_val = strtoull(value_str, &end, 0);
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value = ull_val;
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(long long))
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            long long sll_val = strtoll(value_str, &end, 0);
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value = sll_val;
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const off_t byte_offset = GetByteOffset();
79454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size));
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst != NULL)
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We are decoding a float into host byte order below, so make
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // sure m_data knows what it contains.
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_data.SetByteOrder(eByteOrderHost);
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue (
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        GetClangAST(),
802462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                        GetClangType(),
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        value_str,
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        dst,
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        byte_size);
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (converted_byte_size == byte_size)
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we have made it here the value is in m_data and we should write it
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out to the target
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write ();
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write ()
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the update ID so the next time we try and read the value
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we try and read it again.
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_update_id = 0;
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: when Value has a method to write a value back, call it from here.
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
838b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType
839b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage ()
840b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
841f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t opaque_qual_type = GetClangType();
842b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (opaque_qual_type == NULL)
843b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        return lldb::eLanguageTypeC;
844b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
845b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    // If the type is a reference, then resolve it to what it refers to first:
846b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType());
847b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (qual_type->isAnyPointerType())
848b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
849b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (qual_type->isObjCObjectPointerType())
850b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
851b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
852b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        clang::QualType pointee_type (qual_type->getPointeeType());
853b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->getCXXRecordDeclForPointerType() != NULL)
854b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
855b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCObjectOrInterfaceType())
856b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
857b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCClassType())
858b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
859b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
860b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    else
861b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
862b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (ClangASTContext::IsObjCClassType (opaque_qual_type))
863b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
864974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        if (ClangASTContext::IsCXXClassType (opaque_qual_type))
865b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
866b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
867b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
868b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    return lldb::eLanguageTypeC;
869b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
870b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::AddSyntheticChild (const ConstString &key, ValueObjectSP& valobj_sp)
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_synthetic_children[key] = valobj_sp;
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::map<ConstString, ValueObjectSP>::const_iterator pos = m_synthetic_children.find (key);
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_synthetic_children.end())
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = pos->second;
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType ()
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
890462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerType (GetClangType());
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType ()
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
898462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerOrReferenceType(GetClangType());
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsPointerType ())
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char index_str[64];
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(index_str, sizeof(index_str), "[%i]", index);
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString index_const_str(index_str);
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already created a synthetic array member in this
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // valid object. If we have we will re-use it.
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = GetSyntheticChild (index_const_str);
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!synthetic_child_sp)
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We haven't made a synthetic array member for INDEX yet, so
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // lets make one and cache it for any future reference.
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            synthetic_child_sp = CreateChildAtIndex(0, true, index);
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Cache the value if we got one back...
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (synthetic_child_sp)
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                AddSyntheticChild(index_const_str, synthetic_child_sp);
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
926642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
927642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghambool
928642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamValueObject::SetDynamicValue ()
929642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
930642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    if (!IsPointerOrReferenceType())
931642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return false;
932642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
933642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    // Check that the runtime class is correct for determining the most specific class.
934642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    // If it is a C++ class, see if it is dynamic:
935b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
936642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    return true;
937642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
93866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
93900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool
94000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s)
94100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
94200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (IsBaseClass())
94300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
94400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool parent_had_base_class = m_parent && m_parent->GetBaseClassPath (s);
94500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        clang_type_t clang_type = GetClangType();
94600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        std::string cxx_class_name;
94700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name);
94800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (this_had_base_class)
94900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        {
95000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (parent_had_base_class)
95100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString("::");
95200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            s.PutCString(cxx_class_name.c_str());
95300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        }
95400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        return parent_had_base_class || this_had_base_class;
95500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
95600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return false;
95700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
95800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
95900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
96000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject *
96100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent()
96200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
96300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (m_parent)
96400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
96500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (m_parent->IsBaseClass())
96600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            return m_parent->GetNonBaseClassParent();
96700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        else
96800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            return m_parent;
96900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
97000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return NULL;
97100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
97266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
97366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid
974b01000fd063629facd45044f137446fb748ee179Greg ClaytonValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes)
975bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
97600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    const bool is_deref_of_parent = IsDereferenceOfParent ();
97700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
97800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (is_deref_of_parent)
97900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        s.PutCString("*(");
98000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
981bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (m_parent)
982b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_parent->GetExpressionPath (s, qualify_cxx_base_classes);
98300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
98400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (!IsBaseClass())
98500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
98600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (!is_deref_of_parent)
987bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
98800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            ValueObject *non_base_class_parent = GetNonBaseClassParent();
98900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (non_base_class_parent)
990bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
99100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType();
99200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (non_base_class_parent_clang_type)
99300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
99400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL);
99500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
99600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer)
99700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    {
99800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("->");
99900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
100000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) &&
100100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray))
100200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    {
100300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutChar('.');
100400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
100500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
1006bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
100700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
100800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            const char *name = GetName().GetCString();
100900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (name)
1010bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
101100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (qualify_cxx_base_classes)
101200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
101300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    if (GetBaseClassPath (s))
101400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("::");
101500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
101600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString(name);
1017bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1018bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
1019bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1020bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
102100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (is_deref_of_parent)
102200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        s.PutChar(')');
1023bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1024bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1025bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid
102666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject
102766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton(
102866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    Stream &s,
102966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ExecutionContextScope *exe_scope,
103066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ValueObject *valobj,
103166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    const char *root_valobj_name,
103266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t ptr_depth,
103366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t curr_depth,
103466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t max_depth,
103566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_types,
103666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_location,
103766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool use_objc,
1038bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool scope_already_checked,
1039bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool flat_output
104066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton)
104166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
104266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    if (valobj)
104366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
1044bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = valobj->GetClangType();
1045bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1046f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
1047bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *err_cstr = NULL;
1048f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
1049f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
1050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1051bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const bool print_valobj = flat_output == false || has_value;
1052bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1053bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (print_valobj)
105466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1055bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (show_location)
1056bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1057bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf("%s: ", valobj->GetLocationAsCString(exe_scope));
1058bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
105966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1060bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.Indent();
106166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1062a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            // Always show the type for the top level items.
106300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (show_types || (curr_depth == 0 && !flat_output))
1064427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>"));
106566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
106666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (flat_output)
1068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1069b01000fd063629facd45044f137446fb748ee179Greg Clayton                // If we are showing types, also qualify the C++ base classes
1070b01000fd063629facd45044f137446fb748ee179Greg Clayton                const bool qualify_cxx_base_classes = show_types;
1071b01000fd063629facd45044f137446fb748ee179Greg Clayton                valobj->GetExpressionPath(s, qualify_cxx_base_classes);
1072bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString(" =");
1073bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else
1075bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
1077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf ("%s =", name_cstr);
1078bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1079bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1080bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (!scope_already_checked && !valobj->IsInScope(exe_scope->CalculateStackFrame()))
1081bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1082bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                err_cstr = "error: out of scope";
1083bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
108466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
108566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1086bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *val_cstr = NULL;
1087bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1088bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (err_cstr == NULL)
1089bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
1090bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            val_cstr = valobj->GetValueAsCString(exe_scope);
1091bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            err_cstr = valobj->GetError().AsCString();
1092bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
109366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
109466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        if (err_cstr)
109566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1096a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            s.Printf (" error: %s\n", err_cstr);
109766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
109866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        else
109966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
1101bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (print_valobj)
1102bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1103bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *sum_cstr = valobj->GetSummaryAsCString(exe_scope);
110466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1105bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (val_cstr)
1106bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.Printf(" %s", val_cstr);
110766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1108bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (sum_cstr)
1109bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.Printf(" %s", sum_cstr);
1110bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1111bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (use_objc)
1112bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
1113bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    const char *object_desc = valobj->GetObjectDescription(exe_scope);
1114bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (object_desc)
1115bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        s.Printf(" %s\n", object_desc);
1116bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
1117e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan                        s.Printf (" [no Objective-C description available]\n");
1118bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    return;
1119bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                }
112066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
112166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
112266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            if (curr_depth < max_depth)
112366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
1124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We will show children for all concrete types. We won't show
1125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // pointer contents unless a pointer depth has been specified.
1126f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We won't reference contents unless the reference is the
1127f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // root object (depth of zero).
1128f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                bool print_children = true;
1129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // Use a new temporary pointer depth in case we override the
1131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // current pointer depth below...
1132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                uint32_t curr_ptr_depth = ptr_depth;
1133f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
1135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (is_ptr || is_ref)
1136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
1137f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer or reference whose value is an address.
1138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // Make sure that address is not NULL
1139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    lldb::AddressType ptr_address_type;
1140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (valobj->GetPointerValue (ptr_address_type, true) == 0)
1141f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
1142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    else if (is_ref && curr_depth == 0)
1144f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
1145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // If this is the root object (depth is zero) that we are showing
1146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // and it is a reference, and no pointer depth has been supplied
1147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // print out what it references. Don't do this at deeper depths
1148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // otherwise we can end up with infinite recursion...
1149f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        curr_ptr_depth = 1;
1150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
1151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (curr_ptr_depth == 0)
1153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
1154f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
115566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1156f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (print_children)
115766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
1158bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    const uint32_t num_children = valobj->GetNumChildren();
1159bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (num_children)
116066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    {
1161bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (flat_output)
116266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        {
1163bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
1164bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                s.EOL();
1165bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1166bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        else
1167bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1168bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
11693f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                                s.PutCString(is_ref ? ": {\n" : " {\n");
1170bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentMore();
1171bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1172bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1173bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        for (uint32_t idx=0; idx<num_children; ++idx)
1174bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1175bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            ValueObjectSP child_sp(valobj->GetChildAtIndex(idx, true));
1176bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (child_sp.get())
1177bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            {
1178bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                DumpValueObject (s,
1179bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 exe_scope,
1180bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 child_sp.get(),
1181bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 NULL,
1182f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                 (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
1183bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 curr_depth + 1,
1184bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 max_depth,
1185bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_types,
1186bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_location,
1187bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 false,
1188bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 true,
1189bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 flat_output);
1190bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            }
1191bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1192bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1193bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (!flat_output)
1194bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1195bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentLess();
1196bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.Indent("}\n");
119766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        }
119866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    }
1199bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else if (has_children)
1200bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
1201bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        // Aggregate, no children...
1202bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
1203f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            s.PutCString(" {}\n");
1204bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
1205bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
1206bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
1207bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
1208bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.EOL();
1209bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
1210bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
121166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
1212bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                else
1213bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
121466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    s.EOL();
121566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
121666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
121766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            else
121866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
1219bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (has_children && print_valobj)
122066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
1221bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutCString("{...}\n");
122266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
122366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
122466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
122566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
122666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
122766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP
1230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObject::CreateConstantValue (ExecutionContextScope *exe_scope, const ConstString &name)
1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueObjectSP valobj_sp;
1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (UpdateValueIfNeeded(exe_scope) && m_error.Success())
1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ExecutionContext exe_ctx;
1237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        exe_scope->CalculateExecutionContext(exe_ctx);
1238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *ast = GetClangAST ();
1240427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1241427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        DataExtractor data;
1242427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        data.SetByteOrder (m_data.GetByteOrder());
1243427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        data.SetAddressByteSize(m_data.GetAddressByteSize());
1244427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0);
1246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        valobj_sp.reset (new ValueObjectConstResult (ast,
1248427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     GetClangType(),
1249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name,
1250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     data));
1251427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
1253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        valobj_sp.reset (new ValueObjectConstResult (m_error));
1255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
1257427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1258427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1259427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
1260bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error)
1261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1262427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ValueObjectSP valobj_sp;
1263c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const bool is_pointer_type = IsPointerType();
1264c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (is_pointer_type)
1265427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1266427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool omit_empty_base_classes = true;
1267427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1268427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        std::string child_name_str;
1269427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_byte_size = 0;
1270427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        int32_t child_byte_offset = 0;
1271427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_size = 0;
1272427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_offset = 0;
1273427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool child_is_base_class = false;
127400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool child_is_deref_of_parent = false;
1275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const bool transparent_pointers = false;
1276427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *clang_ast = GetClangAST();
1277427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t clang_type = GetClangType();
1278427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t child_clang_type;
1279427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast,
1280427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetName().GetCString(),
1281427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      clang_type,
1282427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      0,
1283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      transparent_pointers,
1284427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      omit_empty_base_classes,
1285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_name_str,
1286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_size,
1287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_offset,
1288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_size,
1289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_offset,
129000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_base_class,
129100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_deref_of_parent);
1292a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (child_clang_type && child_byte_size)
1293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
1294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ConstString child_name;
1295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (!child_name_str.empty())
1296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                child_name.SetCString (child_name_str.c_str());
1297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            valobj_sp.reset (new ValueObjectChild (this,
1299427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   clang_ast,
1300427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_clang_type,
1301427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_name,
1302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_byte_size,
1303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_byte_offset,
1304427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_bitfield_bit_size,
1305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_bitfield_bit_offset,
130600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                   child_is_base_class,
130700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                   child_is_deref_of_parent));
1308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
1309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1310c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1311c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (valobj_sp)
1312c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
1313c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        error.Clear();
1314c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
1315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
1316427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1317c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        StreamString strm;
1318b01000fd063629facd45044f137446fb748ee179Greg Clayton        GetExpressionPath(strm, true);
1319c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1320c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        if (is_pointer_type)
1321c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
1322c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        else
1323c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1326427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
1327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1329c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    lldb::ValueObjectSP
1330c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error)
1331427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1332427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ValueObjectSP valobj_sp;
1333427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::AddressType address_type = eAddressTypeInvalid;
1334427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const bool scalar_is_load_address = false;
1335427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address);
1336c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    error.Clear();
1337427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (addr != LLDB_INVALID_ADDRESS)
1338427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1339427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        switch (address_type)
1340427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
1341c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        default:
1342427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeInvalid:
1343c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
1344c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                StreamString expr_path_strm;
1345b01000fd063629facd45044f137446fb748ee179Greg Clayton                GetExpressionPath(expr_path_strm, true);
1346c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
1347c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
1348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
1349c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeFile:
1351427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeLoad:
1352427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeHost:
1353427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
1354427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang::ASTContext *ast = GetClangAST();
1355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang_type_t clang_type = GetClangType();
1356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (ast && clang_type)
1357427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                {
1358427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    std::string name (1, '&');
1359427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    name.append (m_name.AsCString(""));
1360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    valobj_sp.reset (new ValueObjectConstResult (ast,
1361427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 ClangASTContext::CreatePointerType (ast, clang_type),
1362427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 ConstString (name.c_str()),
1363427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 addr,
13646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                 eAddressTypeInvalid,
1365427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 m_data.GetAddressByteSize()));
1366427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                }
1367427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
1368427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
1369427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
1370427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
1372427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1373427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1374