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::GetDisplayTypeName()
64 ValueObjectRegisterContext::GetQualifiedTypeName()
70 ValueObjectRegisterContext::CalculateNumChildren()
72 return m_reg_ctx_sp->GetRegisterSetCount();
76 ValueObjectRegisterContext::GetByteSize()
82 ValueObjectRegisterContext::UpdateValue ()
85 ExecutionContext exe_ctx(GetExecutionContextRef());
86 StackFrame *frame = exe_ctx.GetFramePtr();
88 m_reg_ctx_sp = frame->GetRegisterContext();
92 if (m_reg_ctx_sp.get() == NULL)
94 SetValueIsValid (false);
95 m_error.SetErrorToGenericError();
98 SetValueIsValid (true);
100 return m_error.Success();
104 ValueObjectRegisterContext::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index)
106 ValueObject *new_valobj = NULL;
108 const size_t num_children = GetNumChildren();
109 if (idx < num_children)
111 ExecutionContext exe_ctx(GetExecutionContextRef());
112 new_valobj = new ValueObjectRegisterSet(exe_ctx.GetBestExecutionContextScope(), m_reg_ctx_sp, idx);
120 #pragma mark ValueObjectRegisterSet
123 ValueObjectRegisterSet::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, uint32_t set_idx)
125 return (new ValueObjectRegisterSet (exe_scope, reg_ctx_sp, set_idx))->GetSP();
129 ValueObjectRegisterSet::ValueObjectRegisterSet (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx, uint32_t reg_set_idx) :
130 ValueObject (exe_scope),
131 m_reg_ctx_sp (reg_ctx),
133 m_reg_set_idx (reg_set_idx)
136 m_reg_set = reg_ctx->GetRegisterSet(m_reg_set_idx);
139 m_name.SetCString (m_reg_set->name);
143 ValueObjectRegisterSet::~ValueObjectRegisterSet()
148 ValueObjectRegisterSet::GetClangTypeImpl ()
150 return ClangASTType();
154 ValueObjectRegisterSet::GetTypeName()
156 return ConstString();
160 ValueObjectRegisterSet::GetQualifiedTypeName()
162 return ConstString();
166 ValueObjectRegisterSet::CalculateNumChildren()
168 const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet(m_reg_set_idx);
170 return reg_set->num_registers;
175 ValueObjectRegisterSet::GetByteSize()
181 ValueObjectRegisterSet::UpdateValue ()
184 SetValueDidChange (false);
185 ExecutionContext exe_ctx(GetExecutionContextRef());
186 StackFrame *frame = exe_ctx.GetFramePtr();
188 m_reg_ctx_sp.reset();
191 m_reg_ctx_sp = frame->GetRegisterContext ();
194 const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet (m_reg_set_idx);
196 m_reg_ctx_sp.reset();
197 else if (m_reg_set != reg_set)
199 SetValueDidChange (true);
200 m_name.SetCString(reg_set->name);
206 SetValueIsValid (true);
210 SetValueIsValid (false);
211 m_error.SetErrorToGenericError ();
214 return m_error.Success();
219 ValueObjectRegisterSet::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index)
221 ValueObject *valobj = NULL;
222 if (m_reg_ctx_sp && m_reg_set)
224 const size_t num_children = GetNumChildren();
225 if (idx < num_children)
226 valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, m_reg_set->registers[idx]);
232 ValueObjectRegisterSet::GetChildMemberWithName (const ConstString &name, bool can_create)
234 ValueObject *valobj = NULL;
235 if (m_reg_ctx_sp && m_reg_set)
237 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
238 if (reg_info != NULL)
239 valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, reg_info->kinds[eRegisterKindLLDB]);
242 return valobj->GetSP();
244 return ValueObjectSP();
248 ValueObjectRegisterSet::GetIndexOfChildWithName (const ConstString &name)
250 if (m_reg_ctx_sp && m_reg_set)
252 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
253 if (reg_info != NULL)
254 return reg_info->kinds[eRegisterKindLLDB];
260 #pragma mark ValueObjectRegister
263 ValueObjectRegister::ConstructObject (uint32_t reg_num)
265 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoAtIndex (reg_num);
268 m_reg_info = *reg_info;
270 m_name.SetCString(reg_info->name);
271 else if (reg_info->alt_name)
272 m_name.SetCString(reg_info->alt_name);
276 ValueObjectRegister::ValueObjectRegister (ValueObject &parent, lldb::RegisterContextSP ®_ctx_sp, uint32_t reg_num) :
277 ValueObject (parent),
278 m_reg_ctx_sp (reg_ctx_sp),
284 assert (reg_ctx_sp.get());
285 ConstructObject(reg_num);
289 ValueObjectRegister::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, uint32_t reg_num)
291 return (new ValueObjectRegister (exe_scope, reg_ctx_sp, reg_num))->GetSP();
294 ValueObjectRegister::ValueObjectRegister (ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx, uint32_t reg_num) :
295 ValueObject (exe_scope),
296 m_reg_ctx_sp (reg_ctx),
303 ConstructObject(reg_num);
306 ValueObjectRegister::~ValueObjectRegister()
311 ValueObjectRegister::GetClangTypeImpl ()
313 if (!m_clang_type.IsValid())
315 ExecutionContext exe_ctx (GetExecutionContextRef());
316 Target *target = exe_ctx.GetTargetPtr();
319 Module *exe_module = target->GetExecutableModulePointer();
322 m_clang_type = exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize (m_reg_info.encoding,
323 m_reg_info.byte_size * 8);
331 ValueObjectRegister::GetTypeName()
333 if (m_type_name.IsEmpty())
334 m_type_name = GetClangType().GetConstTypeName ();
339 ValueObjectRegister::CalculateNumChildren()
341 return GetClangType().GetNumChildren(true);
345 ValueObjectRegister::GetByteSize()
347 return m_reg_info.byte_size;
351 ValueObjectRegister::UpdateValue ()
354 ExecutionContext exe_ctx(GetExecutionContextRef());
355 StackFrame *frame = exe_ctx.GetFramePtr();
358 m_reg_ctx_sp.reset();
365 if (m_reg_ctx_sp->ReadRegister (&m_reg_info, m_reg_value))
367 if (m_reg_value.GetData (m_data))
369 Process *process = exe_ctx.GetProcessPtr();
371 m_data.SetAddressByteSize(process->GetAddressByteSize());
372 m_value.SetContext(Value::eContextTypeRegisterInfo, (void *)&m_reg_info);
373 m_value.SetValueType(Value::eValueTypeHostAddress);
374 m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
375 SetValueIsValid (true);
381 SetValueIsValid (false);
382 m_error.SetErrorToGenericError ();
387 ValueObjectRegister::SetValueFromCString (const char *value_str, Error& error)
389 // The new value will be in the m_data. Copy that into our register value.
390 error = m_reg_value.SetValueFromCString (&m_reg_info, value_str);
393 if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
406 ValueObjectRegister::SetData (DataExtractor &data, Error &error)
408 error = m_reg_value.SetValueFromData(&m_reg_info, data, 0, false);
411 if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
424 ValueObjectRegister::ResolveValue (Scalar &scalar)
426 if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything
427 return m_reg_value.GetScalarValue(scalar);
432 ValueObjectRegister::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
434 s.Printf("$%s", m_reg_info.name);