blob: 9ca92fc9b6b686c64a5377d9596990d300c17aa7 [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"
19#include "lldb/Core/Stream.h"
20#include "lldb/Core/StreamFile.h"
21#include "lldb/Core/ValueObjectRegister.h"
22#include "lldb/Core/ValueObjectVariable.h"
Greg Claytond1719722010-10-05 03:13:51 +000023#include "lldb/Expression/ClangUserExpression.h"
Chris Lattner24943d22010-06-08 16:52:24 +000024#include "lldb/Symbol/Block.h"
25#include "lldb/Symbol/SymbolContext.h"
26#include "lldb/Symbol/VariableList.h"
27#include "lldb/Symbol/Variable.h"
28#include "lldb/Target/ExecutionContext.h"
29#include "lldb/Target/Target.h"
30#include "lldb/Target/Process.h"
31#include "lldb/Target/RegisterContext.h"
32#include "lldb/Target/StackFrame.h"
33#include "lldb/Target/Thread.h"
34
Eli Friedman7a62c8b2010-06-09 07:44:37 +000035#include "lldb/API/SBDebugger.h"
36#include "lldb/API/SBValue.h"
37#include "lldb/API/SBAddress.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000038#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000039#include "lldb/API/SBSymbolContext.h"
40#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000041
42using namespace lldb;
43using namespace lldb_private;
44
45SBFrame::SBFrame () :
Greg Clayton63094e02010-06-23 01:19:29 +000046 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000047{
48}
49
50SBFrame::SBFrame (const lldb::StackFrameSP &lldb_object_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000051 m_opaque_sp (lldb_object_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000052{
53}
54
55SBFrame::~SBFrame()
56{
57}
58
59
60void
61SBFrame::SetFrame (const lldb::StackFrameSP &lldb_object_sp)
62{
Greg Clayton63094e02010-06-23 01:19:29 +000063 m_opaque_sp = lldb_object_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000064}
65
66
67bool
68SBFrame::IsValid() const
69{
Greg Clayton63094e02010-06-23 01:19:29 +000070 return (m_opaque_sp.get() != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000071}
72
73SBSymbolContext
74SBFrame::GetSymbolContext (uint32_t resolve_scope) const
75{
76 SBSymbolContext sb_sym_ctx;
Greg Clayton63094e02010-06-23 01:19:29 +000077 if (m_opaque_sp)
78 sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope));
Chris Lattner24943d22010-06-08 16:52:24 +000079 return sb_sym_ctx;
80}
81
82SBModule
83SBFrame::GetModule () const
84{
Greg Clayton63094e02010-06-23 01:19:29 +000085 SBModule sb_module (m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp);
Chris Lattner24943d22010-06-08 16:52:24 +000086 return sb_module;
87}
88
89SBCompileUnit
90SBFrame::GetCompileUnit () const
91{
Greg Clayton63094e02010-06-23 01:19:29 +000092 SBCompileUnit sb_comp_unit(m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
Chris Lattner24943d22010-06-08 16:52:24 +000093 return sb_comp_unit;
94}
95
96SBFunction
97SBFrame::GetFunction () const
98{
Greg Clayton63094e02010-06-23 01:19:29 +000099 SBFunction sb_function(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function);
Chris Lattner24943d22010-06-08 16:52:24 +0000100 return sb_function;
101}
102
Greg Clayton8f1e08b2010-10-04 18:37:52 +0000103SBSymbol
104SBFrame::GetSymbol () const
105{
106 SBSymbol sb_symbol(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol);
107 return sb_symbol;
108}
109
Chris Lattner24943d22010-06-08 16:52:24 +0000110SBBlock
111SBFrame::GetBlock () const
112{
Greg Clayton63094e02010-06-23 01:19:29 +0000113 SBBlock sb_block(m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block);
Chris Lattner24943d22010-06-08 16:52:24 +0000114 return sb_block;
115}
116
Greg Clayton69aa5d92010-09-07 04:20:48 +0000117SBBlock
118SBFrame::GetFrameBlock () const
119{
120 SBBlock sb_block(m_opaque_sp->GetFrameBlock ());
121 return sb_block;
122}
123
Chris Lattner24943d22010-06-08 16:52:24 +0000124SBLineEntry
125SBFrame::GetLineEntry () const
126{
Greg Clayton63094e02010-06-23 01:19:29 +0000127 SBLineEntry sb_line_entry(&m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
Chris Lattner24943d22010-06-08 16:52:24 +0000128 return sb_line_entry;
129}
130
131uint32_t
132SBFrame::GetFrameID () const
133{
Greg Clayton63094e02010-06-23 01:19:29 +0000134 if (m_opaque_sp)
Greg Clayton33ed1702010-08-24 00:45:41 +0000135 return m_opaque_sp->GetFrameIndex ();
Chris Lattner24943d22010-06-08 16:52:24 +0000136 else
137 return UINT32_MAX;
138}
139
Chris Lattner24943d22010-06-08 16:52:24 +0000140lldb::addr_t
141SBFrame::GetPC () const
142{
Greg Clayton63094e02010-06-23 01:19:29 +0000143 if (m_opaque_sp)
Greg Claytoneea26402010-09-14 23:36:40 +0000144 return m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget());
Chris Lattner24943d22010-06-08 16:52:24 +0000145 return LLDB_INVALID_ADDRESS;
146}
147
148bool
149SBFrame::SetPC (lldb::addr_t new_pc)
150{
Greg Clayton63094e02010-06-23 01:19:29 +0000151 if (m_opaque_sp)
152 return m_opaque_sp->GetRegisterContext()->SetPC (new_pc);
Chris Lattner24943d22010-06-08 16:52:24 +0000153 return false;
154}
155
156lldb::addr_t
157SBFrame::GetSP () const
158{
Greg Clayton63094e02010-06-23 01:19:29 +0000159 if (m_opaque_sp)
160 return m_opaque_sp->GetRegisterContext()->GetSP();
Chris Lattner24943d22010-06-08 16:52:24 +0000161 return LLDB_INVALID_ADDRESS;
162}
163
164
165lldb::addr_t
166SBFrame::GetFP () const
167{
Greg Clayton63094e02010-06-23 01:19:29 +0000168 if (m_opaque_sp)
169 return m_opaque_sp->GetRegisterContext()->GetFP();
Chris Lattner24943d22010-06-08 16:52:24 +0000170 return LLDB_INVALID_ADDRESS;
171}
172
173
174SBAddress
175SBFrame::GetPCAddress () const
176{
177 SBAddress sb_addr;
Greg Clayton63094e02010-06-23 01:19:29 +0000178 if (m_opaque_sp)
Greg Claytonb04e7a82010-08-24 21:05:24 +0000179 sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress());
Chris Lattner24943d22010-06-08 16:52:24 +0000180 return sb_addr;
181}
182
183void
184SBFrame::Clear()
185{
Greg Clayton63094e02010-06-23 01:19:29 +0000186 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000187}
188
189SBValue
190SBFrame::LookupVar (const char *var_name)
191{
192 lldb::VariableSP var_sp;
193 if (IsValid ())
194 {
195 lldb_private::VariableList variable_list;
196 SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
197
198 SBBlock block = sc.GetBlock();
199 if (block.IsValid())
200 block.AppendVariables (true, true, &variable_list);
201
202 const uint32_t num_variables = variable_list.GetSize();
203
204 bool found = false;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000205 for (uint32_t i = 0; i < num_variables && !found; ++i)
Chris Lattner24943d22010-06-08 16:52:24 +0000206 {
207 var_sp = variable_list.GetVariableAtIndex(i);
208 if (var_sp
209 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)))
210 found = true;
211 }
212 if (!found)
213 var_sp.reset();
214 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000215 if (var_sp)
216 {
217 SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
218 return sb_value;
219 }
220
221 SBValue sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000222 return sb_value;
223}
224
225SBValue
226SBFrame::LookupVarInScope (const char *var_name, const char *scope)
227{
228 lldb::VariableSP var_sp;
229 if (IsValid())
230 {
231 std::string scope_str = scope;
232 lldb::ValueType var_scope = eValueTypeInvalid;
233 // Convert scope_str to be all lowercase;
234 std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower);
235
236 if (scope_str.compare ("global") == 0)
237 var_scope = eValueTypeVariableGlobal;
238 else if (scope_str.compare ("local") == 0)
239 var_scope = eValueTypeVariableLocal;
240 else if (scope_str.compare ("parameter") == 0)
241 var_scope = eValueTypeVariableArgument;
242
243 if (var_scope != eValueTypeInvalid)
244 {
245 lldb_private::VariableList variable_list;
246 SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
247
248 SBBlock block = sc.GetBlock();
249 if (block.IsValid())
250 block.AppendVariables (true, true, &variable_list);
251
252 const uint32_t num_variables = variable_list.GetSize();
253
254 bool found = false;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000255 for (uint32_t i = 0; i < num_variables && !found; ++i)
Chris Lattner24943d22010-06-08 16:52:24 +0000256 {
257 var_sp = variable_list.GetVariableAtIndex(i);
258 if (var_sp
259 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))
260 && var_sp.get()->GetScope() == var_scope)
261 found = true;
262 }
263 if (!found)
264 var_sp.reset();
265 }
266 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000267
268 if (var_sp)
269 {
270 SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp)));
271 return sb_value;
272 }
273
274 SBValue sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000275 return sb_value;
276}
277
278bool
279SBFrame::operator == (const SBFrame &rhs) const
280{
Greg Clayton63094e02010-06-23 01:19:29 +0000281 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000282}
283
284bool
285SBFrame::operator != (const SBFrame &rhs) const
286{
Greg Clayton63094e02010-06-23 01:19:29 +0000287 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000288}
289
290lldb_private::StackFrame *
291SBFrame::operator->() const
292{
Greg Clayton63094e02010-06-23 01:19:29 +0000293 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000294}
295
296lldb_private::StackFrame *
297SBFrame::get() const
298{
Greg Clayton63094e02010-06-23 01:19:29 +0000299 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000300}
301
302
303SBThread
304SBFrame::GetThread () const
305{
Greg Clayton63094e02010-06-23 01:19:29 +0000306 SBThread sb_thread (m_opaque_sp->GetThread().GetSP());
Chris Lattner24943d22010-06-08 16:52:24 +0000307 return sb_thread;
308}
309
310const char *
311SBFrame::Disassemble () const
312{
Greg Clayton63094e02010-06-23 01:19:29 +0000313 if (m_opaque_sp)
314 return m_opaque_sp->Disassemble();
Chris Lattner24943d22010-06-08 16:52:24 +0000315 return NULL;
316}
317
318
319
320lldb_private::StackFrame *
321SBFrame::GetLLDBObjectPtr ()
322{
Greg Clayton63094e02010-06-23 01:19:29 +0000323 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000324}
325
326SBValueList
327SBFrame::GetVariables (bool arguments,
328 bool locals,
329 bool statics,
330 bool in_scope_only)
331{
332 SBValueList value_list;
Greg Clayton63094e02010-06-23 01:19:29 +0000333 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000334 {
335 size_t i;
Greg Clayton17dae082010-09-02 02:59:18 +0000336 VariableList *variable_list = m_opaque_sp->GetVariableList(true);
Chris Lattner24943d22010-06-08 16:52:24 +0000337 if (variable_list)
338 {
339 const size_t num_variables = variable_list->GetSize();
340 if (num_variables)
341 {
342 for (i = 0; i < num_variables; ++i)
343 {
344 VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
345 if (variable_sp)
346 {
347 bool add_variable = false;
348 switch (variable_sp->GetScope())
349 {
350 case eValueTypeVariableGlobal:
351 case eValueTypeVariableStatic:
352 add_variable = statics;
353 break;
354
355 case eValueTypeVariableArgument:
356 add_variable = arguments;
357 break;
358
359 case eValueTypeVariableLocal:
360 add_variable = locals;
361 break;
Greg Clayton54e7afa2010-07-09 20:39:50 +0000362
363 default:
364 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000365 }
366 if (add_variable)
367 {
Greg Clayton63094e02010-06-23 01:19:29 +0000368 if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get()))
Chris Lattner24943d22010-06-08 16:52:24 +0000369 continue;
370
Greg Clayton17dae082010-09-02 02:59:18 +0000371 value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp));
Chris Lattner24943d22010-06-08 16:52:24 +0000372 }
373 }
374 }
375 }
Greg Clayton17dae082010-09-02 02:59:18 +0000376 }
Chris Lattner24943d22010-06-08 16:52:24 +0000377 }
378 return value_list;
379}
380
381lldb::SBValueList
382SBFrame::GetRegisters ()
383{
384 SBValueList value_list;
Greg Clayton63094e02010-06-23 01:19:29 +0000385 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000386 {
Greg Clayton63094e02010-06-23 01:19:29 +0000387 RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext();
Chris Lattner24943d22010-06-08 16:52:24 +0000388 if (reg_ctx)
389 {
390 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
391 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
392 {
393 value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (reg_ctx, set_idx)));
394 }
395 }
396 }
397 return value_list;
398}
399
Caroline Tice98f930f2010-09-20 05:20:02 +0000400bool
401SBFrame::GetDescription (SBStream &description)
402{
403 if (m_opaque_sp)
404 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000405 description.ref();
Greg Claytona830adb2010-10-04 01:05:56 +0000406 m_opaque_sp->DumpUsingSettingsFormat (description.get());
Caroline Tice98f930f2010-09-20 05:20:02 +0000407 }
408 else
409 description.Printf ("No value");
410
411 return true;
412}
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000413
414lldb::SBValue
415SBFrame::EvaluateExpression (const char *expr)
416{
417 lldb::SBValue expr_result_value;
418 if (m_opaque_sp)
419 {
Greg Claytond1719722010-10-05 03:13:51 +0000420 ExecutionContext exe_ctx;
421 m_opaque_sp->CalculateExecutionContext (exe_ctx);
422 *expr_result_value = ClangUserExpression::Evaluate (exe_ctx, expr);
Greg Clayton66ed2fb2010-10-05 00:00:42 +0000423 }
424 return expr_result_value;
425}