1*30fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "SBFrame.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner #include <string>
13*30fdc8d8SChris Lattner #include <algorithm>
14*30fdc8d8SChris Lattner 
15*30fdc8d8SChris Lattner #include "lldb/lldb-types.h"
16*30fdc8d8SChris Lattner 
17*30fdc8d8SChris Lattner #include "lldb/Core/Address.h"
18*30fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
19*30fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
20*30fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
21*30fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
22*30fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
23*30fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
24*30fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
25*30fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
26*30fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
27*30fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
28*30fdc8d8SChris Lattner #include "lldb/Target/Target.h"
29*30fdc8d8SChris Lattner #include "lldb/Target/Process.h"
30*30fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
31*30fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
32*30fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
33*30fdc8d8SChris Lattner 
34*30fdc8d8SChris Lattner #include "SBDebugger.h"
35*30fdc8d8SChris Lattner #include "SBValue.h"
36*30fdc8d8SChris Lattner #include "SBAddress.h"
37*30fdc8d8SChris Lattner #include "SBSymbolContext.h"
38*30fdc8d8SChris Lattner #include "SBThread.h"
39*30fdc8d8SChris Lattner 
40*30fdc8d8SChris Lattner using namespace lldb;
41*30fdc8d8SChris Lattner using namespace lldb_private;
42*30fdc8d8SChris Lattner 
43*30fdc8d8SChris Lattner SBFrame::SBFrame () :
44*30fdc8d8SChris Lattner     m_lldb_object_sp ()
45*30fdc8d8SChris Lattner {
46*30fdc8d8SChris Lattner }
47*30fdc8d8SChris Lattner 
48*30fdc8d8SChris Lattner SBFrame::SBFrame (const lldb::StackFrameSP &lldb_object_sp) :
49*30fdc8d8SChris Lattner     m_lldb_object_sp (lldb_object_sp)
50*30fdc8d8SChris Lattner {
51*30fdc8d8SChris Lattner }
52*30fdc8d8SChris Lattner 
53*30fdc8d8SChris Lattner SBFrame::~SBFrame()
54*30fdc8d8SChris Lattner {
55*30fdc8d8SChris Lattner }
56*30fdc8d8SChris Lattner 
57*30fdc8d8SChris Lattner 
58*30fdc8d8SChris Lattner void
59*30fdc8d8SChris Lattner SBFrame::SetFrame (const lldb::StackFrameSP &lldb_object_sp)
60*30fdc8d8SChris Lattner {
61*30fdc8d8SChris Lattner     m_lldb_object_sp = lldb_object_sp;
62*30fdc8d8SChris Lattner }
63*30fdc8d8SChris Lattner 
64*30fdc8d8SChris Lattner 
65*30fdc8d8SChris Lattner bool
66*30fdc8d8SChris Lattner SBFrame::IsValid() const
67*30fdc8d8SChris Lattner {
68*30fdc8d8SChris Lattner     return (m_lldb_object_sp.get() != NULL);
69*30fdc8d8SChris Lattner }
70*30fdc8d8SChris Lattner 
71*30fdc8d8SChris Lattner SBSymbolContext
72*30fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
73*30fdc8d8SChris Lattner {
74*30fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
75*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
76*30fdc8d8SChris Lattner         sb_sym_ctx.SetSymbolContext(&m_lldb_object_sp->GetSymbolContext (resolve_scope));
77*30fdc8d8SChris Lattner     return sb_sym_ctx;
78*30fdc8d8SChris Lattner }
79*30fdc8d8SChris Lattner 
80*30fdc8d8SChris Lattner SBModule
81*30fdc8d8SChris Lattner SBFrame::GetModule () const
82*30fdc8d8SChris Lattner {
83*30fdc8d8SChris Lattner     SBModule sb_module (m_lldb_object_sp->GetSymbolContext (eSymbolContextModule).module_sp);
84*30fdc8d8SChris Lattner     return sb_module;
85*30fdc8d8SChris Lattner }
86*30fdc8d8SChris Lattner 
87*30fdc8d8SChris Lattner SBCompileUnit
88*30fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
89*30fdc8d8SChris Lattner {
90*30fdc8d8SChris Lattner     SBCompileUnit sb_comp_unit(m_lldb_object_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
91*30fdc8d8SChris Lattner     return sb_comp_unit;
92*30fdc8d8SChris Lattner }
93*30fdc8d8SChris Lattner 
94*30fdc8d8SChris Lattner SBFunction
95*30fdc8d8SChris Lattner SBFrame::GetFunction () const
96*30fdc8d8SChris Lattner {
97*30fdc8d8SChris Lattner     SBFunction sb_function(m_lldb_object_sp->GetSymbolContext (eSymbolContextFunction).function);
98*30fdc8d8SChris Lattner     return sb_function;
99*30fdc8d8SChris Lattner }
100*30fdc8d8SChris Lattner 
101*30fdc8d8SChris Lattner SBBlock
102*30fdc8d8SChris Lattner SBFrame::GetBlock () const
103*30fdc8d8SChris Lattner {
104*30fdc8d8SChris Lattner     SBBlock sb_block(m_lldb_object_sp->GetSymbolContext (eSymbolContextBlock).block);
105*30fdc8d8SChris Lattner     return sb_block;
106*30fdc8d8SChris Lattner }
107*30fdc8d8SChris Lattner 
108*30fdc8d8SChris Lattner SBLineEntry
109*30fdc8d8SChris Lattner SBFrame::GetLineEntry () const
110*30fdc8d8SChris Lattner {
111*30fdc8d8SChris Lattner     SBLineEntry sb_line_entry(&m_lldb_object_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
112*30fdc8d8SChris Lattner     return sb_line_entry;
113*30fdc8d8SChris Lattner }
114*30fdc8d8SChris Lattner 
115*30fdc8d8SChris Lattner uint32_t
116*30fdc8d8SChris Lattner SBFrame::GetFrameID () const
117*30fdc8d8SChris Lattner {
118*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
119*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetID();
120*30fdc8d8SChris Lattner     else
121*30fdc8d8SChris Lattner         return UINT32_MAX;
122*30fdc8d8SChris Lattner }
123*30fdc8d8SChris Lattner 
124*30fdc8d8SChris Lattner 
125*30fdc8d8SChris Lattner lldb::addr_t
126*30fdc8d8SChris Lattner SBFrame::GetPC () const
127*30fdc8d8SChris Lattner {
128*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
129*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetPC().GetLoadAddress (&m_lldb_object_sp->GetThread().GetProcess());
130*30fdc8d8SChris Lattner     return LLDB_INVALID_ADDRESS;
131*30fdc8d8SChris Lattner }
132*30fdc8d8SChris Lattner 
133*30fdc8d8SChris Lattner bool
134*30fdc8d8SChris Lattner SBFrame::SetPC (lldb::addr_t new_pc)
135*30fdc8d8SChris Lattner {
136*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
137*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetRegisterContext()->SetPC (new_pc);
138*30fdc8d8SChris Lattner     return false;
139*30fdc8d8SChris Lattner }
140*30fdc8d8SChris Lattner 
141*30fdc8d8SChris Lattner lldb::addr_t
142*30fdc8d8SChris Lattner SBFrame::GetSP () const
143*30fdc8d8SChris Lattner {
144*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
145*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetRegisterContext()->GetSP();
146*30fdc8d8SChris Lattner     return LLDB_INVALID_ADDRESS;
147*30fdc8d8SChris Lattner }
148*30fdc8d8SChris Lattner 
149*30fdc8d8SChris Lattner 
150*30fdc8d8SChris Lattner lldb::addr_t
151*30fdc8d8SChris Lattner SBFrame::GetFP () const
152*30fdc8d8SChris Lattner {
153*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
154*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetRegisterContext()->GetFP();
155*30fdc8d8SChris Lattner     return LLDB_INVALID_ADDRESS;
156*30fdc8d8SChris Lattner }
157*30fdc8d8SChris Lattner 
158*30fdc8d8SChris Lattner 
159*30fdc8d8SChris Lattner SBAddress
160*30fdc8d8SChris Lattner SBFrame::GetPCAddress () const
161*30fdc8d8SChris Lattner {
162*30fdc8d8SChris Lattner     SBAddress sb_addr;
163*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
164*30fdc8d8SChris Lattner         sb_addr.SetAddress (&m_lldb_object_sp->GetPC());
165*30fdc8d8SChris Lattner     return sb_addr;
166*30fdc8d8SChris Lattner }
167*30fdc8d8SChris Lattner 
168*30fdc8d8SChris Lattner void
169*30fdc8d8SChris Lattner SBFrame::Clear()
170*30fdc8d8SChris Lattner {
171*30fdc8d8SChris Lattner     m_lldb_object_sp.reset();
172*30fdc8d8SChris Lattner }
173*30fdc8d8SChris Lattner 
174*30fdc8d8SChris Lattner SBValue
175*30fdc8d8SChris Lattner SBFrame::LookupVar (const char *var_name)
176*30fdc8d8SChris Lattner {
177*30fdc8d8SChris Lattner     lldb::VariableSP var_sp;
178*30fdc8d8SChris Lattner     if (IsValid ())
179*30fdc8d8SChris Lattner     {
180*30fdc8d8SChris Lattner         lldb_private::VariableList variable_list;
181*30fdc8d8SChris Lattner         SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
182*30fdc8d8SChris Lattner 
183*30fdc8d8SChris Lattner         SBBlock block = sc.GetBlock();
184*30fdc8d8SChris Lattner         if (block.IsValid())
185*30fdc8d8SChris Lattner             block.AppendVariables (true, true, &variable_list);
186*30fdc8d8SChris Lattner 
187*30fdc8d8SChris Lattner         const uint32_t num_variables = variable_list.GetSize();
188*30fdc8d8SChris Lattner 
189*30fdc8d8SChris Lattner         bool found = false;
190*30fdc8d8SChris Lattner         for (int i = 0; i < num_variables && !found; ++i)
191*30fdc8d8SChris Lattner         {
192*30fdc8d8SChris Lattner             var_sp = variable_list.GetVariableAtIndex(i);
193*30fdc8d8SChris Lattner             if (var_sp
194*30fdc8d8SChris Lattner                 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)))
195*30fdc8d8SChris Lattner                 found = true;
196*30fdc8d8SChris Lattner         }
197*30fdc8d8SChris Lattner         if (!found)
198*30fdc8d8SChris Lattner             var_sp.reset();
199*30fdc8d8SChris Lattner     }
200*30fdc8d8SChris Lattner     SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
201*30fdc8d8SChris Lattner     return sb_value;
202*30fdc8d8SChris Lattner }
203*30fdc8d8SChris Lattner 
204*30fdc8d8SChris Lattner SBValue
205*30fdc8d8SChris Lattner SBFrame::LookupVarInScope (const char *var_name, const char *scope)
206*30fdc8d8SChris Lattner {
207*30fdc8d8SChris Lattner     lldb::VariableSP var_sp;
208*30fdc8d8SChris Lattner     if (IsValid())
209*30fdc8d8SChris Lattner     {
210*30fdc8d8SChris Lattner         std::string scope_str = scope;
211*30fdc8d8SChris Lattner         lldb::ValueType var_scope = eValueTypeInvalid;
212*30fdc8d8SChris Lattner         // Convert scope_str to be all lowercase;
213*30fdc8d8SChris Lattner         std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower);
214*30fdc8d8SChris Lattner 
215*30fdc8d8SChris Lattner         if (scope_str.compare ("global") == 0)
216*30fdc8d8SChris Lattner             var_scope = eValueTypeVariableGlobal;
217*30fdc8d8SChris Lattner         else if (scope_str.compare ("local") == 0)
218*30fdc8d8SChris Lattner             var_scope = eValueTypeVariableLocal;
219*30fdc8d8SChris Lattner         else if (scope_str.compare ("parameter") == 0)
220*30fdc8d8SChris Lattner            var_scope = eValueTypeVariableArgument;
221*30fdc8d8SChris Lattner 
222*30fdc8d8SChris Lattner         if (var_scope != eValueTypeInvalid)
223*30fdc8d8SChris Lattner         {
224*30fdc8d8SChris Lattner             lldb_private::VariableList variable_list;
225*30fdc8d8SChris Lattner             SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
226*30fdc8d8SChris Lattner 
227*30fdc8d8SChris Lattner             SBBlock block = sc.GetBlock();
228*30fdc8d8SChris Lattner             if (block.IsValid())
229*30fdc8d8SChris Lattner                 block.AppendVariables (true, true, &variable_list);
230*30fdc8d8SChris Lattner 
231*30fdc8d8SChris Lattner             const uint32_t num_variables = variable_list.GetSize();
232*30fdc8d8SChris Lattner 
233*30fdc8d8SChris Lattner             bool found = false;
234*30fdc8d8SChris Lattner             for (int i = 0; i < num_variables && !found; ++i)
235*30fdc8d8SChris Lattner             {
236*30fdc8d8SChris Lattner                 var_sp = variable_list.GetVariableAtIndex(i);
237*30fdc8d8SChris Lattner                 if (var_sp
238*30fdc8d8SChris Lattner                     && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))
239*30fdc8d8SChris Lattner                     && var_sp.get()->GetScope() == var_scope)
240*30fdc8d8SChris Lattner                     found = true;
241*30fdc8d8SChris Lattner             }
242*30fdc8d8SChris Lattner             if (!found)
243*30fdc8d8SChris Lattner                 var_sp.reset();
244*30fdc8d8SChris Lattner         }
245*30fdc8d8SChris Lattner     }
246*30fdc8d8SChris Lattner     SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
247*30fdc8d8SChris Lattner     return sb_value;
248*30fdc8d8SChris Lattner }
249*30fdc8d8SChris Lattner 
250*30fdc8d8SChris Lattner bool
251*30fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
252*30fdc8d8SChris Lattner {
253*30fdc8d8SChris Lattner     return m_lldb_object_sp.get() == rhs.m_lldb_object_sp.get();
254*30fdc8d8SChris Lattner }
255*30fdc8d8SChris Lattner 
256*30fdc8d8SChris Lattner bool
257*30fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
258*30fdc8d8SChris Lattner {
259*30fdc8d8SChris Lattner     return m_lldb_object_sp.get() != rhs.m_lldb_object_sp.get();
260*30fdc8d8SChris Lattner }
261*30fdc8d8SChris Lattner 
262*30fdc8d8SChris Lattner lldb_private::StackFrame *
263*30fdc8d8SChris Lattner SBFrame::operator->() const
264*30fdc8d8SChris Lattner {
265*30fdc8d8SChris Lattner     return m_lldb_object_sp.get();
266*30fdc8d8SChris Lattner }
267*30fdc8d8SChris Lattner 
268*30fdc8d8SChris Lattner lldb_private::StackFrame *
269*30fdc8d8SChris Lattner SBFrame::get() const
270*30fdc8d8SChris Lattner {
271*30fdc8d8SChris Lattner     return m_lldb_object_sp.get();
272*30fdc8d8SChris Lattner }
273*30fdc8d8SChris Lattner 
274*30fdc8d8SChris Lattner 
275*30fdc8d8SChris Lattner SBThread
276*30fdc8d8SChris Lattner SBFrame::GetThread () const
277*30fdc8d8SChris Lattner {
278*30fdc8d8SChris Lattner     SBThread sb_thread (m_lldb_object_sp->GetThread().GetSP());
279*30fdc8d8SChris Lattner     return sb_thread;
280*30fdc8d8SChris Lattner }
281*30fdc8d8SChris Lattner 
282*30fdc8d8SChris Lattner const char *
283*30fdc8d8SChris Lattner SBFrame::Disassemble () const
284*30fdc8d8SChris Lattner {
285*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
286*30fdc8d8SChris Lattner         return m_lldb_object_sp->Disassemble();
287*30fdc8d8SChris Lattner     return NULL;
288*30fdc8d8SChris Lattner }
289*30fdc8d8SChris Lattner 
290*30fdc8d8SChris Lattner 
291*30fdc8d8SChris Lattner 
292*30fdc8d8SChris Lattner lldb_private::StackFrame *
293*30fdc8d8SChris Lattner SBFrame::GetLLDBObjectPtr ()
294*30fdc8d8SChris Lattner {
295*30fdc8d8SChris Lattner     return m_lldb_object_sp.get();
296*30fdc8d8SChris Lattner }
297*30fdc8d8SChris Lattner 
298*30fdc8d8SChris Lattner SBValueList
299*30fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
300*30fdc8d8SChris Lattner                        bool locals,
301*30fdc8d8SChris Lattner                        bool statics,
302*30fdc8d8SChris Lattner                        bool in_scope_only)
303*30fdc8d8SChris Lattner {
304*30fdc8d8SChris Lattner     SBValueList value_list;
305*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
306*30fdc8d8SChris Lattner     {
307*30fdc8d8SChris Lattner         size_t i;
308*30fdc8d8SChris Lattner         VariableList *variable_list = m_lldb_object_sp->GetVariableList();
309*30fdc8d8SChris Lattner         if (variable_list)
310*30fdc8d8SChris Lattner         {
311*30fdc8d8SChris Lattner             const size_t num_variables = variable_list->GetSize();
312*30fdc8d8SChris Lattner             if (num_variables)
313*30fdc8d8SChris Lattner             {
314*30fdc8d8SChris Lattner                 for (i = 0; i < num_variables; ++i)
315*30fdc8d8SChris Lattner                 {
316*30fdc8d8SChris Lattner                     VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
317*30fdc8d8SChris Lattner                     if (variable_sp)
318*30fdc8d8SChris Lattner                     {
319*30fdc8d8SChris Lattner                         bool add_variable = false;
320*30fdc8d8SChris Lattner                         switch (variable_sp->GetScope())
321*30fdc8d8SChris Lattner                         {
322*30fdc8d8SChris Lattner                         case eValueTypeVariableGlobal:
323*30fdc8d8SChris Lattner                         case eValueTypeVariableStatic:
324*30fdc8d8SChris Lattner                             add_variable = statics;
325*30fdc8d8SChris Lattner                             break;
326*30fdc8d8SChris Lattner 
327*30fdc8d8SChris Lattner                         case eValueTypeVariableArgument:
328*30fdc8d8SChris Lattner                             add_variable = arguments;
329*30fdc8d8SChris Lattner                             break;
330*30fdc8d8SChris Lattner 
331*30fdc8d8SChris Lattner                         case eValueTypeVariableLocal:
332*30fdc8d8SChris Lattner                             add_variable = locals;
333*30fdc8d8SChris Lattner                             break;
334*30fdc8d8SChris Lattner                         }
335*30fdc8d8SChris Lattner                         if (add_variable)
336*30fdc8d8SChris Lattner                         {
337*30fdc8d8SChris Lattner                             if (in_scope_only && !variable_sp->IsInScope(m_lldb_object_sp.get()))
338*30fdc8d8SChris Lattner                                 continue;
339*30fdc8d8SChris Lattner 
340*30fdc8d8SChris Lattner                             value_list.Append(ValueObjectSP (new ValueObjectVariable (variable_sp)));
341*30fdc8d8SChris Lattner                         }
342*30fdc8d8SChris Lattner                     }
343*30fdc8d8SChris Lattner                 }
344*30fdc8d8SChris Lattner             }
345*30fdc8d8SChris Lattner         }
346*30fdc8d8SChris Lattner 
347*30fdc8d8SChris Lattner         if (statics)
348*30fdc8d8SChris Lattner         {
349*30fdc8d8SChris Lattner             CompileUnit *frame_comp_unit = m_lldb_object_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit;
350*30fdc8d8SChris Lattner 
351*30fdc8d8SChris Lattner             if (frame_comp_unit)
352*30fdc8d8SChris Lattner             {
353*30fdc8d8SChris Lattner                 variable_list = frame_comp_unit->GetVariableList(true).get();
354*30fdc8d8SChris Lattner 
355*30fdc8d8SChris Lattner                 if (variable_list)
356*30fdc8d8SChris Lattner                 {
357*30fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
358*30fdc8d8SChris Lattner                     if (num_variables)
359*30fdc8d8SChris Lattner                     {
360*30fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
361*30fdc8d8SChris Lattner                         {
362*30fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
363*30fdc8d8SChris Lattner                             if (variable_sp)
364*30fdc8d8SChris Lattner                             {
365*30fdc8d8SChris Lattner                                 value_list.Append(ValueObjectSP (new ValueObjectVariable (variable_sp)));
366*30fdc8d8SChris Lattner                             }
367*30fdc8d8SChris Lattner                         }
368*30fdc8d8SChris Lattner                     }
369*30fdc8d8SChris Lattner                 }
370*30fdc8d8SChris Lattner             }
371*30fdc8d8SChris Lattner         }
372*30fdc8d8SChris Lattner     }
373*30fdc8d8SChris Lattner     return value_list;
374*30fdc8d8SChris Lattner }
375*30fdc8d8SChris Lattner 
376*30fdc8d8SChris Lattner lldb::SBValueList
377*30fdc8d8SChris Lattner SBFrame::GetRegisters ()
378*30fdc8d8SChris Lattner {
379*30fdc8d8SChris Lattner     SBValueList value_list;
380*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
381*30fdc8d8SChris Lattner     {
382*30fdc8d8SChris Lattner         RegisterContext *reg_ctx = m_lldb_object_sp->GetRegisterContext();
383*30fdc8d8SChris Lattner         if (reg_ctx)
384*30fdc8d8SChris Lattner         {
385*30fdc8d8SChris Lattner             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
386*30fdc8d8SChris Lattner             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
387*30fdc8d8SChris Lattner             {
388*30fdc8d8SChris Lattner                 value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (reg_ctx, set_idx)));
389*30fdc8d8SChris Lattner             }
390*30fdc8d8SChris Lattner         }
391*30fdc8d8SChris Lattner     }
392*30fdc8d8SChris Lattner     return value_list;
393*30fdc8d8SChris Lattner }
394*30fdc8d8SChris Lattner 
395