blob: d96a5af0b0a165b40c0a6583ea5ee65397d3dd9c [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- ValueObjectRegister.cpp ---------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10
11#include "lldb/Core/ValueObjectRegister.h"
12
13// C Includes
14// C++ Includes
15// Other libraries and framework includes
16// Project includes
17#include "lldb/Core/Module.h"
Greg Clayton1674b122010-07-21 22:12:05 +000018#include "lldb/Symbol/ClangASTType.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#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"
26
27using namespace lldb;
28using namespace lldb_private;
29
30#pragma mark ValueObjectRegisterContext
31
Jim Inghamfa3a16a2011-03-31 00:19:25 +000032ValueObjectRegisterContext::ValueObjectRegisterContext (ValueObject &parent, RegisterContextSP &reg_ctx) :
Greg Claytonbf8e42b2010-10-14 22:52:14 +000033 ValueObject (parent),
Jim Inghamfa3a16a2011-03-31 00:19:25 +000034 m_reg_ctx_sp (reg_ctx)
Chris Lattner24943d22010-06-08 16:52:24 +000035{
36 assert (reg_ctx);
37 m_name.SetCString("Registers");
38 SetValueIsValid (true);
39}
40
41ValueObjectRegisterContext::~ValueObjectRegisterContext()
42{
43}
44
Greg Claytonb01000f2011-01-17 03:46:26 +000045lldb::clang_type_t
Greg Clayton462d4142010-09-29 01:12:09 +000046ValueObjectRegisterContext::GetClangType ()
Chris Lattner24943d22010-06-08 16:52:24 +000047{
48 return NULL;
49}
50
51ConstString
52ValueObjectRegisterContext::GetTypeName()
53{
54 ConstString empty_type_name;
55 return empty_type_name;
56}
57
58uint32_t
59ValueObjectRegisterContext::CalculateNumChildren()
60{
Jim Inghamfa3a16a2011-03-31 00:19:25 +000061 return m_reg_ctx_sp->GetRegisterSetCount();
Chris Lattner24943d22010-06-08 16:52:24 +000062}
63
64clang::ASTContext *
65ValueObjectRegisterContext::GetClangAST ()
66{
67 return NULL;
68}
69
70size_t
71ValueObjectRegisterContext::GetByteSize()
72{
73 return 0;
74}
75
Jim Inghamfa3a16a2011-03-31 00:19:25 +000076bool
77ValueObjectRegisterContext::UpdateValue ()
Chris Lattner24943d22010-06-08 16:52:24 +000078{
79 m_error.Clear();
Greg Claytonb4d7fc02012-02-17 07:49:44 +000080 ExecutionContext exe_ctx(GetExecutionContextRef());
81 StackFrame *frame = exe_ctx.GetFramePtr();
Chris Lattner24943d22010-06-08 16:52:24 +000082 if (frame)
Jim Inghamfa3a16a2011-03-31 00:19:25 +000083 m_reg_ctx_sp = frame->GetRegisterContext();
Chris Lattner24943d22010-06-08 16:52:24 +000084 else
Jim Inghamfa3a16a2011-03-31 00:19:25 +000085 m_reg_ctx_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000086
Jim Inghamfa3a16a2011-03-31 00:19:25 +000087 if (m_reg_ctx_sp.get() == NULL)
88 {
89 SetValueIsValid (false);
90 m_error.SetErrorToGenericError();
91 }
92 else
93 SetValueIsValid (true);
94
95 return m_error.Success();
Chris Lattner24943d22010-06-08 16:52:24 +000096}
97
Jim Ingham47da8102011-04-22 23:53:53 +000098ValueObject *
Chris Lattner24943d22010-06-08 16:52:24 +000099ValueObjectRegisterContext::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
100{
Jim Ingham47da8102011-04-22 23:53:53 +0000101 ValueObject *new_valobj = NULL;
102
Chris Lattner24943d22010-06-08 16:52:24 +0000103 const uint32_t num_children = GetNumChildren();
104 if (idx < num_children)
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000105 {
106 ExecutionContext exe_ctx(GetExecutionContextRef());
107 new_valobj = new ValueObjectRegisterSet(exe_ctx.GetBestExecutionContextScope(), m_reg_ctx_sp, idx);
108 }
Jim Ingham47da8102011-04-22 23:53:53 +0000109
110 return new_valobj;
Chris Lattner24943d22010-06-08 16:52:24 +0000111}
112
113
114#pragma mark -
115#pragma mark ValueObjectRegisterSet
116
Jim Ingham47da8102011-04-22 23:53:53 +0000117ValueObjectSP
118ValueObjectRegisterSet::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx_sp, uint32_t set_idx)
119{
120 return (new ValueObjectRegisterSet (exe_scope, reg_ctx_sp, set_idx))->GetSP();
121}
122
123
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000124ValueObjectRegisterSet::ValueObjectRegisterSet (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx, uint32_t reg_set_idx) :
125 ValueObject (exe_scope),
126 m_reg_ctx_sp (reg_ctx),
Chris Lattner24943d22010-06-08 16:52:24 +0000127 m_reg_set (NULL),
128 m_reg_set_idx (reg_set_idx)
129{
130 assert (reg_ctx);
131 m_reg_set = reg_ctx->GetRegisterSet(m_reg_set_idx);
132 if (m_reg_set)
133 {
134 m_name.SetCString (m_reg_set->name);
135 }
136}
137
138ValueObjectRegisterSet::~ValueObjectRegisterSet()
139{
140}
141
Greg Claytonb01000f2011-01-17 03:46:26 +0000142lldb::clang_type_t
Greg Clayton462d4142010-09-29 01:12:09 +0000143ValueObjectRegisterSet::GetClangType ()
Chris Lattner24943d22010-06-08 16:52:24 +0000144{
145 return NULL;
146}
147
148ConstString
149ValueObjectRegisterSet::GetTypeName()
150{
151 return ConstString();
152}
153
154uint32_t
155ValueObjectRegisterSet::CalculateNumChildren()
156{
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000157 const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet(m_reg_set_idx);
Chris Lattner24943d22010-06-08 16:52:24 +0000158 if (reg_set)
159 return reg_set->num_registers;
160 return 0;
161}
162
163clang::ASTContext *
164ValueObjectRegisterSet::GetClangAST ()
165{
166 return NULL;
167}
168
169size_t
170ValueObjectRegisterSet::GetByteSize()
171{
172 return 0;
173}
174
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000175bool
176ValueObjectRegisterSet::UpdateValue ()
Chris Lattner24943d22010-06-08 16:52:24 +0000177{
178 m_error.Clear();
179 SetValueDidChange (false);
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000180 ExecutionContext exe_ctx(GetExecutionContextRef());
181 StackFrame *frame = exe_ctx.GetFramePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000182 if (frame == NULL)
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000183 m_reg_ctx_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000184 else
185 {
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000186 m_reg_ctx_sp = frame->GetRegisterContext ();
187 if (m_reg_ctx_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000188 {
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000189 const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet (m_reg_set_idx);
Chris Lattner24943d22010-06-08 16:52:24 +0000190 if (reg_set == NULL)
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000191 m_reg_ctx_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000192 else if (m_reg_set != reg_set)
193 {
194 SetValueDidChange (true);
195 m_name.SetCString(reg_set->name);
196 }
197 }
198 }
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000199 if (m_reg_ctx_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000200 {
201 SetValueIsValid (true);
202 }
203 else
204 {
205 SetValueIsValid (false);
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000206 m_error.SetErrorToGenericError ();
Chris Lattner24943d22010-06-08 16:52:24 +0000207 m_children.clear();
208 }
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000209 return m_error.Success();
Chris Lattner24943d22010-06-08 16:52:24 +0000210}
211
212
Jim Ingham47da8102011-04-22 23:53:53 +0000213ValueObject *
Chris Lattner24943d22010-06-08 16:52:24 +0000214ValueObjectRegisterSet::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
215{
Johnny Chen20e663f2011-08-11 22:23:44 +0000216 ValueObject *valobj = NULL;
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000217 if (m_reg_ctx_sp && m_reg_set)
Chris Lattner24943d22010-06-08 16:52:24 +0000218 {
219 const uint32_t num_children = GetNumChildren();
220 if (idx < num_children)
Jim Ingham47da8102011-04-22 23:53:53 +0000221 valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, m_reg_set->registers[idx]);
Chris Lattner24943d22010-06-08 16:52:24 +0000222 }
Jim Ingham47da8102011-04-22 23:53:53 +0000223 return valobj;
Chris Lattner24943d22010-06-08 16:52:24 +0000224}
225
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000226lldb::ValueObjectSP
227ValueObjectRegisterSet::GetChildMemberWithName (const ConstString &name, bool can_create)
228{
Jim Ingham47da8102011-04-22 23:53:53 +0000229 ValueObject *valobj = NULL;
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000230 if (m_reg_ctx_sp && m_reg_set)
231 {
232 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
233 if (reg_info != NULL)
Jim Ingham47da8102011-04-22 23:53:53 +0000234 valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, reg_info->kinds[eRegisterKindLLDB]);
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000235 }
Jim Ingham47da8102011-04-22 23:53:53 +0000236 if (valobj)
237 return valobj->GetSP();
238 else
239 return ValueObjectSP();
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000240}
241
242uint32_t
243ValueObjectRegisterSet::GetIndexOfChildWithName (const ConstString &name)
244{
245 if (m_reg_ctx_sp && m_reg_set)
246 {
247 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
248 if (reg_info != NULL)
249 return reg_info->kinds[eRegisterKindLLDB];
250 }
251 return UINT32_MAX;
252}
Chris Lattner24943d22010-06-08 16:52:24 +0000253
254#pragma mark -
255#pragma mark ValueObjectRegister
256
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000257void
Greg Clayton061b79d2011-05-09 20:18:18 +0000258ValueObjectRegister::ConstructObject (uint32_t reg_num)
Chris Lattner24943d22010-06-08 16:52:24 +0000259{
Greg Clayton061b79d2011-05-09 20:18:18 +0000260 const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoAtIndex (reg_num);
261 if (reg_info)
Chris Lattner24943d22010-06-08 16:52:24 +0000262 {
Greg Clayton061b79d2011-05-09 20:18:18 +0000263 m_reg_info = *reg_info;
264 if (reg_info->name)
265 m_name.SetCString(reg_info->name);
266 else if (reg_info->alt_name)
267 m_name.SetCString(reg_info->alt_name);
Chris Lattner24943d22010-06-08 16:52:24 +0000268 }
269}
270
Greg Clayton061b79d2011-05-09 20:18:18 +0000271ValueObjectRegister::ValueObjectRegister (ValueObject &parent, lldb::RegisterContextSP &reg_ctx_sp, uint32_t reg_num) :
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000272 ValueObject (parent),
Greg Clayton061b79d2011-05-09 20:18:18 +0000273 m_reg_ctx_sp (reg_ctx_sp),
274 m_reg_info (),
275 m_reg_value (),
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000276 m_type_name (),
277 m_clang_type (NULL)
278{
Greg Clayton061b79d2011-05-09 20:18:18 +0000279 assert (reg_ctx_sp.get());
280 ConstructObject(reg_num);
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000281}
282
Jim Ingham47da8102011-04-22 23:53:53 +0000283ValueObjectSP
284ValueObjectRegister::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx_sp, uint32_t reg_num)
285{
286 return (new ValueObjectRegister (exe_scope, reg_ctx_sp, reg_num))->GetSP();
287}
288
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000289ValueObjectRegister::ValueObjectRegister (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx, uint32_t reg_num) :
290 ValueObject (exe_scope),
291 m_reg_ctx_sp (reg_ctx),
Greg Clayton061b79d2011-05-09 20:18:18 +0000292 m_reg_info (),
293 m_reg_value (),
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000294 m_type_name (),
295 m_clang_type (NULL)
296{
297 assert (reg_ctx);
Greg Clayton061b79d2011-05-09 20:18:18 +0000298 ConstructObject(reg_num);
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000299}
300
Chris Lattner24943d22010-06-08 16:52:24 +0000301ValueObjectRegister::~ValueObjectRegister()
302{
303}
304
Greg Claytonb01000f2011-01-17 03:46:26 +0000305lldb::clang_type_t
Greg Clayton462d4142010-09-29 01:12:09 +0000306ValueObjectRegister::GetClangType ()
Chris Lattner24943d22010-06-08 16:52:24 +0000307{
Greg Clayton061b79d2011-05-09 20:18:18 +0000308 if (m_clang_type == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000309 {
Greg Clayton289afcb2012-02-18 05:35:26 +0000310 ExecutionContext exe_ctx (GetExecutionContextRef());
311 Target *target = exe_ctx.GetTargetPtr();
312 if (target)
Chris Lattner24943d22010-06-08 16:52:24 +0000313 {
Greg Clayton289afcb2012-02-18 05:35:26 +0000314 Module *exe_module = target->GetExecutableModulePointer();
Chris Lattner24943d22010-06-08 16:52:24 +0000315 if (exe_module)
316 {
Greg Clayton061b79d2011-05-09 20:18:18 +0000317 m_clang_type = exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize (m_reg_info.encoding,
318 m_reg_info.byte_size * 8);
Chris Lattner24943d22010-06-08 16:52:24 +0000319 }
320 }
321 }
322 return m_clang_type;
323}
324
325ConstString
326ValueObjectRegister::GetTypeName()
327{
328 if (m_type_name.IsEmpty())
Greg Claytonb302b2f2011-06-30 02:28:26 +0000329 m_type_name = ClangASTType::GetConstTypeName (GetClangType());
Chris Lattner24943d22010-06-08 16:52:24 +0000330 return m_type_name;
331}
332
333uint32_t
334ValueObjectRegister::CalculateNumChildren()
335{
336 return 0;
337}
338
339clang::ASTContext *
340ValueObjectRegister::GetClangAST ()
341{
Greg Clayton289afcb2012-02-18 05:35:26 +0000342 ExecutionContext exe_ctx (GetExecutionContextRef());
343 Target *target = exe_ctx.GetTargetPtr();
344 if (target)
Chris Lattner24943d22010-06-08 16:52:24 +0000345 {
Greg Clayton289afcb2012-02-18 05:35:26 +0000346 Module *exe_module = target->GetExecutableModulePointer();
Chris Lattner24943d22010-06-08 16:52:24 +0000347 if (exe_module)
Greg Claytonb01000f2011-01-17 03:46:26 +0000348 return exe_module->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +0000349 }
350 return NULL;
351}
352
353size_t
354ValueObjectRegister::GetByteSize()
355{
Greg Clayton061b79d2011-05-09 20:18:18 +0000356 return m_reg_info.byte_size;
Chris Lattner24943d22010-06-08 16:52:24 +0000357}
358
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000359bool
360ValueObjectRegister::UpdateValue ()
Chris Lattner24943d22010-06-08 16:52:24 +0000361{
362 m_error.Clear();
Greg Claytonb4d7fc02012-02-17 07:49:44 +0000363 ExecutionContext exe_ctx(GetExecutionContextRef());
364 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Clayton061b79d2011-05-09 20:18:18 +0000365 if (frame == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000366 {
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000367 m_reg_ctx_sp.reset();
Greg Clayton061b79d2011-05-09 20:18:18 +0000368 m_reg_value.Clear();
Chris Lattner24943d22010-06-08 16:52:24 +0000369 }
370
371
Greg Clayton061b79d2011-05-09 20:18:18 +0000372 if (m_reg_ctx_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000373 {
Greg Clayton061b79d2011-05-09 20:18:18 +0000374 if (m_reg_ctx_sp->ReadRegister (&m_reg_info, m_reg_value))
Chris Lattner24943d22010-06-08 16:52:24 +0000375 {
Greg Clayton061b79d2011-05-09 20:18:18 +0000376 if (m_reg_value.GetData (m_data))
377 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000378 Process *process = exe_ctx.GetProcessPtr();
379 if (process)
380 m_data.SetAddressByteSize(process->GetAddressByteSize());
Greg Clayton061b79d2011-05-09 20:18:18 +0000381 m_value.SetContext(Value::eContextTypeRegisterInfo, (void *)&m_reg_info);
382 m_value.SetValueType(Value::eValueTypeHostAddress);
383 m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
384 SetValueIsValid (true);
385 return true;
386 }
Chris Lattner24943d22010-06-08 16:52:24 +0000387 }
388 }
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000389
Chris Lattner24943d22010-06-08 16:52:24 +0000390 SetValueIsValid (false);
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000391 m_error.SetErrorToGenericError ();
392 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000393}
394
Jim Ingham574c3d62011-08-12 23:34:31 +0000395bool
396ValueObjectRegister::SetValueFromCString (const char *value_str)
397{
398 // The new value will be in the m_data. Copy that into our register value.
399 Error error = m_reg_value.SetValueFromCString (&m_reg_info, value_str);
400 if (error.Success())
401 {
402 if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
403 {
404 SetNeedsUpdate();
405 return true;
406 }
407 else
408 return false;
409 }
410 else
411 return false;
412}
Chris Lattner24943d22010-06-08 16:52:24 +0000413
Greg Claytond6bcc0d2011-08-16 03:49:01 +0000414bool
415ValueObjectRegister::ResolveValue (Scalar &scalar)
416{
417 if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything
418 return m_reg_value.GetScalarValue(scalar);
419 return false;
420}
421
422