124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ValueObjectVariable.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
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectVariable.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata#include "lldb/Core/RegisterValue.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
25801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton#include "lldb/Symbol/SymbolContextScope.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Inghamlldb::ValueObjectSP
3947da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectVariable::Create (ExecutionContextScope *exe_scope, const lldb::VariableSP &var_sp)
4047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{
4147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return (new ValueObjectVariable (exe_scope, var_sp))->GetSP();
4247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham}
4347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
44fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectVariable::ValueObjectVariable (ExecutionContextScope *exe_scope, const lldb::VariableSP &var_sp) :
45fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ValueObject(exe_scope),
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_variable_sp(var_sp)
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Do not attempt to construct one of these objects with no variable!
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (m_variable_sp.get() != NULL);
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = var_sp->GetName();
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::~ValueObjectVariable()
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
58931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectVariable::GetClangTypeImpl ()
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = m_variable_sp->GetType();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_type)
62b01000fd063629facd45044f137446fb748ee179Greg Clayton        return var_type->GetClangForwardType();
6352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetTypeName()
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type * var_type = m_variable_sp->GetType();
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_type)
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return var_type->GetName();
72dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return ConstString();
73dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton}
74dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
75dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonConstString
76dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonValueObjectVariable::GetQualifiedTypeName()
77dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{
78dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    Type * var_type = m_variable_sp->GetType();
79dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    if (var_type)
80dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        return var_type->GetQualifiedName();
81dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return ConstString();
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::CalculateNumChildren()
86931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{
8752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType type(GetClangType());
88931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
89931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    if (!type.IsValid())
90931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        return 0;
91931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
92931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    const bool omit_empty_base_classes = true;
9352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return type.GetNumChildren(omit_empty_base_classes);
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetByteSize()
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType type(GetClangType());
100931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
101931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    if (!type.IsValid())
102931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        return 0;
103931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
10452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return type.GetByteSize();
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::ValueType
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetValueType() const
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_variable_sp)
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_variable_sp->GetScope();
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return lldb::eValueTypeInvalid;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectVariable::UpdateValue ()
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetValueIsValid (false);
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error.Clear();
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Variable *variable = m_variable_sp.get();
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression &expr = variable->LocationExpression();
1231e30afd4c299debbd421add473668a0de580e94cGreg Clayton
12482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (variable->GetLocationIsConstantValueData())
125178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
12682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        // expr doesn't contain DWARF bytes, it contains the constant variable
12782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        // value bytes themselves...
12882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (expr.GetExpressionData(m_data))
12982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            m_value.SetContext(Value::eContextTypeVariable, variable);
13082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        else
13182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            m_error.SetErrorString ("empty constant data");
13210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        // constant bytes can't be edited - sorry
13310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        m_resolved_value.SetContext(Value::eContextTypeInvalid, NULL);
134178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
13582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    else
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
138b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        ExecutionContext exe_ctx (GetExecutionContextRef());
13982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
140567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Target *target = exe_ctx.GetTargetPtr();
141567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (target)
14282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        {
143567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            m_data.SetByteOrder(target->GetArchitecture().GetByteOrder());
144567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
14582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        }
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (expr.IsLocationList())
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            SymbolContext sc;
15082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            variable->CalculateSymbolContext (&sc);
15182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            if (sc.function)
152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                loclist_base_load_addr = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
15382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        }
15482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        Value old_value(m_value);
15552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (expr.Evaluate (&exe_ctx, NULL, NULL, NULL, loclist_base_load_addr, NULL, m_value, &m_error))
15682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        {
15710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            m_resolved_value = m_value;
15882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            m_value.SetContext(Value::eContextTypeVariable, variable);
15982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
16082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            Value::ValueType value_type = m_value.GetValueType();
161915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
162915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata            switch (value_type)
163915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata            {
164915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                case Value::eValueTypeFileAddress:
165915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    SetAddressTypeOfChildren(eAddressTypeFile);
166915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    break;
167915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                case Value::eValueTypeHostAddress:
168915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    SetAddressTypeOfChildren(eAddressTypeHost);
169915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    break;
170915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                case Value::eValueTypeLoadAddress:
171915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                case Value::eValueTypeScalar:
1727c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                case Value::eValueTypeVector:
17305e3b9efec15c300e50572112e179b9b5c74b2f9Greg Clayton                    SetAddressTypeOfChildren(eAddressTypeLoad);
174915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    break;
175915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata            }
17682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
17782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            switch (value_type)
178aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton            {
1790468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata            case Value::eValueTypeVector:
1800468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata                    // fall through
18182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case Value::eValueTypeScalar:
18282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // The variable value is in the Scalar value inside the m_value.
18382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // We can point our m_data right to it.
18452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_error = m_value.GetValueAsData (&exe_ctx, m_data, 0, GetModule().get());
18582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
18682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
18782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case Value::eValueTypeFileAddress:
18882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case Value::eValueTypeLoadAddress:
18982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case Value::eValueTypeHostAddress:
19082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // The DWARF expression result was an address in the inferior
19182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // process. If this variable is an aggregate type, we just need
19282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // the address as the main value as all child variable objects
19382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // will rely upon this location and add an offset and then read
19482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // their own values as needed. If this variable is a simple
19582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // type, we read all data for it into m_data.
19682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // Make sure this type has a value before we try and read it
19782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
19882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                // If we have a file address, convert it to a load address if we can.
199567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Process *process = exe_ctx.GetProcessPtr();
200567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (value_type == Value::eValueTypeFileAddress && process && process->IsAlive())
201aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                {
20282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    lldb::addr_t file_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
20382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    if (file_addr != LLDB_INVALID_ADDRESS)
204aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                    {
20582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        SymbolContext var_sc;
20682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        variable->CalculateSymbolContext(&var_sc);
20782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (var_sc.module_sp)
208aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                        {
20982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            ObjectFile *objfile = var_sc.module_sp->GetObjectFile();
21082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            if (objfile)
211aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                            {
21282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                Address so_addr(file_addr, objfile->GetSectionList());
213567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                lldb::addr_t load_addr = so_addr.GetLoadAddress (target);
21482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                if (load_addr != LLDB_INVALID_ADDRESS)
21582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                {
21682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                    m_value.SetValueType(Value::eValueTypeLoadAddress);
21782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                    m_value.GetScalar() = load_addr;
21882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                }
219aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                            }
220aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                        }
221aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                    }
222aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton                }
223aed588178b54d221ef1784862adeb5262d3612f2Greg Clayton
22452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetClangType().IsAggregateType())
22582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                {
22682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    // this value object represents an aggregate type whose
22782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    // children have values, but this object does not. So we
22882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    // say we are changed if our location has changed.
22982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    SetValueDidChange (value_type != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar());
23082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                }
23182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                else
23282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                {
23382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    // Copy the Value and set the context to use our Variable
23482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    // so it can extract read its value into m_data appropriately
23582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    Value value(m_value);
23682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    value.SetContext(Value::eContextTypeVariable, variable);
23752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    m_error = value.GetValueAsData(&exe_ctx, m_data, 0, GetModule().get());
23882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                }
23982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            SetValueIsValid (m_error.Success());
24382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        }
24410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        else
24510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        {
24610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            // could not find location, won't allow editing
24710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            m_resolved_value.SetContext(Value::eContextTypeInvalid, NULL);
24810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        }
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_error.Success();
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectVariable::IsInScope ()
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
258b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    const ExecutionContextRef &exe_ctx_ref = GetExecutionContextRef();
259b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    if (exe_ctx_ref.HasFrameRef())
260b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    {
261b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        ExecutionContext exe_ctx (exe_ctx_ref);
262b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        StackFrame *frame = exe_ctx.GetFramePtr();
263b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        if (frame)
264b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        {
265b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton            return m_variable_sp->IsInScope (frame);
266b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        }
267b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        else
268b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        {
269b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton            // This ValueObject had a frame at one time, but now we
270b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton            // can't locate it, so return false since we probably aren't
271b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton            // in scope.
272b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton            return false;
273b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        }
274b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    }
275b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    // We have a variable that wasn't tied to a frame, which
276b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    // means it is a global and is always in scope.
277b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    return true;
278fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonlldb::ModuleSP
282801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonValueObjectVariable::GetModule()
283801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
284801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    if (m_variable_sp)
285801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
286801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        SymbolContextScope *sc_scope = m_variable_sp->GetSymbolContextScope();
287801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        if (sc_scope)
288801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        {
2893508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            return sc_scope->CalculateSymbolContextModule();
290801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        }
291801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
2923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    return lldb::ModuleSP();
293801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
294801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
295915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataSymbolContextScope *
296915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataValueObjectVariable::GetSymbolContextScope()
297915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{
298915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    if (m_variable_sp)
299915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        return m_variable_sp->GetSymbolContextScope();
300915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    return NULL;
301915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata}
3020a19a1b9c25117854f226256805239d95153ed2dGreg Clayton
3030a19a1b9c25117854f226256805239d95153ed2dGreg Claytonbool
3040a19a1b9c25117854f226256805239d95153ed2dGreg ClaytonValueObjectVariable::GetDeclaration (Declaration &decl)
3050a19a1b9c25117854f226256805239d95153ed2dGreg Clayton{
3060a19a1b9c25117854f226256805239d95153ed2dGreg Clayton    if (m_variable_sp)
3070a19a1b9c25117854f226256805239d95153ed2dGreg Clayton    {
3080a19a1b9c25117854f226256805239d95153ed2dGreg Clayton        decl = m_variable_sp->GetDeclaration();
3090a19a1b9c25117854f226256805239d95153ed2dGreg Clayton        return true;
3100a19a1b9c25117854f226256805239d95153ed2dGreg Clayton    }
3110a19a1b9c25117854f226256805239d95153ed2dGreg Clayton    return false;
3120a19a1b9c25117854f226256805239d95153ed2dGreg Clayton}
31310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata
31410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granataconst char *
31510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico GranataValueObjectVariable::GetLocationAsCString ()
31610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata{
31784e098b268d09054ee8dcfe116e4f4953d0cc174Enrico Granata    if (m_resolved_value.GetContextType() == Value::eContextTypeRegisterInfo)
31884e098b268d09054ee8dcfe116e4f4953d0cc174Enrico Granata        return GetLocationAsCStringImpl(m_resolved_value,
31984e098b268d09054ee8dcfe116e4f4953d0cc174Enrico Granata                                        m_data);
32084e098b268d09054ee8dcfe116e4f4953d0cc174Enrico Granata    else
32184e098b268d09054ee8dcfe116e4f4953d0cc174Enrico Granata        return ValueObject::GetLocationAsCString();
32210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata}
32310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata
32410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granatabool
32510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico GranataValueObjectVariable::SetValueFromCString (const char *value_str, Error& error)
32610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata{
32710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    if (m_resolved_value.GetContextType() == Value::eContextTypeRegisterInfo)
32810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    {
32910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        RegisterInfo *reg_info = m_resolved_value.GetRegisterInfo();
33010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        ExecutionContext exe_ctx(GetExecutionContextRef());
33110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
33210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        RegisterValue reg_value;
33310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        if (!reg_info || !reg_ctx)
33410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        {
33510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            error.SetErrorString("unable to retrieve register info");
33610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return false;
33710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        }
33810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        error = reg_value.SetValueFromCString(reg_info, value_str);
33910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        if (error.Fail())
34010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return false;
34110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        if (reg_ctx->WriteRegister (reg_info, reg_value))
34210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        {
34310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            SetNeedsUpdate();
34410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return true;
34510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        }
34610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        else
34710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        {
34810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            error.SetErrorString("unable to write back to register");
34910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return false;
35010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        }
35110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    }
35210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    else
35310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        return ValueObject::SetValueFromCString(value_str, error);
35410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata}
35510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata
35610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granatabool
35710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico GranataValueObjectVariable::SetData (DataExtractor &data, Error &error)
35810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata{
35910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    if (m_resolved_value.GetContextType() == Value::eContextTypeRegisterInfo)
36010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    {
36110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        RegisterInfo *reg_info = m_resolved_value.GetRegisterInfo();
36210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        ExecutionContext exe_ctx(GetExecutionContextRef());
36310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
36410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        RegisterValue reg_value;
36510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        if (!reg_info || !reg_ctx)
36610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        {
36710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            error.SetErrorString("unable to retrieve register info");
36810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return false;
36910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        }
37010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        error = reg_value.SetValueFromData(reg_info, data, 0, false);
37110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        if (error.Fail())
37210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return false;
37310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        if (reg_ctx->WriteRegister (reg_info, reg_value))
37410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        {
37510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            SetNeedsUpdate();
37610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return true;
37710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        }
37810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        else
37910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        {
38010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            error.SetErrorString("unable to write back to register");
38110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata            return false;
38210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        }
38310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    }
38410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    else
38510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        return ValueObject::SetData(data, error);
38610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata}
387