blob: 4190fd8936c739756aeba30ab8eee0ae4d198b9f [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBFrame.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
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBFrame.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include <string>
13#include <algorithm>
14
15#include "lldb/lldb-types.h"
16
17#include "lldb/Core/Address.h"
18#include "lldb/Core/ConstString.h"
Caroline Tice7826c882010-10-26 03:11:13 +000019#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/Stream.h"
21#include "lldb/Core/StreamFile.h"
22#include "lldb/Core/ValueObjectRegister.h"
23#include "lldb/Core/ValueObjectVariable.h"
Greg Claytond1719722010-10-05 03:13:51 +000024#include "lldb/Expression/ClangUserExpression.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Symbol/Block.h"
26#include "lldb/Symbol/SymbolContext.h"
27#include "lldb/Symbol/VariableList.h"
28#include "lldb/Symbol/Variable.h"
29#include "lldb/Target/ExecutionContext.h"
30#include "lldb/Target/Target.h"
31#include "lldb/Target/Process.h"
32#include "lldb/Target/RegisterContext.h"
33#include "lldb/Target/StackFrame.h"
34#include "lldb/Target/Thread.h"
35
Eli Friedman7a62c8b2010-06-09 07:44:37 +000036#include "lldb/API/SBDebugger.h"
37#include "lldb/API/SBValue.h"
38#include "lldb/API/SBAddress.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000039#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000040#include "lldb/API/SBSymbolContext.h"
41#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000042
43using namespace lldb;
44using namespace lldb_private;
45
46SBFrame::SBFrame () :
Greg Clayton63094e02010-06-23 01:19:29 +000047 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000048{
49}
50
51SBFrame::SBFrame (const lldb::StackFrameSP &lldb_object_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000052 m_opaque_sp (lldb_object_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000053{
Caroline Tice61ba7ec2010-10-26 23:49:36 +000054 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000055
56 if (log)
57 {
58 SBStream sstr;
59 GetDescription (sstr);
Caroline Tice61ba7ec2010-10-26 23:49:36 +000060 log->Printf ("SBFrame::SBFrame (lldb_object_sp=%p) => this.sp = %p (%s)", lldb_object_sp.get(),
61 m_opaque_sp.get(), sstr.GetData());
62
Caroline Tice7826c882010-10-26 03:11:13 +000063 }
Chris Lattner24943d22010-06-08 16:52:24 +000064}
65
66SBFrame::~SBFrame()
67{
68}
69
70
71void
72SBFrame::SetFrame (const lldb::StackFrameSP &lldb_object_sp)
73{
Greg Clayton63094e02010-06-23 01:19:29 +000074 m_opaque_sp = lldb_object_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000075}
76
77
78bool
79SBFrame::IsValid() const
80{
Greg Clayton63094e02010-06-23 01:19:29 +000081 return (m_opaque_sp.get() != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000082}
83
84SBSymbolContext
85SBFrame::GetSymbolContext (uint32_t resolve_scope) const
86{
Caroline Tice7826c882010-10-26 03:11:13 +000087 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
88
Caroline Tice61ba7ec2010-10-26 23:49:36 +000089 //if (log)
90 // log->Printf ("SBFrame::GetSymbolContext (this.sp=%p, resolve_scope=%d)", m_opaque_sp.get(), resolve_scope);
Caroline Tice7826c882010-10-26 03:11:13 +000091
Chris Lattner24943d22010-06-08 16:52:24 +000092 SBSymbolContext sb_sym_ctx;
Greg Clayton63094e02010-06-23 01:19:29 +000093 if (m_opaque_sp)
94 sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope));
Caroline Tice7826c882010-10-26 03:11:13 +000095
96 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +000097 log->Printf ("SBFrame::GetSymbolContext (this.sp=%p, resolve_scope=%d) => SBSymbolContext (this.ap = %p)",
98 m_opaque_sp.get(), resolve_scope, sb_sym_ctx.get());
Caroline Tice7826c882010-10-26 03:11:13 +000099
Chris Lattner24943d22010-06-08 16:52:24 +0000100 return sb_sym_ctx;
101}
102
103SBModule
104SBFrame::GetModule () const
105{
Greg Clayton63094e02010-06-23 01:19:29 +0000106 SBModule sb_module (m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000107 return sb_module;
108}
109
110SBCompileUnit
111SBFrame::GetCompileUnit () const
112{
Caroline Tice7826c882010-10-26 03:11:13 +0000113 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
114
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000115 //if (log)
116 // log->Printf ("SBFrame::GetCompileUnit()");
Caroline Tice7826c882010-10-26 03:11:13 +0000117
Greg Clayton63094e02010-06-23 01:19:29 +0000118 SBCompileUnit sb_comp_unit(m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
Caroline Tice7826c882010-10-26 03:11:13 +0000119
120 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000121 log->Printf ("SBFrame::GetCompileUnit (this.sp=%p) => SBCompileUnit (this=%p)", m_opaque_sp.get(),
122 sb_comp_unit.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000123
Chris Lattner24943d22010-06-08 16:52:24 +0000124 return sb_comp_unit;
125}
126
127SBFunction
128SBFrame::GetFunction () const
129{
Greg Clayton63094e02010-06-23 01:19:29 +0000130 SBFunction sb_function(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function);
Chris Lattner24943d22010-06-08 16:52:24 +0000131 return sb_function;
132}
133
Greg Clayton8f1e08b2010-10-04 18:37:52 +0000134SBSymbol
135SBFrame::GetSymbol () const
136{
137 SBSymbol sb_symbol(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol);
138 return sb_symbol;
139}
140
Chris Lattner24943d22010-06-08 16:52:24 +0000141SBBlock
142SBFrame::GetBlock () const
143{
Greg Clayton63094e02010-06-23 01:19:29 +0000144 SBBlock sb_block(m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block);
Chris Lattner24943d22010-06-08 16:52:24 +0000145 return sb_block;
146}
147
Greg Clayton69aa5d92010-09-07 04:20:48 +0000148SBBlock
149SBFrame::GetFrameBlock () const
150{
151 SBBlock sb_block(m_opaque_sp->GetFrameBlock ());
152 return sb_block;
153}
154
Chris Lattner24943d22010-06-08 16:52:24 +0000155SBLineEntry
156SBFrame::GetLineEntry () const
157{
Greg Clayton63094e02010-06-23 01:19:29 +0000158 SBLineEntry sb_line_entry(&m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
Chris Lattner24943d22010-06-08 16:52:24 +0000159 return sb_line_entry;
160}
161
162uint32_t
163SBFrame::GetFrameID () const
164{
Greg Clayton63094e02010-06-23 01:19:29 +0000165 if (m_opaque_sp)
Greg Clayton33ed1702010-08-24 00:45:41 +0000166 return m_opaque_sp->GetFrameIndex ();
Chris Lattner24943d22010-06-08 16:52:24 +0000167 else
168 return UINT32_MAX;
169}
170
Chris Lattner24943d22010-06-08 16:52:24 +0000171lldb::addr_t
172SBFrame::GetPC () const
173{
Caroline Tice7826c882010-10-26 03:11:13 +0000174 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
175
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000176 //if (log)
177 // log->Printf ("SBFrame::GetPC (this.sp=%p)", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000178
179 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
Greg Clayton63094e02010-06-23 01:19:29 +0000180 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000181 addr = m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget());
182
183 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000184 log->Printf ("SBFrame::GetPC (this.sp=%p) => %p", m_opaque_sp.get(), addr);
Caroline Tice7826c882010-10-26 03:11:13 +0000185
186 return addr;
Chris Lattner24943d22010-06-08 16:52:24 +0000187}
188
189bool
190SBFrame::SetPC (lldb::addr_t new_pc)
191{
Caroline Tice7826c882010-10-26 03:11:13 +0000192 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
193
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000194 //if (log)
195 // log->Printf ("SBFrame::SetPC (this.sp=%p, new_pc=%p)", m_opaque_sp.get(), new_pc);
Caroline Tice7826c882010-10-26 03:11:13 +0000196
197 bool ret_val = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000198 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000199 ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc);
200
201 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000202 log->Printf ("SBFrame::SetPC (this.sp=%p, new_pc=%p) => '%s'", m_opaque_sp.get(), new_pc,
203 (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000204
205 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000206}
207
208lldb::addr_t
209SBFrame::GetSP () const
210{
Greg Clayton63094e02010-06-23 01:19:29 +0000211 if (m_opaque_sp)
212 return m_opaque_sp->GetRegisterContext()->GetSP();
Chris Lattner24943d22010-06-08 16:52:24 +0000213 return LLDB_INVALID_ADDRESS;
214}
215
216
217lldb::addr_t
218SBFrame::GetFP () const
219{
Caroline Tice7826c882010-10-26 03:11:13 +0000220 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
221
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000222 //if (log)
223 // log->Printf ("SBFrame::GetFP ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000224
225 lldb::addr_t addr = LLDB_INVALID_ADDRESS;
Greg Clayton63094e02010-06-23 01:19:29 +0000226 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000227 addr = m_opaque_sp->GetRegisterContext()->GetFP();
228
229 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000230 log->Printf ("SBFrame::GetFP (this.sp=%p) => %p", m_opaque_sp.get(), addr);
Caroline Tice7826c882010-10-26 03:11:13 +0000231
232 return addr;
Chris Lattner24943d22010-06-08 16:52:24 +0000233}
234
235
236SBAddress
237SBFrame::GetPCAddress () const
238{
239 SBAddress sb_addr;
Greg Clayton63094e02010-06-23 01:19:29 +0000240 if (m_opaque_sp)
Greg Claytonb04e7a82010-08-24 21:05:24 +0000241 sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress());
Chris Lattner24943d22010-06-08 16:52:24 +0000242 return sb_addr;
243}
244
245void
246SBFrame::Clear()
247{
Greg Clayton63094e02010-06-23 01:19:29 +0000248 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000249}
250
251SBValue
252SBFrame::LookupVar (const char *var_name)
253{
254 lldb::VariableSP var_sp;
255 if (IsValid ())
256 {
257 lldb_private::VariableList variable_list;
258 SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
259
260 SBBlock block = sc.GetBlock();
261 if (block.IsValid())
262 block.AppendVariables (true, true, &variable_list);
263
264 const uint32_t num_variables = variable_list.GetSize();
265
266 bool found = false;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000267 for (uint32_t i = 0; i < num_variables && !found; ++i)
Chris Lattner24943d22010-06-08 16:52:24 +0000268 {
269 var_sp = variable_list.GetVariableAtIndex(i);
270 if (var_sp
271 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)))
272 found = true;
273 }
274 if (!found)
275 var_sp.reset();
276 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000277 if (var_sp)
278 {
279 SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
280 return sb_value;
281 }
282
283 SBValue sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000284 return sb_value;
285}
286
287SBValue
288SBFrame::LookupVarInScope (const char *var_name, const char *scope)
289{
290 lldb::VariableSP var_sp;
291 if (IsValid())
292 {
293 std::string scope_str = scope;
294 lldb::ValueType var_scope = eValueTypeInvalid;
295 // Convert scope_str to be all lowercase;
296 std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower);
297
298 if (scope_str.compare ("global") == 0)
299 var_scope = eValueTypeVariableGlobal;
300 else if (scope_str.compare ("local") == 0)
301 var_scope = eValueTypeVariableLocal;
302 else if (scope_str.compare ("parameter") == 0)
303 var_scope = eValueTypeVariableArgument;
304
305 if (var_scope != eValueTypeInvalid)
306 {
307 lldb_private::VariableList variable_list;
308 SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
309
310 SBBlock block = sc.GetBlock();
311 if (block.IsValid())
312 block.AppendVariables (true, true, &variable_list);
313
314 const uint32_t num_variables = variable_list.GetSize();
315
316 bool found = false;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000317 for (uint32_t i = 0; i < num_variables && !found; ++i)
Chris Lattner24943d22010-06-08 16:52:24 +0000318 {
319 var_sp = variable_list.GetVariableAtIndex(i);
320 if (var_sp
321 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))
322 && var_sp.get()->GetScope() == var_scope)
323 found = true;
324 }
325 if (!found)
326 var_sp.reset();
327 }
328 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000329
330 if (var_sp)
331 {
332 SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
333 return sb_value;
334 }
335
336 SBValue sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000337 return sb_value;
338}
339
340bool
341SBFrame::operator == (const SBFrame &rhs) const
342{
Greg Clayton63094e02010-06-23 01:19:29 +0000343 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000344}
345
346bool
347SBFrame::operator != (const SBFrame &rhs) const
348{
Greg Clayton63094e02010-06-23 01:19:29 +0000349 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000350}
351
352lldb_private::StackFrame *
353SBFrame::operator->() const
354{
Greg Clayton63094e02010-06-23 01:19:29 +0000355 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000356}
357
358lldb_private::StackFrame *
359SBFrame::get() const
360{
Greg Clayton63094e02010-06-23 01:19:29 +0000361 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000362}
363
364
365SBThread
366SBFrame::GetThread () const
367{
Caroline Tice7826c882010-10-26 03:11:13 +0000368 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
369
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000370 //if (log)
371 // log->Printf ("SBFrame::GetThread ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000372
Greg Clayton63094e02010-06-23 01:19:29 +0000373 SBThread sb_thread (m_opaque_sp->GetThread().GetSP());
Caroline Tice7826c882010-10-26 03:11:13 +0000374
375 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000376 {
377 SBStream sstr;
378 sb_thread.GetDescription (sstr);
379 log->Printf ("SBFrame::GetThread (this.sp=%p) => SBThread : this.sp= %p, '%s'", m_opaque_sp.get(),
380 sb_thread.GetLLDBObjectPtr(), sstr.GetData());
381 }
Caroline Tice7826c882010-10-26 03:11:13 +0000382
Chris Lattner24943d22010-06-08 16:52:24 +0000383 return sb_thread;
384}
385
386const char *
387SBFrame::Disassemble () const
388{
Caroline Tice7826c882010-10-26 03:11:13 +0000389 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
390 Log *verbose_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
391
392 if (verbose_log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000393 verbose_log->Printf ("SBFrame::Disassemble (this.sp=%p) => %s", m_opaque_sp.get(), m_opaque_sp->Disassemble());
Caroline Tice7826c882010-10-26 03:11:13 +0000394 else if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000395 log->Printf ("SBFrame::Disassemble (this.sp=%p)", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000396
Greg Clayton63094e02010-06-23 01:19:29 +0000397 if (m_opaque_sp)
398 return m_opaque_sp->Disassemble();
Chris Lattner24943d22010-06-08 16:52:24 +0000399 return NULL;
400}
401
402
403
404lldb_private::StackFrame *
405SBFrame::GetLLDBObjectPtr ()
406{
Greg Clayton63094e02010-06-23 01:19:29 +0000407 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000408}
409
410SBValueList
411SBFrame::GetVariables (bool arguments,
412 bool locals,
413 bool statics,
414 bool in_scope_only)
415{
Caroline Tice7826c882010-10-26 03:11:13 +0000416 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
417
418 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000419 log->Printf ("SBFrame::GetVariables (this_sp.get=%p, arguments=%s, locals=%s, statics=%s, in_scope_only=%s)",
420 m_opaque_sp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000421 (arguments ? "true" : "false"),
422 (locals ? "true" : "false"),
423 (statics ? "true" : "false"),
424 (in_scope_only ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000425
Chris Lattner24943d22010-06-08 16:52:24 +0000426 SBValueList value_list;
Greg Clayton63094e02010-06-23 01:19:29 +0000427 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000428 {
429 size_t i;
Greg Clayton17dae082010-09-02 02:59:18 +0000430 VariableList *variable_list = m_opaque_sp->GetVariableList(true);
Chris Lattner24943d22010-06-08 16:52:24 +0000431 if (variable_list)
432 {
433 const size_t num_variables = variable_list->GetSize();
434 if (num_variables)
435 {
436 for (i = 0; i < num_variables; ++i)
437 {
438 VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
439 if (variable_sp)
440 {
441 bool add_variable = false;
442 switch (variable_sp->GetScope())
443 {
444 case eValueTypeVariableGlobal:
445 case eValueTypeVariableStatic:
446 add_variable = statics;
447 break;
448
449 case eValueTypeVariableArgument:
450 add_variable = arguments;
451 break;
452
453 case eValueTypeVariableLocal:
454 add_variable = locals;
455 break;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000456
457 default:
458 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000459 }
460 if (add_variable)
461 {
Greg Clayton63094e02010-06-23 01:19:29 +0000462 if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get()))
Chris Lattner24943d22010-06-08 16:52:24 +0000463 continue;
464
Greg Clayton17dae082010-09-02 02:59:18 +0000465 value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp));
Chris Lattner24943d22010-06-08 16:52:24 +0000466 }
467 }
468 }
469 }
Greg Clayton17dae082010-09-02 02:59:18 +0000470 }
Chris Lattner24943d22010-06-08 16:52:24 +0000471 }
Caroline Tice7826c882010-10-26 03:11:13 +0000472
473 if (log)
474 {
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000475 log->Printf ("SBFrame::GetVariables (this.sp=%p,...) => SBValueList (this.ap = %p)", m_opaque_sp.get(),
476 value_list.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000477 //uint32_t num_vars = value_list.GetSize();
478 //for (uint32_t i = 0; i < num_vars; ++i)
479 //{
480 // SBValue value = value_list.GetValueAtIndex (i);
481 // log->Printf (" %s : %s", value.GetName(), value.GetObjectDescription (*this));
482 //}
483 }
484
Chris Lattner24943d22010-06-08 16:52:24 +0000485 return value_list;
486}
487
488lldb::SBValueList
489SBFrame::GetRegisters ()
490{
Caroline Tice7826c882010-10-26 03:11:13 +0000491 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
492
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000493 //if (log)
494 // log->Printf ("SBFrame::GetRegisters ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000495
Chris Lattner24943d22010-06-08 16:52:24 +0000496 SBValueList value_list;
Greg Clayton63094e02010-06-23 01:19:29 +0000497 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000498 {
Greg Clayton63094e02010-06-23 01:19:29 +0000499 RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext();
Chris Lattner24943d22010-06-08 16:52:24 +0000500 if (reg_ctx)
501 {
502 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
503 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
504 {
Greg Claytonbf8e42b2010-10-14 22:52:14 +0000505 value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (NULL, reg_ctx, set_idx)));
Chris Lattner24943d22010-06-08 16:52:24 +0000506 }
507 }
508 }
Caroline Tice7826c882010-10-26 03:11:13 +0000509
510 if (log)
511 {
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000512 log->Printf ("SBFrame::Registers (this.sp=%p) => SBValueList (this.ap = %p)", m_opaque_sp.get(),
513 value_list.get() );
Caroline Tice7826c882010-10-26 03:11:13 +0000514 //uint32_t num_vars = value_list.GetSize();
515 //for (uint32_t i = 0; i < num_vars; ++i)
516 //{
517 // SBValue value = value_list.GetValueAtIndex (i);
518 // log->Printf (" %s : %s", value.GetName(), value.GetObjectDescription (*this));
519 //}
520 }
521
Chris Lattner24943d22010-06-08 16:52:24 +0000522 return value_list;
523}
524
Caroline Tice98f930f2010-09-20 05:20:02 +0000525bool
526SBFrame::GetDescription (SBStream &description)
527{
528 if (m_opaque_sp)
529 {
Greg Claytond8c62532010-10-07 04:19:01 +0000530 description.Printf("SBFrame: idx = %u", m_opaque_sp->GetFrameIndex());
Caroline Tice98f930f2010-09-20 05:20:02 +0000531 }
532 else
533 description.Printf ("No value");
534
535 return true;
536}
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000537
538lldb::SBValue
539SBFrame::EvaluateExpression (const char *expr)
540{
541 lldb::SBValue expr_result_value;
542 if (m_opaque_sp)
543 {
Greg Claytond1719722010-10-05 03:13:51 +0000544 ExecutionContext exe_ctx;
545 m_opaque_sp->CalculateExecutionContext (exe_ctx);
546 *expr_result_value = ClangUserExpression::Evaluate (exe_ctx, expr);
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000547 }
548 return expr_result_value;
549}