124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ValueObjectRegister.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/ValueObjectRegister.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" 181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark ValueObjectRegisterContext 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterContext::ValueObjectRegisterContext (ValueObject &parent, RegisterContextSP ®_ctx) : 33bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton ValueObject (parent), 34fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp (reg_ctx) 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (reg_ctx); 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name.SetCString("Registers"); 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetValueIsValid (true); 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::~ValueObjectRegisterContext() 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 46931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectRegisterContext::GetClangTypeImpl () 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::GetTypeName() 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54940dd18789f83f28a618a9b588376c8bae557347Sean Callanan return ConstString(); 55940dd18789f83f28a618a9b588376c8bae557347Sean Callanan} 56940dd18789f83f28a618a9b588376c8bae557347Sean Callanan 57940dd18789f83f28a618a9b588376c8bae557347Sean CallananConstString 58940dd18789f83f28a618a9b588376c8bae557347Sean CallananValueObjectRegisterContext::GetQualifiedTypeName() 59940dd18789f83f28a618a9b588376c8bae557347Sean Callanan{ 60940dd18789f83f28a618a9b588376c8bae557347Sean Callanan return ConstString(); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::CalculateNumChildren() 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return m_reg_ctx_sp->GetRegisterSetCount(); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::GetByteSize() 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 76fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterContext::UpdateValue () 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error.Clear(); 79b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(GetExecutionContextRef()); 80b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame) 82fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp = frame->GetRegisterContext(); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 84fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp.reset(); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_reg_ctx_sp.get() == NULL) 87fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 88fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueIsValid (false); 89fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error.SetErrorToGenericError(); 90fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 91fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham else 92fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham SetValueIsValid (true); 93fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 94fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return m_error.Success(); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 9836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObjectRegisterContext::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index) 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *new_valobj = NULL; 10147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 10236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_children = GetNumChildren(); 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < num_children) 104b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton { 105b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(GetExecutionContextRef()); 106b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton new_valobj = new ValueObjectRegisterSet(exe_ctx.GetBestExecutionContextScope(), m_reg_ctx_sp, idx); 107b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton } 10847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 10947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return new_valobj; 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark - 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark ValueObjectRegisterSet 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11647da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 11747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectRegisterSet::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, uint32_t set_idx) 11847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{ 11947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return (new ValueObjectRegisterSet (exe_scope, reg_ctx_sp, set_idx))->GetSP(); 12047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham} 12147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 12247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::ValueObjectRegisterSet (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx, uint32_t reg_set_idx) : 124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ValueObject (exe_scope), 125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp (reg_ctx), 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_set (NULL), 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_set_idx (reg_set_idx) 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (reg_ctx); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_set = reg_ctx->GetRegisterSet(m_reg_set_idx); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_reg_set) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name.SetCString (m_reg_set->name); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::~ValueObjectRegisterSet() 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 142931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectRegisterSet::GetClangTypeImpl () 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::GetTypeName() 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ConstString(); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 153940dd18789f83f28a618a9b588376c8bae557347Sean CallananConstString 154940dd18789f83f28a618a9b588376c8bae557347Sean CallananValueObjectRegisterSet::GetQualifiedTypeName() 155940dd18789f83f28a618a9b588376c8bae557347Sean Callanan{ 156940dd18789f83f28a618a9b588376c8bae557347Sean Callanan return ConstString(); 157940dd18789f83f28a618a9b588376c8bae557347Sean Callanan} 158940dd18789f83f28a618a9b588376c8bae557347Sean Callanan 15936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::CalculateNumChildren() 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet(m_reg_set_idx); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_set) 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return reg_set->num_registers; 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::GetByteSize() 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::UpdateValue () 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error.Clear(); 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetValueDidChange (false); 179b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(GetExecutionContextRef()); 180b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame == NULL) 182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp.reset(); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp = frame->GetRegisterContext (); 186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_reg_ctx_sp) 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet (m_reg_set_idx); 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_set == NULL) 190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp.reset(); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (m_reg_set != reg_set) 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetValueDidChange (true); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_name.SetCString(reg_set->name); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_reg_ctx_sp) 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetValueIsValid (true); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetValueIsValid (false); 205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error.SetErrorToGenericError (); 20606cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata m_children.Clear(); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return m_error.Success(); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject * 21336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObjectRegisterSet::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index) 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21520e663f4da447f98b8edb25d68413ae0a71ce76bJohnny Chen ValueObject *valobj = NULL; 216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_reg_ctx_sp && m_reg_set) 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_children = GetNumChildren(); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < num_children) 22047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, m_reg_set->registers[idx]); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj; 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamlldb::ValueObjectSP 226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::GetChildMemberWithName (const ConstString &name, bool can_create) 227fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 22847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham ValueObject *valobj = NULL; 229fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_reg_ctx_sp && m_reg_set) 230fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 231fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString()); 232fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (reg_info != NULL) 23347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, reg_info->kinds[eRegisterKindLLDB]); 234fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 23547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham if (valobj) 23647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return valobj->GetSP(); 23747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham else 23847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return ValueObjectSP(); 239fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 240fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 24136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 242fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::GetIndexOfChildWithName (const ConstString &name) 243fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 244fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (m_reg_ctx_sp && m_reg_set) 245fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 246fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString()); 247fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (reg_info != NULL) 248fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return reg_info->kinds[eRegisterKindLLDB]; 249fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham } 250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return UINT32_MAX; 251fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark - 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark ValueObjectRegister 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamvoid 257061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonValueObjectRegister::ConstructObject (uint32_t reg_num) 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 259061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoAtIndex (reg_num); 260061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (reg_info) 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_info = *reg_info; 263061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (reg_info->name) 264061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_name.SetCString(reg_info->name); 265061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton else if (reg_info->alt_name) 266061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_name.SetCString(reg_info->alt_name); 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonValueObjectRegister::ValueObjectRegister (ValueObject &parent, lldb::RegisterContextSP ®_ctx_sp, uint32_t reg_num) : 271fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ValueObject (parent), 272061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_ctx_sp (reg_ctx_sp), 273061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_info (), 274061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_value (), 275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_type_name (), 27652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type () 277fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 278061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton assert (reg_ctx_sp.get()); 279061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ConstructObject(reg_num); 280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 28247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP 28347da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectRegister::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, uint32_t reg_num) 28447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{ 28547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham return (new ValueObjectRegister (exe_scope, reg_ctx_sp, reg_num))->GetSP(); 28647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham} 28747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham 288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegister::ValueObjectRegister (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx, uint32_t reg_num) : 289fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ValueObject (exe_scope), 290fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp (reg_ctx), 291061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_info (), 292061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_value (), 293fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_type_name (), 29452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type () 295fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{ 296fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham assert (reg_ctx); 297061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ConstructObject(reg_num); 298fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham} 299fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::~ValueObjectRegister() 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 305931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectRegister::GetClangTypeImpl () 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!m_clang_type.IsValid()) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 310289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 311289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton if (target) 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 313289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton Module *exe_module = target->GetExecutableModulePointer(); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module) 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_clang_type = exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize (m_reg_info.encoding, 317061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_info.byte_size * 8); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_clang_type; 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::GetTypeName() 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_type_name.IsEmpty()) 32852f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_type_name = GetClangType().GetConstTypeName (); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_type_name; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::CalculateNumChildren() 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetClangType().GetNumChildren(true); 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::GetByteSize() 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 341061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return m_reg_info.byte_size; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 344fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool 345fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegister::UpdateValue () 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error.Clear(); 348b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton ExecutionContext exe_ctx(GetExecutionContextRef()); 349b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 350061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (frame == NULL) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 352fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_reg_ctx_sp.reset(); 353061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_value.Clear(); 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (m_reg_ctx_sp) 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 359061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (m_reg_ctx_sp->ReadRegister (&m_reg_info, m_reg_value)) 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 361061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (m_reg_value.GetData (m_data)) 362061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton { 363f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 364f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process) 365f4124deeb9532044a38c0774ced872f2709347daGreg Clayton m_data.SetAddressByteSize(process->GetAddressByteSize()); 366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_value.SetContext(Value::eContextTypeRegisterInfo, (void *)&m_reg_info); 367061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_value.SetValueType(Value::eValueTypeHostAddress); 368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_value.GetScalar() = (uintptr_t)m_data.GetDataStart(); 369061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton SetValueIsValid (true); 370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return true; 371061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton } 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 374fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetValueIsValid (false); 376fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_error.SetErrorToGenericError (); 377fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham return false; 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Inghambool 381651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico GranataValueObjectRegister::SetValueFromCString (const char *value_str, Error& error) 382574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham{ 383574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham // The new value will be in the m_data. Copy that into our register value. 384651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata error = m_reg_value.SetValueFromCString (&m_reg_info, value_str); 385574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (error.Success()) 386574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 387574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value)) 388574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham { 389574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham SetNeedsUpdate(); 390574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return true; 391574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 392574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else 393574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return false; 394574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham } 395574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham else 396574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham return false; 397574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham} 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 399d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Claytonbool 400ab8e00e51475b9148626bfdf99549b7ffc3d046dSean CallananValueObjectRegister::SetData (DataExtractor &data, Error &error) 401ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan{ 402ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan error = m_reg_value.SetValueFromData(&m_reg_info, data, 0, false); 403ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (error.Success()) 404ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 405ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value)) 406ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan { 407ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan SetNeedsUpdate(); 408ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return true; 409ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 410ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan else 411ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 412ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan } 413ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan else 414ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan return false; 415ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan} 416ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan 417ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananbool 418d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg ClaytonValueObjectRegister::ResolveValue (Scalar &scalar) 419d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton{ 420d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything 421d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton return m_reg_value.GetScalarValue(scalar); 422d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton return false; 423d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton} 424d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton 4253e8388ccdc30231f86521e0d2657f80548e3daedSean Callananvoid 4263e8388ccdc30231f86521e0d2657f80548e3daedSean CallananValueObjectRegister::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat) 4273e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan{ 4283e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan s.Printf("$%s", m_reg_info.name); 4293e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan} 4303e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan 431d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton 432