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