blob: 7d0a03f7103fd4ae5b000110fdc1899c0833b147 [file] [log] [blame]
Chris Lattner30fdc8d2010-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 Friedman4c5de692010-06-09 07:44:37 +000010#include "lldb/API/SBFrame.h"
Chris Lattner30fdc8d2010-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 Ticeceb6b132010-10-26 03:11:13 +000019#include "lldb/Core/Log.h"
Chris Lattner30fdc8d2010-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 Claytonb71f3842010-10-05 03:13:51 +000024#include "lldb/Expression/ClangUserExpression.h"
Greg Clayton1ba7c4d2011-06-25 04:35:01 +000025#include "lldb/Host/Host.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026#include "lldb/Symbol/Block.h"
Greg Clayton1f746072012-08-29 21:13:06 +000027#include "lldb/Symbol/Function.h"
28#include "lldb/Symbol/Symbol.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029#include "lldb/Symbol/SymbolContext.h"
30#include "lldb/Symbol/VariableList.h"
31#include "lldb/Symbol/Variable.h"
32#include "lldb/Target/ExecutionContext.h"
33#include "lldb/Target/Target.h"
34#include "lldb/Target/Process.h"
35#include "lldb/Target/RegisterContext.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000036#include "lldb/Target/StackFrame.h"
Greg Claytonb9556ac2012-01-30 07:41:31 +000037#include "lldb/Target/StackID.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038#include "lldb/Target/Thread.h"
39
Eli Friedman4c5de692010-06-09 07:44:37 +000040#include "lldb/API/SBDebugger.h"
41#include "lldb/API/SBValue.h"
42#include "lldb/API/SBAddress.h"
Jim Ingham35e1bda2012-10-16 21:41:58 +000043#include "lldb/API/SBExpressionOptions.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000044#include "lldb/API/SBStream.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000045#include "lldb/API/SBSymbolContext.h"
46#include "lldb/API/SBThread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047
48using namespace lldb;
49using namespace lldb_private;
50
Greg Claytonb9556ac2012-01-30 07:41:31 +000051
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052SBFrame::SBFrame () :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000053 m_opaque_sp (new ExecutionContextRef())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000054{
55}
56
Jason Molendab57e4a12013-11-04 09:33:30 +000057SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000058 m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059{
Greg Clayton5160ce52013-03-27 23:08:40 +000060 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000061
62 if (log)
63 {
64 SBStream sstr;
65 GetDescription (sstr);
Greg Clayton48381312010-10-30 04:51:46 +000066 log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
Greg Claytonb9556ac2012-01-30 07:41:31 +000067 lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
Caroline Tice750cd172010-10-26 23:49:36 +000068
Caroline Ticeceb6b132010-10-26 03:11:13 +000069 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000070}
71
Greg Claytonefabb122010-11-05 23:17:00 +000072SBFrame::SBFrame(const SBFrame &rhs) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000073 m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
Greg Claytonefabb122010-11-05 23:17:00 +000074{
75}
76
77const SBFrame &
78SBFrame::operator = (const SBFrame &rhs)
79{
80 if (this != &rhs)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000081 *m_opaque_sp = *rhs.m_opaque_sp;
Greg Claytonefabb122010-11-05 23:17:00 +000082 return *this;
83}
84
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085SBFrame::~SBFrame()
86{
87}
88
Jason Molendab57e4a12013-11-04 09:33:30 +000089StackFrameSP
Greg Claytonb9556ac2012-01-30 07:41:31 +000090SBFrame::GetFrameSP() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +000091{
Greg Claytonaf2589e2012-04-12 20:58:26 +000092 if (m_opaque_sp)
93 return m_opaque_sp->GetFrameSP();
Jason Molendab57e4a12013-11-04 09:33:30 +000094 return StackFrameSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095}
96
Greg Claytonb9556ac2012-01-30 07:41:31 +000097void
Jason Molendab57e4a12013-11-04 09:33:30 +000098SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
Greg Claytonb9556ac2012-01-30 07:41:31 +000099{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000100 return m_opaque_sp->SetFrameSP(lldb_object_sp);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000101}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102
103bool
104SBFrame::IsValid() const
105{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000106 return GetFrameSP().get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000107}
108
109SBSymbolContext
110SBFrame::GetSymbolContext (uint32_t resolve_scope) const
111{
Greg Clayton5160ce52013-03-27 23:08:40 +0000112 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000113 SBSymbolContext sb_sym_ctx;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000114 Mutex::Locker api_locker;
115 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
116
Jason Molendab57e4a12013-11-04 09:33:30 +0000117 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000118 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000119 Process *process = exe_ctx.GetProcessPtr();
120 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000121 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000122 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000123 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000124 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000125 frame = exe_ctx.GetFramePtr();
126 if (frame)
127 {
128 sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
129 }
130 else
131 {
132 if (log)
133 log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
134 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000135 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000136 else
137 {
138 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000139 log->Printf ("SBFrame::GetSymbolContext () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000140 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000141 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000142
143 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000144 log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000145 frame, resolve_scope, sb_sym_ctx.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000146
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000147 return sb_sym_ctx;
148}
149
150SBModule
151SBFrame::GetModule () const
152{
Greg Clayton5160ce52013-03-27 23:08:40 +0000153 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton72eff182010-12-14 04:58:53 +0000154 SBModule sb_module;
Greg Claytonacdbe812012-01-30 09:04:36 +0000155 ModuleSP module_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000156 Mutex::Locker api_locker;
157 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
158
Jason Molendab57e4a12013-11-04 09:33:30 +0000159 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000160 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000161 Process *process = exe_ctx.GetProcessPtr();
162 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000163 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000164 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000165 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000166 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000167 frame = exe_ctx.GetFramePtr();
168 if (frame)
169 {
170 module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
171 sb_module.SetSP (module_sp);
172 }
173 else
174 {
175 if (log)
176 log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame.");
177 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000178 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000179 else
180 {
181 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000182 log->Printf ("SBFrame::GetModule () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000183 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000184 }
Greg Clayton72eff182010-12-14 04:58:53 +0000185
Greg Clayton48381312010-10-30 04:51:46 +0000186 if (log)
187 log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000188 frame, module_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000189
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000190 return sb_module;
191}
192
193SBCompileUnit
194SBFrame::GetCompileUnit () const
195{
Greg Clayton5160ce52013-03-27 23:08:40 +0000196 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton72eff182010-12-14 04:58:53 +0000197 SBCompileUnit sb_comp_unit;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000198 Mutex::Locker api_locker;
199 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
200
Jason Molendab57e4a12013-11-04 09:33:30 +0000201 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000202 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000203 Process *process = exe_ctx.GetProcessPtr();
204 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000205 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000206 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000207 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000208 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000209 frame = exe_ctx.GetFramePtr();
210 if (frame)
211 {
212 sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
213 }
214 else
215 {
216 if (log)
217 log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame.");
218 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000219 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000220 else
221 {
222 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000223 log->Printf ("SBFrame::GetCompileUnit () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000224 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000225 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000226 if (log)
Greg Claytonc9858e42012-04-06 02:17:47 +0000227 log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000228 frame, sb_comp_unit.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000229
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000230 return sb_comp_unit;
231}
232
233SBFunction
234SBFrame::GetFunction () const
235{
Greg Clayton5160ce52013-03-27 23:08:40 +0000236 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton72eff182010-12-14 04:58:53 +0000237 SBFunction sb_function;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000238 Mutex::Locker api_locker;
239 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
240
Jason Molendab57e4a12013-11-04 09:33:30 +0000241 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000242 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000243 Process *process = exe_ctx.GetProcessPtr();
244 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000245 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000246 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000247 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000248 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000249 frame = exe_ctx.GetFramePtr();
250 if (frame)
251 {
252 sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
253 }
254 else
255 {
256 if (log)
257 log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame.");
258 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000259 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000260 else
261 {
262 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000263 log->Printf ("SBFrame::GetFunction () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000264 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000265 }
Greg Clayton48381312010-10-30 04:51:46 +0000266 if (log)
267 log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000268 frame, sb_function.get());
Greg Clayton48381312010-10-30 04:51:46 +0000269
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000270 return sb_function;
271}
272
Greg Clayton3b065572010-10-04 18:37:52 +0000273SBSymbol
274SBFrame::GetSymbol () const
275{
Greg Clayton5160ce52013-03-27 23:08:40 +0000276 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton72eff182010-12-14 04:58:53 +0000277 SBSymbol sb_symbol;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000278 Mutex::Locker api_locker;
279 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
280
Jason Molendab57e4a12013-11-04 09:33:30 +0000281 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000282 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000283 Process *process = exe_ctx.GetProcessPtr();
284 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000285 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000286 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000287 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000288 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000289 frame = exe_ctx.GetFramePtr();
290 if (frame)
291 {
292 sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
293 }
294 else
295 {
296 if (log)
297 log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame.");
298 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000299 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000300 else
301 {
302 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000303 log->Printf ("SBFrame::GetSymbol () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000304 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000305 }
Greg Clayton48381312010-10-30 04:51:46 +0000306 if (log)
307 log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000308 frame, sb_symbol.get());
Greg Clayton3b065572010-10-04 18:37:52 +0000309 return sb_symbol;
310}
311
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000312SBBlock
313SBFrame::GetBlock () const
314{
Greg Clayton5160ce52013-03-27 23:08:40 +0000315 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton72eff182010-12-14 04:58:53 +0000316 SBBlock sb_block;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000317 Mutex::Locker api_locker;
318 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
319
Jason Molendab57e4a12013-11-04 09:33:30 +0000320 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000321 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000322 Process *process = exe_ctx.GetProcessPtr();
323 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000324 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000325 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000326 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000327 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000328 frame = exe_ctx.GetFramePtr();
329 if (frame)
330 {
331 sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
332 }
333 else
334 {
335 if (log)
336 log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame.");
337 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000338 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000339 else
340 {
341 if (log)
342 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
343 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000344 }
Greg Clayton48381312010-10-30 04:51:46 +0000345 if (log)
346 log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000347 frame, sb_block.GetPtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000348 return sb_block;
349}
350
Greg Clayton95897c62010-09-07 04:20:48 +0000351SBBlock
352SBFrame::GetFrameBlock () const
353{
Greg Clayton72eff182010-12-14 04:58:53 +0000354 SBBlock sb_block;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000355 Mutex::Locker api_locker;
356 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
357
Jason Molendab57e4a12013-11-04 09:33:30 +0000358 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000359 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton5160ce52013-03-27 23:08:40 +0000360 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham7730b9a2012-11-29 00:26:19 +0000361 Process *process = exe_ctx.GetProcessPtr();
362 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000363 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000364 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000365 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000366 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000367 frame = exe_ctx.GetFramePtr();
368 if (frame)
369 {
370 sb_block.SetPtr(frame->GetFrameBlock ());
371 }
372 else
373 {
374 if (log)
375 log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame.");
376 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000377 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000378 else
379 {
380 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000381 log->Printf ("SBFrame::GetFrameBlock () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000382 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000383 }
Greg Clayton48381312010-10-30 04:51:46 +0000384 if (log)
385 log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000386 frame, sb_block.GetPtr());
Greg Clayton95897c62010-09-07 04:20:48 +0000387 return sb_block;
388}
389
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390SBLineEntry
391SBFrame::GetLineEntry () const
392{
Greg Clayton5160ce52013-03-27 23:08:40 +0000393 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton72eff182010-12-14 04:58:53 +0000394 SBLineEntry sb_line_entry;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000395 Mutex::Locker api_locker;
396 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
397
Jason Molendab57e4a12013-11-04 09:33:30 +0000398 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000399 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000400 Process *process = exe_ctx.GetProcessPtr();
401 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000402 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000403 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000404 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000405 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000406 frame = exe_ctx.GetFramePtr();
407 if (frame)
408 {
409 sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
410 }
411 else
412 {
413 if (log)
414 log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame.");
415 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000416 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000417 else
418 {
419 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000420 log->Printf ("SBFrame::GetLineEntry () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000421 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000422 }
Greg Clayton48381312010-10-30 04:51:46 +0000423 if (log)
424 log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000425 frame, sb_line_entry.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000426 return sb_line_entry;
427}
428
429uint32_t
430SBFrame::GetFrameID () const
431{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000432 uint32_t frame_idx = UINT32_MAX;
433
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000434 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +0000435 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000436 if (frame)
Greg Claytond9e416c2012-02-18 05:35:26 +0000437 frame_idx = frame->GetFrameIndex ();
Greg Clayton48381312010-10-30 04:51:46 +0000438
Greg Clayton5160ce52013-03-27 23:08:40 +0000439 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000440 if (log)
441 log->Printf ("SBFrame(%p)::GetFrameID () => %u",
Greg Claytond9e416c2012-02-18 05:35:26 +0000442 frame, frame_idx);
Greg Clayton48381312010-10-30 04:51:46 +0000443 return frame_idx;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000444}
445
Greg Clayton69b582f2010-12-14 18:39:31 +0000446addr_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000447SBFrame::GetPC () const
448{
Greg Clayton5160ce52013-03-27 23:08:40 +0000449 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton69b582f2010-12-14 18:39:31 +0000450 addr_t addr = LLDB_INVALID_ADDRESS;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000451 Mutex::Locker api_locker;
452 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
453
Jason Molendab57e4a12013-11-04 09:33:30 +0000454 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000455 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000456 Process *process = exe_ctx.GetProcessPtr();
457 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000458 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000459 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000460 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000461 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000462 frame = exe_ctx.GetFramePtr();
463 if (frame)
464 {
465 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
466 }
467 else
468 {
469 if (log)
470 log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
471 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000472 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000473 else
474 {
475 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000476 log->Printf ("SBFrame::GetPC () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000477 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000478 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000479
480 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000481 log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, frame, addr);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000482
483 return addr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000484}
485
486bool
Greg Clayton69b582f2010-12-14 18:39:31 +0000487SBFrame::SetPC (addr_t new_pc)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000488{
Greg Clayton5160ce52013-03-27 23:08:40 +0000489 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000490 bool ret_val = false;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000491 Mutex::Locker api_locker;
492 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
493
Jason Molendab57e4a12013-11-04 09:33:30 +0000494 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000495 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000496 Process *process = exe_ctx.GetProcessPtr();
497 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000498 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000499 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000500 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000501 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000502 frame = exe_ctx.GetFramePtr();
503 if (frame)
504 {
505 ret_val = frame->GetRegisterContext()->SetPC (new_pc);
506 }
507 else
508 {
509 if (log)
510 log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
511 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000512 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000513 else
514 {
515 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000516 log->Printf ("SBFrame::SetPC () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000517 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000518 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000519
520 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000521 log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
Greg Claytond9e416c2012-02-18 05:35:26 +0000522 frame, new_pc, ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000523
524 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000525}
526
Greg Clayton69b582f2010-12-14 18:39:31 +0000527addr_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000528SBFrame::GetSP () const
529{
Greg Clayton5160ce52013-03-27 23:08:40 +0000530 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000531 addr_t addr = LLDB_INVALID_ADDRESS;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000532 Mutex::Locker api_locker;
533 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
534
Jason Molendab57e4a12013-11-04 09:33:30 +0000535 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000536 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000537 Process *process = exe_ctx.GetProcessPtr();
538 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000539 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000540 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000541 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000542 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000543 frame = exe_ctx.GetFramePtr();
544 if (frame)
545 {
546 addr = frame->GetRegisterContext()->GetSP();
547 }
548 else
549 {
550 if (log)
551 log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
552 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000553 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000554 else
555 {
556 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000557 log->Printf ("SBFrame::GetSP () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000558 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000559 }
Greg Clayton48381312010-10-30 04:51:46 +0000560 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000561 log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, frame, addr);
Greg Clayton48381312010-10-30 04:51:46 +0000562
563 return addr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000564}
565
566
Greg Clayton69b582f2010-12-14 18:39:31 +0000567addr_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000568SBFrame::GetFP () const
569{
Greg Clayton5160ce52013-03-27 23:08:40 +0000570 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton69b582f2010-12-14 18:39:31 +0000571 addr_t addr = LLDB_INVALID_ADDRESS;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000572 Mutex::Locker api_locker;
573 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
574
Jason Molendab57e4a12013-11-04 09:33:30 +0000575 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000576 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000577 Process *process = exe_ctx.GetProcessPtr();
578 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000579 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000580 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000581 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000582 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000583 frame = exe_ctx.GetFramePtr();
584 if (frame)
585 {
586 addr = frame->GetRegisterContext()->GetFP();
587 }
588 else
589 {
590 if (log)
591 log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
592 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000593 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000594 else
595 {
596 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000597 log->Printf ("SBFrame::GetFP () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000598 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000599 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000600
601 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000602 log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, frame, addr);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000603 return addr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000604}
605
606
607SBAddress
608SBFrame::GetPCAddress () const
609{
Greg Clayton5160ce52013-03-27 23:08:40 +0000610 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000611 SBAddress sb_addr;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000612 Mutex::Locker api_locker;
613 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
614
Jason Molendab57e4a12013-11-04 09:33:30 +0000615 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytond9e416c2012-02-18 05:35:26 +0000616 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000617 Process *process = exe_ctx.GetProcessPtr();
618 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000619 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000620 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000621 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000622 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000623 frame = exe_ctx.GetFramePtr();
624 if (frame)
625 {
626 sb_addr.SetAddress (&frame->GetFrameCodeAddress());
627 }
628 else
629 {
630 if (log)
631 log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
632 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000633 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000634 else
635 {
636 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000637 log->Printf ("SBFrame::GetPCAddress () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000638 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000639 }
Greg Clayton48381312010-10-30 04:51:46 +0000640 if (log)
Greg Claytond9e416c2012-02-18 05:35:26 +0000641 log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000642 return sb_addr;
643}
644
645void
646SBFrame::Clear()
647{
Greg Claytonaf2589e2012-04-12 20:58:26 +0000648 m_opaque_sp->Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000649}
650
Greg Clayton7edbdfc2012-02-03 07:02:37 +0000651lldb::SBValue
652SBFrame::GetValueForVariablePath (const char *var_path)
653{
654 SBValue sb_value;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000655 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +0000656 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytond9e416c2012-02-18 05:35:26 +0000657 Target *target = exe_ctx.GetTargetPtr();
658 if (frame && target)
Greg Clayton7edbdfc2012-02-03 07:02:37 +0000659 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000660 lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
661 sb_value = GetValueForVariablePath (var_path, use_dynamic);
Greg Clayton7edbdfc2012-02-03 07:02:37 +0000662 }
663 return sb_value;
664}
665
666lldb::SBValue
667SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
668{
669 SBValue sb_value;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000670 Mutex::Locker api_locker;
Greg Clayton5160ce52013-03-27 23:08:40 +0000671 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham7730b9a2012-11-29 00:26:19 +0000672 if (var_path == NULL || var_path[0] == '\0')
673 {
674 if (log)
675 log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
676 return sb_value;
677 }
678
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000679 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
680
Jason Molendab57e4a12013-11-04 09:33:30 +0000681 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000682 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000683 Process *process = exe_ctx.GetProcessPtr();
684 if (target && process)
Greg Clayton7edbdfc2012-02-03 07:02:37 +0000685 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000686 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000687 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000688 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000689 frame = exe_ctx.GetFramePtr();
690 if (frame)
691 {
692 VariableSP var_sp;
693 Error error;
694 ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
695 eNoDynamicValues,
Jason Molendab57e4a12013-11-04 09:33:30 +0000696 StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
Jim Ingham7730b9a2012-11-29 00:26:19 +0000697 var_sp,
698 error));
699 sb_value.SetSP(value_sp, use_dynamic);
700 }
701 else
702 {
703 if (log)
704 log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
705 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000706 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000707 else
708 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000709 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000710 log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000711 }
Greg Clayton7edbdfc2012-02-03 07:02:37 +0000712 }
713 return sb_value;
714}
715
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000716SBValue
Greg Clayton69b582f2010-12-14 18:39:31 +0000717SBFrame::FindVariable (const char *name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000718{
Greg Clayton316d4982011-06-18 20:06:08 +0000719 SBValue value;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000720 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +0000721 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytond9e416c2012-02-18 05:35:26 +0000722 Target *target = exe_ctx.GetTargetPtr();
723 if (frame && target)
Greg Clayton316d4982011-06-18 20:06:08 +0000724 {
Greg Claytond9e416c2012-02-18 05:35:26 +0000725 lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
Greg Clayton316d4982011-06-18 20:06:08 +0000726 value = FindVariable (name, use_dynamic);
727 }
728 return value;
Jim Ingham78a685a2011-04-16 00:01:13 +0000729}
Greg Clayton7edbdfc2012-02-03 07:02:37 +0000730
Jim Ingham78a685a2011-04-16 00:01:13 +0000731
732SBValue
Jim Ingham2837b762011-05-04 03:43:18 +0000733SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
Jim Ingham78a685a2011-04-16 00:01:13 +0000734{
Greg Clayton5160ce52013-03-27 23:08:40 +0000735 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton69b582f2010-12-14 18:39:31 +0000736 VariableSP var_sp;
Jim Ingham58b59f92011-04-22 23:53:53 +0000737 SBValue sb_value;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000738
739 if (name == NULL || name[0] == '\0')
740 {
741 if (log)
742 log->Printf ("SBFrame::FindVariable called with empty name");
743 return sb_value;
744 }
745
Greg Clayton81e871e2012-02-04 02:27:34 +0000746 ValueObjectSP value_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000747 Mutex::Locker api_locker;
748 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
749
Jason Molendab57e4a12013-11-04 09:33:30 +0000750 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000751 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000752 Process *process = exe_ctx.GetProcessPtr();
753 if (target && process)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000754 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000755 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000756 if (stop_locker.TryLock(&process->GetRunLock()))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000757 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000758 frame = exe_ctx.GetFramePtr();
759 if (frame)
Greg Clayton72eff182010-12-14 04:58:53 +0000760 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000761 VariableList variable_list;
762 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
763
764 if (sc.block)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000765 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000766 const bool can_create = true;
767 const bool get_parent_variables = true;
768 const bool stop_if_block_is_inlined_function = true;
769
770 if (sc.block->AppendVariables (can_create,
771 get_parent_variables,
772 stop_if_block_is_inlined_function,
773 &variable_list))
774 {
775 var_sp = variable_list.FindVariable (ConstString(name));
776 }
777 }
778
779 if (var_sp)
780 {
781 value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
782 sb_value.SetSP(value_sp, use_dynamic);
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000783 }
784 }
Jim Ingham7730b9a2012-11-29 00:26:19 +0000785 else
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000786 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000787 if (log)
788 log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
Greg Clayton72eff182010-12-14 04:58:53 +0000789 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000790 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000791 else
792 {
793 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000794 log->Printf ("SBFrame::FindVariable () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000795 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000796 }
Caroline Ticedde9cff2010-09-20 05:20:02 +0000797
Greg Clayton48381312010-10-30 04:51:46 +0000798 if (log)
Greg Clayton69b582f2010-12-14 18:39:31 +0000799 log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000800 frame, name, value_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000801
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000802 return sb_value;
803}
804
805SBValue
Greg Clayton69b582f2010-12-14 18:39:31 +0000806SBFrame::FindValue (const char *name, ValueType value_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000807{
Greg Clayton316d4982011-06-18 20:06:08 +0000808 SBValue value;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000809 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +0000810 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytond9e416c2012-02-18 05:35:26 +0000811 Target *target = exe_ctx.GetTargetPtr();
812 if (frame && target)
Greg Clayton316d4982011-06-18 20:06:08 +0000813 {
Greg Claytond9e416c2012-02-18 05:35:26 +0000814 lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
Greg Clayton316d4982011-06-18 20:06:08 +0000815 value = FindValue (name, value_type, use_dynamic);
816 }
817 return value;
Jim Ingham78a685a2011-04-16 00:01:13 +0000818}
819
820SBValue
Jim Ingham2837b762011-05-04 03:43:18 +0000821SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
Jim Ingham78a685a2011-04-16 00:01:13 +0000822{
Greg Clayton5160ce52013-03-27 23:08:40 +0000823 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton69b582f2010-12-14 18:39:31 +0000824 SBValue sb_value;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000825
826 if (name == NULL || name[0] == '\0')
827 {
828 if (log)
829 log->Printf ("SBFrame::FindValue called with empty name.");
830 return sb_value;
831 }
832
Greg Clayton81e871e2012-02-04 02:27:34 +0000833 ValueObjectSP value_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000834 Mutex::Locker api_locker;
835 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
836
Jason Molendab57e4a12013-11-04 09:33:30 +0000837 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +0000838 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +0000839 Process *process = exe_ctx.GetProcessPtr();
840 if (target && process)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000841 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000842 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000843 if (stop_locker.TryLock(&process->GetRunLock()))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000844 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000845 frame = exe_ctx.GetFramePtr();
846 if (frame)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000847 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000848 switch (value_type)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000849 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000850 case eValueTypeVariableGlobal: // global variable
851 case eValueTypeVariableStatic: // static variable
852 case eValueTypeVariableArgument: // function argument variables
853 case eValueTypeVariableLocal: // function local variables
854 {
Enrico Granata08a04322014-02-18 23:48:11 +0000855 VariableList variable_list;
Greg Clayton69b582f2010-12-14 18:39:31 +0000856
Jim Ingham7730b9a2012-11-29 00:26:19 +0000857 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
Greg Clayton69b582f2010-12-14 18:39:31 +0000858
Jim Ingham7730b9a2012-11-29 00:26:19 +0000859 const bool can_create = true;
860 const bool get_parent_variables = true;
861 const bool stop_if_block_is_inlined_function = true;
Greg Clayton69b582f2010-12-14 18:39:31 +0000862
Jim Ingham7730b9a2012-11-29 00:26:19 +0000863 if (sc.block && sc.block->AppendVariables (can_create,
864 get_parent_variables,
865 stop_if_block_is_inlined_function,
Enrico Granata08a04322014-02-18 23:48:11 +0000866 &variable_list))
Jim Ingham7730b9a2012-11-29 00:26:19 +0000867 {
868 ConstString const_name(name);
Enrico Granata08a04322014-02-18 23:48:11 +0000869 VariableSP variable_sp(variable_list.FindVariable(const_name,value_type));
870 if (variable_sp)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000871 {
Enrico Granata08a04322014-02-18 23:48:11 +0000872 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues);
873 sb_value.SetSP (value_sp, use_dynamic);
874 break;
Jim Ingham7730b9a2012-11-29 00:26:19 +0000875 }
876 }
877 }
878 break;
879
880 case eValueTypeRegister: // stack frame register value
881 {
882 RegisterContextSP reg_ctx (frame->GetRegisterContext());
883 if (reg_ctx)
884 {
885 const uint32_t num_regs = reg_ctx->GetRegisterCount();
886 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
887 {
888 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
889 if (reg_info &&
890 ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
891 (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
892 {
893 value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
894 sb_value.SetSP (value_sp);
895 break;
896 }
897 }
898 }
899 }
900 break;
901
902 case eValueTypeRegisterSet: // A collection of stack frame register values
903 {
904 RegisterContextSP reg_ctx (frame->GetRegisterContext());
905 if (reg_ctx)
906 {
907 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
908 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
909 {
910 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
911 if (reg_set &&
912 ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
913 (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
914 {
915 value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
916 sb_value.SetSP (value_sp);
917 break;
918 }
919 }
920 }
921 }
922 break;
923
924 case eValueTypeConstResult: // constant result variables
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000925 {
926 ConstString const_name(name);
Jim Ingham7730b9a2012-11-29 00:26:19 +0000927 ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
928 if (expr_var_sp)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000929 {
Jim Ingham7730b9a2012-11-29 00:26:19 +0000930 value_sp = expr_var_sp->GetValueObject();
931 sb_value.SetSP (value_sp, use_dynamic);
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000932 }
933 }
Jim Ingham7730b9a2012-11-29 00:26:19 +0000934 break;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000935
Jim Ingham7730b9a2012-11-29 00:26:19 +0000936 default:
937 break;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000938 }
Jim Ingham7730b9a2012-11-29 00:26:19 +0000939 }
940 else
941 {
942 if (log)
943 log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
Greg Clayton69b582f2010-12-14 18:39:31 +0000944 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000945 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000946 else
947 {
948 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +0000949 log->Printf ("SBFrame::FindValue () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +0000950 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000951 }
Caroline Ticedde9cff2010-09-20 05:20:02 +0000952
Greg Clayton48381312010-10-30 04:51:46 +0000953 if (log)
Greg Clayton69b582f2010-12-14 18:39:31 +0000954 log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
Greg Claytond9e416c2012-02-18 05:35:26 +0000955 frame, name, value_type, value_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000956
957
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000958 return sb_value;
959}
960
961bool
Johnny Chen35e2ab62012-03-05 19:53:24 +0000962SBFrame::IsEqual (const SBFrame &that) const
963{
Jason Molendab57e4a12013-11-04 09:33:30 +0000964 lldb::StackFrameSP this_sp = GetFrameSP();
965 lldb::StackFrameSP that_sp = that.GetFrameSP();
Johnny Chen35e2ab62012-03-05 19:53:24 +0000966 return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
967}
968
969bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000970SBFrame::operator == (const SBFrame &rhs) const
971{
Johnny Chen35e2ab62012-03-05 19:53:24 +0000972 return IsEqual(rhs);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000973}
974
975bool
976SBFrame::operator != (const SBFrame &rhs) const
977{
Johnny Chen35e2ab62012-03-05 19:53:24 +0000978 return !IsEqual(rhs);
Greg Clayton481cef22011-01-21 06:11:58 +0000979}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980
981SBThread
982SBFrame::GetThread () const
983{
Greg Clayton5160ce52013-03-27 23:08:40 +0000984 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000985
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000986 ExecutionContext exe_ctx(m_opaque_sp.get());
Greg Claytond9e416c2012-02-18 05:35:26 +0000987 ThreadSP thread_sp (exe_ctx.GetThreadSP());
988 SBThread sb_thread (thread_sp);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000989
990 if (log)
Caroline Tice750cd172010-10-26 23:49:36 +0000991 {
992 SBStream sstr;
993 sb_thread.GetDescription (sstr);
Greg Claytond9e416c2012-02-18 05:35:26 +0000994 log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
995 exe_ctx.GetFramePtr(),
996 thread_sp.get(),
997 sstr.GetData());
Caroline Tice750cd172010-10-26 23:49:36 +0000998 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000999
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001000 return sb_thread;
1001}
1002
1003const char *
1004SBFrame::Disassemble () const
1005{
Greg Clayton5160ce52013-03-27 23:08:40 +00001006 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +00001007 const char *disassembly = NULL;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001008 Mutex::Locker api_locker;
1009 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1010
Jason Molendab57e4a12013-11-04 09:33:30 +00001011 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +00001012 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +00001013 Process *process = exe_ctx.GetProcessPtr();
1014 if (target && process)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001015 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001016 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001017 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001018 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001019 frame = exe_ctx.GetFramePtr();
1020 if (frame)
1021 {
1022 disassembly = frame->Disassemble();
1023 }
1024 else
1025 {
1026 if (log)
1027 log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
1028 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001029 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001030 else
1031 {
1032 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001033 log->Printf ("SBFrame::Disassemble () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +00001034 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001035 }
Greg Clayton48381312010-10-30 04:51:46 +00001036
1037 if (log)
Greg Claytond9e416c2012-02-18 05:35:26 +00001038 log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
Greg Clayton48381312010-10-30 04:51:46 +00001039
1040 return disassembly;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001041}
1042
1043
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001044SBValueList
1045SBFrame::GetVariables (bool arguments,
1046 bool locals,
1047 bool statics,
1048 bool in_scope_only)
1049{
Greg Clayton316d4982011-06-18 20:06:08 +00001050 SBValueList value_list;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001051 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +00001052 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytond9e416c2012-02-18 05:35:26 +00001053 Target *target = exe_ctx.GetTargetPtr();
1054 if (frame && target)
Greg Clayton316d4982011-06-18 20:06:08 +00001055 {
Greg Claytond9e416c2012-02-18 05:35:26 +00001056 lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
Greg Clayton316d4982011-06-18 20:06:08 +00001057 value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
1058 }
1059 return value_list;
Jim Ingham78a685a2011-04-16 00:01:13 +00001060}
1061
1062SBValueList
1063SBFrame::GetVariables (bool arguments,
1064 bool locals,
1065 bool statics,
1066 bool in_scope_only,
Jim Ingham2837b762011-05-04 03:43:18 +00001067 lldb::DynamicValueType use_dynamic)
Jim Ingham78a685a2011-04-16 00:01:13 +00001068{
Greg Clayton5160ce52013-03-27 23:08:40 +00001069 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001070
Greg Claytonb9556ac2012-01-30 07:41:31 +00001071 SBValueList value_list;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001072 Mutex::Locker api_locker;
1073 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1074
Jason Molendab57e4a12013-11-04 09:33:30 +00001075 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +00001076 Target *target = exe_ctx.GetTargetPtr();
Greg Claytonb9556ac2012-01-30 07:41:31 +00001077
Caroline Ticeceb6b132010-10-26 03:11:13 +00001078 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001079 log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
Greg Clayton48381312010-10-30 04:51:46 +00001080 arguments,
1081 locals,
1082 statics,
1083 in_scope_only);
Greg Claytonb9556ac2012-01-30 07:41:31 +00001084
Jim Ingham7730b9a2012-11-29 00:26:19 +00001085 Process *process = exe_ctx.GetProcessPtr();
1086 if (target && process)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001087 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001088 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001089 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001090 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001091 frame = exe_ctx.GetFramePtr();
1092 if (frame)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001093 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001094 size_t i;
1095 VariableList *variable_list = NULL;
1096 variable_list = frame->GetVariableList(true);
1097 if (variable_list)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001098 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001099 const size_t num_variables = variable_list->GetSize();
1100 if (num_variables)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001101 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001102 for (i = 0; i < num_variables; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001103 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001104 VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
1105 if (variable_sp)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001106 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001107 bool add_variable = false;
1108 switch (variable_sp->GetScope())
1109 {
1110 case eValueTypeVariableGlobal:
1111 case eValueTypeVariableStatic:
1112 add_variable = statics;
1113 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001114
Jim Ingham7730b9a2012-11-29 00:26:19 +00001115 case eValueTypeVariableArgument:
1116 add_variable = arguments;
1117 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001118
Jim Ingham7730b9a2012-11-29 00:26:19 +00001119 case eValueTypeVariableLocal:
1120 add_variable = locals;
1121 break;
Greg Claytonc982c762010-07-09 20:39:50 +00001122
Jim Ingham7730b9a2012-11-29 00:26:19 +00001123 default:
1124 break;
1125 }
1126 if (add_variable)
1127 {
1128 if (in_scope_only && !variable_sp->IsInScope(frame))
1129 continue;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001130
Jim Ingham7730b9a2012-11-29 00:26:19 +00001131 ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1132 SBValue value_sb;
1133 value_sb.SetSP(valobj_sp,use_dynamic);
1134 value_list.Append(value_sb);
1135 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001136 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001137 }
1138 }
1139 }
1140 }
Jim Ingham7730b9a2012-11-29 00:26:19 +00001141 else
1142 {
1143 if (log)
1144 log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
1145 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001146 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001147 else
1148 {
1149 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001150 log->Printf ("SBFrame::GetVariables () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +00001151 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001152 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001153
1154 if (log)
1155 {
Enrico Granata08ec0b62013-02-07 22:57:46 +00001156 log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, value_list.opaque_ptr());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001157 }
1158
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001159 return value_list;
1160}
1161
Greg Clayton69b582f2010-12-14 18:39:31 +00001162SBValueList
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001163SBFrame::GetRegisters ()
1164{
Greg Clayton5160ce52013-03-27 23:08:40 +00001165 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001166
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001167 SBValueList value_list;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001168 Mutex::Locker api_locker;
1169 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1170
Jason Molendab57e4a12013-11-04 09:33:30 +00001171 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +00001172 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +00001173 Process *process = exe_ctx.GetProcessPtr();
1174 if (target && process)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001175 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001176 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001177 if (stop_locker.TryLock(&process->GetRunLock()))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001178 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001179 frame = exe_ctx.GetFramePtr();
1180 if (frame)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001181 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001182 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1183 if (reg_ctx)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001184 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001185 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
1186 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
1187 {
1188 value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
1189 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001190 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001191 }
Jim Ingham7730b9a2012-11-29 00:26:19 +00001192 else
1193 {
1194 if (log)
1195 log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
1196 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001197 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001198 else
1199 {
1200 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001201 log->Printf ("SBFrame::GetRegisters () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +00001202 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001203 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001204
1205 if (log)
Enrico Granata08ec0b62013-02-07 22:57:46 +00001206 log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001207
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001208 return value_list;
1209}
1210
Jason Molendaad9a53c2013-07-26 02:08:48 +00001211SBValue
1212SBFrame::FindRegister (const char *name)
1213{
1214 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1215
1216 SBValue result;
1217 ValueObjectSP value_sp;
1218 Mutex::Locker api_locker;
1219 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1220
Jason Molendab57e4a12013-11-04 09:33:30 +00001221 StackFrame *frame = NULL;
Jason Molendaad9a53c2013-07-26 02:08:48 +00001222 Target *target = exe_ctx.GetTargetPtr();
1223 Process *process = exe_ctx.GetProcessPtr();
1224 if (target && process)
1225 {
1226 Process::StopLocker stop_locker;
1227 if (stop_locker.TryLock(&process->GetRunLock()))
1228 {
1229 frame = exe_ctx.GetFramePtr();
1230 if (frame)
1231 {
1232 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1233 if (reg_ctx)
1234 {
1235 const uint32_t num_regs = reg_ctx->GetRegisterCount();
1236 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1237 {
1238 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1239 if (reg_info &&
1240 ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1241 (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1242 {
1243 value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1244 result.SetSP (value_sp);
1245 break;
1246 }
1247 }
1248 }
1249 }
1250 else
1251 {
1252 if (log)
Jason Molenda5d353842013-07-26 22:52:30 +00001253 log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
Jason Molendaad9a53c2013-07-26 02:08:48 +00001254 }
1255 }
1256 else
1257 {
1258 if (log)
Jason Molenda5d353842013-07-26 22:52:30 +00001259 log->Printf ("SBFrame::FindRegister () => error: process is running");
Jason Molendaad9a53c2013-07-26 02:08:48 +00001260 }
1261 }
1262
1263 if (log)
Jason Molenda5d353842013-07-26 22:52:30 +00001264 log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", frame, value_sp.get());
Jason Molendaad9a53c2013-07-26 02:08:48 +00001265
1266 return result;
1267}
1268
Caroline Ticedde9cff2010-09-20 05:20:02 +00001269bool
1270SBFrame::GetDescription (SBStream &description)
1271{
Greg Clayton5160ce52013-03-27 23:08:40 +00001272 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001273 Stream &strm = description.ref();
1274
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001275 Mutex::Locker api_locker;
1276 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1277
Jason Molendab57e4a12013-11-04 09:33:30 +00001278 StackFrame *frame;
Greg Claytond9e416c2012-02-18 05:35:26 +00001279 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +00001280 Process *process = exe_ctx.GetProcessPtr();
1281 if (target && process)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001282 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001283 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001284 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001285 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001286 frame = exe_ctx.GetFramePtr();
1287 if (frame)
1288 {
1289 frame->DumpUsingSettingsFormat (&strm);
1290 }
1291 else
1292 {
1293 if (log)
1294 log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
1295 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001296 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001297 else
1298 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001299 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001300 log->Printf ("SBFrame::GetDescription () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +00001301 }
1302
Caroline Ticedde9cff2010-09-20 05:20:02 +00001303 }
1304 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001305 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001306
1307 return true;
1308}
Greg Clayton1d3afba2010-10-05 00:00:42 +00001309
Greg Clayton69b582f2010-12-14 18:39:31 +00001310SBValue
Greg Clayton1d3afba2010-10-05 00:00:42 +00001311SBFrame::EvaluateExpression (const char *expr)
1312{
Greg Clayton316d4982011-06-18 20:06:08 +00001313 SBValue result;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001314 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +00001315 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytond9e416c2012-02-18 05:35:26 +00001316 Target *target = exe_ctx.GetTargetPtr();
1317 if (frame && target)
Greg Clayton316d4982011-06-18 20:06:08 +00001318 {
Jim Ingham35e1bda2012-10-16 21:41:58 +00001319 SBExpressionOptions options;
1320 lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
Greg Claytoncced1562012-10-16 22:58:25 +00001321 options.SetFetchDynamicValue (fetch_dynamic_value);
Jim Ingham35e1bda2012-10-16 21:41:58 +00001322 options.SetUnwindOnError (true);
1323 return EvaluateExpression (expr, options);
Greg Clayton316d4982011-06-18 20:06:08 +00001324 }
1325 return result;
Jim Ingham78a685a2011-04-16 00:01:13 +00001326}
1327
1328SBValue
Jim Ingham2837b762011-05-04 03:43:18 +00001329SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
Jim Ingham78a685a2011-04-16 00:01:13 +00001330{
Jim Ingham35e1bda2012-10-16 21:41:58 +00001331 SBExpressionOptions options;
Greg Claytoncced1562012-10-16 22:58:25 +00001332 options.SetFetchDynamicValue (fetch_dynamic_value);
Jim Ingham35e1bda2012-10-16 21:41:58 +00001333 options.SetUnwindOnError (true);
1334 return EvaluateExpression (expr, options);
Jim Ingham7ba6e992012-05-11 23:47:32 +00001335}
1336
1337SBValue
1338SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
1339{
Jim Ingham35e1bda2012-10-16 21:41:58 +00001340 SBExpressionOptions options;
Greg Claytoncced1562012-10-16 22:58:25 +00001341 options.SetFetchDynamicValue (fetch_dynamic_value);
Jim Ingham35e1bda2012-10-16 21:41:58 +00001342 options.SetUnwindOnError (unwind_on_error);
1343 return EvaluateExpression (expr, options);
1344}
1345
1346lldb::SBValue
1347SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
1348{
Greg Clayton5160ce52013-03-27 23:08:40 +00001349 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Sean Callanana162eba2010-12-07 22:55:01 +00001350
Greg Clayton5160ce52013-03-27 23:08:40 +00001351 Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton48381312010-10-30 04:51:46 +00001352
Greg Clayton23f59502012-07-17 03:23:13 +00001353 ExecutionResults exe_results = eExecutionSetupError;
Greg Clayton69b582f2010-12-14 18:39:31 +00001354 SBValue expr_result;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001355
1356 if (expr == NULL || expr[0] == '\0')
1357 {
1358 if (log)
1359 log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
1360 return expr_result;
1361 }
1362
Greg Clayton81e871e2012-02-04 02:27:34 +00001363 ValueObjectSP expr_value_sp;
Greg Clayton48381312010-10-30 04:51:46 +00001364
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001365 Mutex::Locker api_locker;
1366 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1367
Greg Claytonb9556ac2012-01-30 07:41:31 +00001368 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001369 log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
Greg Claytonb9556ac2012-01-30 07:41:31 +00001370
Jason Molendab57e4a12013-11-04 09:33:30 +00001371 StackFrame *frame = NULL;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001372 Target *target = exe_ctx.GetTargetPtr();
1373 Process *process = exe_ctx.GetProcessPtr();
1374
1375 if (target && process)
1376 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001377 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001378 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001379 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001380 frame = exe_ctx.GetFramePtr();
1381 if (frame)
1382 {
Greg Claytonfb6621e2013-12-06 21:59:52 +00001383 if (target->GetDisplayExpressionsInCrashlogs())
1384 {
1385 StreamString frame_description;
1386 frame->DumpUsingSettingsFormat (&frame_description);
1387 Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1388 expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1389 }
1390
1391 exe_results = target->EvaluateExpression (expr,
Jim Ingham7730b9a2012-11-29 00:26:19 +00001392 frame,
1393 expr_value_sp,
1394 options.ref());
1395 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
Greg Claytonfb6621e2013-12-06 21:59:52 +00001396
1397 if (target->GetDisplayExpressionsInCrashlogs())
1398 Host::SetCrashDescription (NULL);
Jim Ingham7730b9a2012-11-29 00:26:19 +00001399 }
1400 else
1401 {
1402 if (log)
1403 log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
1404 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001405 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001406 else
1407 {
1408 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001409 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +00001410 }
Greg Clayton1d3afba2010-10-05 00:00:42 +00001411 }
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001412
1413#ifndef LLDB_DISABLE_PYTHON
Sean Callanana162eba2010-12-07 22:55:01 +00001414 if (expr_log)
Jim Ingham78a685a2011-04-16 00:01:13 +00001415 expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
Greg Claytonfe42ac42011-08-03 22:57:10 +00001416 expr_result.GetValue(),
1417 expr_result.GetSummary());
Sean Callanana162eba2010-12-07 22:55:01 +00001418
Greg Clayton48381312010-10-30 04:51:46 +00001419 if (log)
Greg Claytond9e416c2012-02-18 05:35:26 +00001420 log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1421 frame,
Jim Ingham78a685a2011-04-16 00:01:13 +00001422 expr,
Greg Clayton81e871e2012-02-04 02:27:34 +00001423 expr_value_sp.get(),
Johnny Chen25f3a3c2011-08-10 22:06:24 +00001424 exe_results);
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001425#endif
Greg Clayton48381312010-10-30 04:51:46 +00001426
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001427 return expr_result;
Greg Clayton1d3afba2010-10-05 00:00:42 +00001428}
Greg Clayton316d4982011-06-18 20:06:08 +00001429
1430bool
1431SBFrame::IsInlined()
1432{
Greg Clayton5160ce52013-03-27 23:08:40 +00001433 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001434 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +00001435 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +00001436 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +00001437 Process *process = exe_ctx.GetProcessPtr();
1438 if (target && process)
Greg Clayton316d4982011-06-18 20:06:08 +00001439 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001440 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001441 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001442 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001443 frame = exe_ctx.GetFramePtr();
1444 if (frame)
1445 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001446
Jim Ingham7730b9a2012-11-29 00:26:19 +00001447 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1448 if (block)
1449 return block->GetContainingInlinedBlock () != NULL;
1450 }
1451 else
1452 {
1453 if (log)
1454 log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
1455 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001456 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001457 else
1458 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001459 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001460 log->Printf ("SBFrame::IsInlined () => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +00001461 }
1462
Greg Clayton316d4982011-06-18 20:06:08 +00001463 }
1464 return false;
1465}
1466
1467const char *
1468SBFrame::GetFunctionName()
1469{
Greg Clayton5160ce52013-03-27 23:08:40 +00001470 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton316d4982011-06-18 20:06:08 +00001471 const char *name = NULL;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001472 ExecutionContext exe_ctx(m_opaque_sp.get());
Jason Molendab57e4a12013-11-04 09:33:30 +00001473 StackFrame *frame = NULL;
Greg Claytond9e416c2012-02-18 05:35:26 +00001474 Target *target = exe_ctx.GetTargetPtr();
Jim Ingham7730b9a2012-11-29 00:26:19 +00001475 Process *process = exe_ctx.GetProcessPtr();
1476 if (target && process)
Greg Clayton316d4982011-06-18 20:06:08 +00001477 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001478 Process::StopLocker stop_locker;
Jim Ingham7730b9a2012-11-29 00:26:19 +00001479 if (stop_locker.TryLock(&process->GetRunLock()))
Greg Clayton316d4982011-06-18 20:06:08 +00001480 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001481 frame = exe_ctx.GetFramePtr();
1482 if (frame)
Greg Clayton316d4982011-06-18 20:06:08 +00001483 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001484 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1485 if (sc.block)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001486 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001487 Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1488 if (inlined_block)
1489 {
1490 const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1491 name = inlined_info->GetName().AsCString();
1492 }
1493 }
1494
1495 if (name == NULL)
1496 {
1497 if (sc.function)
1498 name = sc.function->GetName().GetCString();
1499 }
1500
1501 if (name == NULL)
1502 {
1503 if (sc.symbol)
1504 name = sc.symbol->GetName().GetCString();
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001505 }
Greg Clayton316d4982011-06-18 20:06:08 +00001506 }
Jim Ingham7730b9a2012-11-29 00:26:19 +00001507 else
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001508 {
Jim Ingham7730b9a2012-11-29 00:26:19 +00001509 if (log)
1510 log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001511 }
Greg Clayton316d4982011-06-18 20:06:08 +00001512 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001513 else
1514 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001515 if (log)
Jim Ingham7730b9a2012-11-29 00:26:19 +00001516 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
Greg Claytonc9858e42012-04-06 02:17:47 +00001517
1518 }
Greg Clayton316d4982011-06-18 20:06:08 +00001519 }
1520 return name;
1521}
1522