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