1 //===-- ValueObjectRegister.cpp ---------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 #include "lldb/Core/ValueObjectRegister.h"
15 // Other libraries and framework includes
17 #include "lldb/Core/Module.h"
18 #include "lldb/Symbol/ClangASTType.h"
19 #include "lldb/Symbol/ClangASTContext.h"
20 #include "lldb/Symbol/TypeList.h"
21 #include "lldb/Target/ExecutionContext.h"
22 #include "lldb/Target/Process.h"
23 #include "lldb/Target/RegisterContext.h"
24 #include "lldb/Target/Target.h"
25 #include "lldb/Target/Thread.h"
28 using namespace lldb_private;
30 #pragma mark ValueObjectRegisterContext
32 ValueObjectRegisterContext::ValueObjectRegisterContext (ValueObject &parent, RegisterContextSP ®_ctx) :
34 m_reg_ctx_sp (reg_ctx)
37 m_name.SetCString("Registers");
38 SetValueIsValid (true);
41 ValueObjectRegisterContext::~ValueObjectRegisterContext()
46 ValueObjectRegisterContext::GetClangTypeImpl ()
48 return ClangASTType();
52 ValueObjectRegisterContext::GetTypeName()
58 ValueObjectRegisterContext::GetQualifiedTypeName()
64 ValueObjectRegisterContext::CalculateNumChildren()
66 return m_reg_ctx_sp->GetRegisterSetCount();
70 ValueObjectRegisterContext::GetByteSize()
76 ValueObjectRegisterContext::UpdateValue ()
79 ExecutionContext exe_ctx(GetExecutionContextRef());
80 StackFrame *frame = exe_ctx.GetFramePtr();
82 m_reg_ctx_sp = frame->GetRegisterContext();
86 if (m_reg_ctx_sp.get() == NULL)
88 SetValueIsValid (false);
89 m_error.SetErrorToGenericError();
92 SetValueIsValid (true);
94 return m_error.Success();
98 ValueObjectRegisterContext::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index)
100 ValueObject *new_valobj = NULL;
102 const size_t num_children = GetNumChildren();
103 if (idx < num_children)
105 ExecutionContext exe_ctx(GetExecutionContextRef());
106 new_valobj = new ValueObjectRegisterSet(exe_ctx.GetBestExecutionContextScope(), m_reg_ctx_sp, idx);
114 #pragma mark ValueObjectRegisterSet
117 ValueObjectRegisterSet::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, uint32_t set_idx)
119 return (new ValueObjectRegisterSet (exe_scope, reg_ctx_sp, set_idx))->GetSP();
123 ValueObjectRegisterSet::ValueObjectRegisterSet (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx, uint32_t reg_set_idx) :
124 ValueObject (exe_scope),
125 m_reg_ctx_sp (reg_ctx),
127 m_reg_set_idx (reg_set_idx)
130 m_reg_set = reg_ctx->GetRegisterSet(m_reg_set_idx);
133 m_name.SetCString (m_reg_set->name);
137 ValueObjectRegisterSet::~ValueObjectRegisterSet()
142 ValueObjectRegisterSet::GetClangTypeImpl ()
144 return ClangASTType();
148 ValueObjectRegisterSet::GetTypeName()
150 return ConstString();
154 ValueObjectRegisterSet::GetQualifiedTypeName()
156 return ConstString();
160 ValueObjectRegisterSet::CalculateNumChildren()
162 const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet(m_reg_set_idx);
164 return reg_set->num_registers;
169 ValueObjectRegisterSet::GetByteSize()
175 ValueObjectRegisterSet::UpdateValue ()
178 SetValueDidChange (false);
179 ExecutionContext exe_ctx(GetExecutionContextRef());
180 StackFrame *frame = exe_ctx.GetFramePtr();
182 m_reg_ctx_sp.reset();
185 m_reg_ctx_sp = frame->GetRegisterContext ();
188 const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet (m_reg_set_idx);
190 m_reg_ctx_sp.reset();
191 else if (m_reg_set != reg_set)
193 SetValueDidChange (true);
194 m_name.SetCString(reg_set->name);
200 SetValueIsValid (true);
204 SetValueIsValid (false);
205 m_error.SetErrorToGenericError ();
208 return m_error.Success();
213 ValueObjectRegisterSet::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index)
215 ValueObject *valobj = NULL;
216 if (m_reg_ctx_sp && m_reg_set)
218 const size_t num_children = GetNumChildren();
219 if (idx < num_children)
220 valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, m_reg_set->registers[idx]);
226 ValueObjectRegisterSet::GetChildMemberWithName (const ConstString &name, bool can_create)
228 ValueObject *valobj = NULL;
229 if (m_reg_ctx_sp && m_reg_set)
231 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
232 if (reg_info != NULL)
233 valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, reg_info->kinds[eRegisterKindLLDB]);
236 return valobj->GetSP();
238 return ValueObjectSP();
242 ValueObjectRegisterSet::GetIndexOfChildWithName (const ConstString &name)
244 if (m_reg_ctx_sp && m_reg_set)
246 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
247 if (reg_info != NULL)
248 return reg_info->kinds[eRegisterKindLLDB];
254 #pragma mark ValueObjectRegister
257 ValueObjectRegister::ConstructObject (uint32_t reg_num)
259 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoAtIndex (reg_num);
262 m_reg_info = *reg_info;
264 m_name.SetCString(reg_info->name);
265 else if (reg_info->alt_name)
266 m_name.SetCString(reg_info->alt_name);
270 ValueObjectRegister::ValueObjectRegister (ValueObject &parent, lldb::RegisterContextSP ®_ctx_sp, uint32_t reg_num) :
271 ValueObject (parent),
272 m_reg_ctx_sp (reg_ctx_sp),
278 assert (reg_ctx_sp.get());
279 ConstructObject(reg_num);
283 ValueObjectRegister::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, uint32_t reg_num)
285 return (new ValueObjectRegister (exe_scope, reg_ctx_sp, reg_num))->GetSP();
288 ValueObjectRegister::ValueObjectRegister (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx, uint32_t reg_num) :
289 ValueObject (exe_scope),
290 m_reg_ctx_sp (reg_ctx),
297 ConstructObject(reg_num);
300 ValueObjectRegister::~ValueObjectRegister()
305 ValueObjectRegister::GetClangTypeImpl ()
307 if (!m_clang_type.IsValid())
309 ExecutionContext exe_ctx (GetExecutionContextRef());
310 Target *target = exe_ctx.GetTargetPtr();
313 Module *exe_module = target->GetExecutableModulePointer();
316 m_clang_type = exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize (m_reg_info.encoding,
317 m_reg_info.byte_size * 8);
325 ValueObjectRegister::GetTypeName()
327 if (m_type_name.IsEmpty())
328 m_type_name = GetClangType().GetConstTypeName ();
333 ValueObjectRegister::CalculateNumChildren()
335 return GetClangType().GetNumChildren(true);
339 ValueObjectRegister::GetByteSize()
341 return m_reg_info.byte_size;
345 ValueObjectRegister::UpdateValue ()
348 ExecutionContext exe_ctx(GetExecutionContextRef());
349 StackFrame *frame = exe_ctx.GetFramePtr();
352 m_reg_ctx_sp.reset();
359 if (m_reg_ctx_sp->ReadRegister (&m_reg_info, m_reg_value))
361 if (m_reg_value.GetData (m_data))
363 Process *process = exe_ctx.GetProcessPtr();
365 m_data.SetAddressByteSize(process->GetAddressByteSize());
366 m_value.SetContext(Value::eContextTypeRegisterInfo, (void *)&m_reg_info);
367 m_value.SetValueType(Value::eValueTypeHostAddress);
368 m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
369 SetValueIsValid (true);
375 SetValueIsValid (false);
376 m_error.SetErrorToGenericError ();
381 ValueObjectRegister::SetValueFromCString (const char *value_str, Error& error)
383 // The new value will be in the m_data. Copy that into our register value.
384 error = m_reg_value.SetValueFromCString (&m_reg_info, value_str);
387 if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
400 ValueObjectRegister::SetData (DataExtractor &data, Error &error)
402 error = m_reg_value.SetValueFromData(&m_reg_info, data, 0, false);
405 if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
418 ValueObjectRegister::ResolveValue (Scalar &scalar)
420 if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything
421 return m_reg_value.GetScalarValue(scalar);
426 ValueObjectRegister::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
428 s.Printf("$%s", m_reg_info.name);