ValueObjectVariable.cpp revision 24943d2ee8bfaa7cf5893e4709143924157a5c1e
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"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::ValueObjectVariable (lldb::VariableSP &var_sp) :
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObject(),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_variable_sp(var_sp)
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Do not attempt to construct one of these objects with no variable!
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (m_variable_sp.get() != NULL);
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = var_sp->GetName();
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::~ValueObjectVariable()
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetOpaqueClangQualType ()
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = m_variable_sp->GetType();
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_type)
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return var_type->GetOpaqueClangQualType();
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetTypeName()
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type * var_type = m_variable_sp->GetType();
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_type)
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return var_type->GetName();
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString empty_type_name;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return empty_type_name;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::CalculateNumChildren()
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = m_variable_sp->GetType();
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_type)
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return var_type->GetNumChildren(true);
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclang::ASTContext *
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetClangAST ()
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_variable_sp->GetType()->GetClangAST();
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetByteSize()
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_variable_sp->GetType()->GetByteSize();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::ValueType
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::GetValueType() const
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_variable_sp)
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_variable_sp->GetScope();
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return lldb::eValueTypeInvalid;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::UpdateValue (ExecutionContextScope *exe_scope)
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetValueIsValid (false);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error.Clear();
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Variable *variable = m_variable_sp.get();
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DWARFExpression &expr = variable->LocationExpression();
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value old_value(m_value);
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ExecutionContext exe_ctx (exe_scope);
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (expr.Evaluate (&exe_ctx, GetClangAST(), NULL, m_value, &m_error))
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value.SetContext(Value::eContextTypeDCVariable, variable);
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Value::ValueType value_type = m_value.GetValueType();
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (value_type)
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(!"Unhandled expression result value kind...");
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Value::eValueTypeScalar:
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The variable value is in the Scalar value inside the m_value.
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We can point our m_data right to it.
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_error = m_value.GetValueAsData (&exe_ctx, GetClangAST(), m_data, 0);
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Value::eValueTypeFileAddress:
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Value::eValueTypeLoadAddress:
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Value::eValueTypeHostAddress:
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The DWARF expression result was an address in the inferior
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // process. If this variable is an aggregate type, we just need
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // the address as the main value as all child variable objects
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // will rely upon this location and add an offset and then read
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // their own values as needed. If this variable is a simple
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // type, we read all data for it into m_data.
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Make sure this type has a value before we try and read it
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ClangASTContext::IsAggregateType (GetOpaqueClangQualType()))
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // this value object represents an aggregate type whose
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // children have values, but this object does not. So we
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // say we are changed if our location has changed.
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetValueDidChange (value_type != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar());
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Copy the Value and set the context to use our Variable
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // so it can extract read its value into m_data appropriately
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Value value(m_value);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                value.SetContext(Value::eContextTypeDCVariable, variable);
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_error = value.GetValueAsData(&exe_ctx, GetClangAST(), m_data, 0);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetValueIsValid (m_error.Success());
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectVariable::IsInScope (StackFrame *frame)
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_variable_sp->IsInScope (frame);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168