blob: 0c3a17e0df88c3ae2a2f1313af5ecd08c54deb74 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBThread.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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedman4c5de692010-06-09 07:44:37 +000012#include "lldb/API/SBThread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
14#include "lldb/API/SBSymbolContext.h"
15#include "lldb/API/SBFileSpec.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000016#include "lldb/API/SBStream.h"
Greg Clayton4e78f602010-11-18 18:52:36 +000017#include "lldb/Breakpoint/BreakpointLocation.h"
Greg Clayton66111032010-06-23 01:19:29 +000018#include "lldb/Core/Debugger.h"
Andrew Kaylora75418d2013-04-15 23:33:53 +000019#include "lldb/Core/State.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020#include "lldb/Core/Stream.h"
21#include "lldb/Core/StreamFile.h"
Greg Clayton66111032010-06-23 01:19:29 +000022#include "lldb/Interpreter/CommandInterpreter.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Target/Thread.h"
24#include "lldb/Target/Process.h"
25#include "lldb/Symbol/SymbolContext.h"
26#include "lldb/Symbol/CompileUnit.h"
Greg Claytonf4b47e12010-08-04 01:40:35 +000027#include "lldb/Target/StopInfo.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Target/Target.h"
29#include "lldb/Target/ThreadPlan.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030#include "lldb/Target/ThreadPlanStepInstruction.h"
31#include "lldb/Target/ThreadPlanStepOut.h"
32#include "lldb/Target/ThreadPlanStepRange.h"
33#include "lldb/Target/ThreadPlanStepInRange.h"
34
35
Eli Friedman4c5de692010-06-09 07:44:37 +000036#include "lldb/API/SBAddress.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000037#include "lldb/API/SBDebugger.h"
Jim Ingham4f465cf2012-10-10 18:32:14 +000038#include "lldb/API/SBEvent.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000039#include "lldb/API/SBFrame.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000040#include "lldb/API/SBProcess.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000041#include "lldb/API/SBValue.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042
43using namespace lldb;
44using namespace lldb_private;
45
Jim Ingham4f465cf2012-10-10 18:32:14 +000046const char *
47SBThread::GetBroadcasterClassName ()
48{
49 return Thread::GetStaticBroadcasterClass().AsCString();
50}
51
Greg Claytoncfd1ace2010-10-31 03:01:06 +000052//----------------------------------------------------------------------
53// Constructors
54//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055SBThread::SBThread () :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000056 m_opaque_sp (new ExecutionContextRef())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057{
58}
59
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060SBThread::SBThread (const ThreadSP& lldb_object_sp) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000061 m_opaque_sp (new ExecutionContextRef(lldb_object_sp))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062{
63}
64
Greg Clayton92ef5732010-10-30 18:26:59 +000065SBThread::SBThread (const SBThread &rhs) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000066 m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000067{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000068
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069}
70
71//----------------------------------------------------------------------
Greg Claytoncfd1ace2010-10-31 03:01:06 +000072// Assignment operator
73//----------------------------------------------------------------------
74
75const lldb::SBThread &
76SBThread::operator = (const SBThread &rhs)
77{
78 if (this != &rhs)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000079 *m_opaque_sp = *rhs.m_opaque_sp;
Greg Claytoncfd1ace2010-10-31 03:01:06 +000080 return *this;
81}
82
83//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +000084// Destructor
85//----------------------------------------------------------------------
86SBThread::~SBThread()
87{
88}
89
90bool
91SBThread::IsValid() const
92{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000093 return m_opaque_sp->GetThreadSP().get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000094}
95
Greg Clayton48e42542010-07-30 20:12:55 +000096void
97SBThread::Clear ()
98{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000099 m_opaque_sp->Clear();
Greg Clayton48e42542010-07-30 20:12:55 +0000100}
101
102
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000103StopReason
104SBThread::GetStopReason()
105{
Greg Clayton5160ce52013-03-27 23:08:40 +0000106 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000107
Caroline Ticeceb6b132010-10-26 03:11:13 +0000108 StopReason reason = eStopReasonInvalid;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000109 Mutex::Locker api_locker;
110 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
111
Greg Clayton1ac04c32012-02-21 00:09:25 +0000112 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000113 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000114 Process::StopLocker stop_locker;
115 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
116 {
Greg Clayton97d5cf02012-09-25 02:40:06 +0000117 return exe_ctx.GetThreadPtr()->GetStopReason();
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000118 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000119 else
120 {
121 if (log)
122 log->Printf ("SBThread(%p)::GetStopReason() => error: process is running", exe_ctx.GetThreadPtr());
123 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000124 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000125
126 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000127 log->Printf ("SBThread(%p)::GetStopReason () => %s", exe_ctx.GetThreadPtr(),
Caroline Tice750cd172010-10-26 23:49:36 +0000128 Thread::StopReasonAsCString (reason));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000129
130 return reason;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000131}
132
133size_t
Greg Clayton4e78f602010-11-18 18:52:36 +0000134SBThread::GetStopReasonDataCount ()
135{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000136 Mutex::Locker api_locker;
137 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
138
Greg Clayton1ac04c32012-02-21 00:09:25 +0000139 if (exe_ctx.HasThreadScope())
Greg Clayton4e78f602010-11-18 18:52:36 +0000140 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000141 Process::StopLocker stop_locker;
142 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Clayton4e78f602010-11-18 18:52:36 +0000143 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000144 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
145 if (stop_info_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000146 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000147 StopReason reason = stop_info_sp->GetStopReason();
148 switch (reason)
Greg Clayton4e78f602010-11-18 18:52:36 +0000149 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000150 case eStopReasonInvalid:
151 case eStopReasonNone:
152 case eStopReasonTrace:
Greg Clayton90ba8112012-12-05 00:16:59 +0000153 case eStopReasonExec:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000154 case eStopReasonPlanComplete:
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000155 case eStopReasonThreadExiting:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000156 // There is no data for these stop reasons.
157 return 0;
158
159 case eStopReasonBreakpoint:
160 {
161 break_id_t site_id = stop_info_sp->GetValue();
162 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
163 if (bp_site_sp)
164 return bp_site_sp->GetNumberOfOwners () * 2;
165 else
166 return 0; // Breakpoint must have cleared itself...
167 }
168 break;
169
170 case eStopReasonWatchpoint:
171 return 1;
172
173 case eStopReasonSignal:
174 return 1;
175
176 case eStopReasonException:
177 return 1;
Greg Clayton4e78f602010-11-18 18:52:36 +0000178 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000179 }
180 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000181 else
182 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000183 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000184 if (log)
185 log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running", exe_ctx.GetThreadPtr());
186 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000187 }
188 return 0;
189}
190
191uint64_t
192SBThread::GetStopReasonDataAtIndex (uint32_t idx)
193{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000194 Mutex::Locker api_locker;
195 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
196
Greg Clayton1ac04c32012-02-21 00:09:25 +0000197 if (exe_ctx.HasThreadScope())
Greg Clayton4e78f602010-11-18 18:52:36 +0000198 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000199 Process::StopLocker stop_locker;
200 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Clayton4e78f602010-11-18 18:52:36 +0000201 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000202 Thread *thread = exe_ctx.GetThreadPtr();
203 StopInfoSP stop_info_sp = thread->GetStopInfo ();
204 if (stop_info_sp)
205 {
206 StopReason reason = stop_info_sp->GetStopReason();
207 switch (reason)
Greg Clayton4e78f602010-11-18 18:52:36 +0000208 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000209 case eStopReasonInvalid:
210 case eStopReasonNone:
211 case eStopReasonTrace:
Greg Clayton90ba8112012-12-05 00:16:59 +0000212 case eStopReasonExec:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000213 case eStopReasonPlanComplete:
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000214 case eStopReasonThreadExiting:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000215 // There is no data for these stop reasons.
216 return 0;
217
218 case eStopReasonBreakpoint:
Greg Clayton4e78f602010-11-18 18:52:36 +0000219 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000220 break_id_t site_id = stop_info_sp->GetValue();
221 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
222 if (bp_site_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000223 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000224 uint32_t bp_index = idx / 2;
225 BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
226 if (bp_loc_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000227 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000228 if (bp_index & 1)
229 {
230 // Odd idx, return the breakpoint location ID
231 return bp_loc_sp->GetID();
232 }
233 else
234 {
235 // Even idx, return the breakpoint ID
236 return bp_loc_sp->GetBreakpoint().GetID();
237 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000238 }
239 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000240 return LLDB_INVALID_BREAK_ID;
Greg Clayton4e78f602010-11-18 18:52:36 +0000241 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000242 break;
243
244 case eStopReasonWatchpoint:
245 return stop_info_sp->GetValue();
246
247 case eStopReasonSignal:
248 return stop_info_sp->GetValue();
249
250 case eStopReasonException:
251 return stop_info_sp->GetValue();
Greg Clayton4e78f602010-11-18 18:52:36 +0000252 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000253 }
254 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000255 else
256 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000257 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000258 if (log)
259 log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
260 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000261 }
262 return 0;
263}
264
265size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000266SBThread::GetStopDescription (char *dst, size_t dst_len)
267{
Greg Clayton5160ce52013-03-27 23:08:40 +0000268 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000269
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000270 Mutex::Locker api_locker;
271 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
272
Greg Clayton1ac04c32012-02-21 00:09:25 +0000273 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000274 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000275 Process::StopLocker stop_locker;
276 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000277 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000278
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000279 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
280 if (stop_info_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000281 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000282 const char *stop_desc = stop_info_sp->GetDescription();
283 if (stop_desc)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000284 {
Caroline Ticeceb6b132010-10-26 03:11:13 +0000285 if (log)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000286 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
Greg Clayton1ac04c32012-02-21 00:09:25 +0000287 exe_ctx.GetThreadPtr(), stop_desc);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000288 if (dst)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000289 return ::snprintf (dst, dst_len, "%s", stop_desc);
290 else
291 {
292 // NULL dst passed in, return the length needed to contain the description
293 return ::strlen (stop_desc) + 1; // Include the NULL byte for size
294 }
295 }
296 else
297 {
298 size_t stop_desc_len = 0;
299 switch (stop_info_sp->GetStopReason())
300 {
301 case eStopReasonTrace:
302 case eStopReasonPlanComplete:
303 {
304 static char trace_desc[] = "step";
305 stop_desc = trace_desc;
306 stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
307 }
308 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000309
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000310 case eStopReasonBreakpoint:
311 {
312 static char bp_desc[] = "breakpoint hit";
313 stop_desc = bp_desc;
314 stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
315 }
316 break;
317
318 case eStopReasonWatchpoint:
319 {
320 static char wp_desc[] = "watchpoint hit";
321 stop_desc = wp_desc;
322 stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
323 }
324 break;
325
326 case eStopReasonSignal:
327 {
328 stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
329 if (stop_desc == NULL || stop_desc[0] == '\0')
330 {
331 static char signal_desc[] = "signal";
332 stop_desc = signal_desc;
333 stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
334 }
335 }
336 break;
337
338 case eStopReasonException:
339 {
340 char exc_desc[] = "exception";
341 stop_desc = exc_desc;
342 stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
343 }
344 break;
345
Greg Clayton90ba8112012-12-05 00:16:59 +0000346 case eStopReasonExec:
347 {
348 char exc_desc[] = "exec";
349 stop_desc = exc_desc;
350 stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
351 }
352 break;
353
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000354 case eStopReasonThreadExiting:
355 {
356 char limbo_desc[] = "thread exiting";
357 stop_desc = limbo_desc;
358 stop_desc_len = sizeof(limbo_desc);
359 }
360 break;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000361 default:
362 break;
363 }
364
365 if (stop_desc && stop_desc[0])
366 {
367 if (log)
368 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
369 exe_ctx.GetThreadPtr(), stop_desc);
370
371 if (dst)
372 return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
373
374 if (stop_desc_len == 0)
375 stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
376
377 return stop_desc_len;
378 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000379 }
380 }
381 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000382 else
383 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000384 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000385 if (log)
386 log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running", exe_ctx.GetThreadPtr());
387 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000388 }
389 if (dst)
390 *dst = 0;
391 return 0;
392}
393
Jim Ingham73ca05a2011-12-17 01:35:57 +0000394SBValue
395SBThread::GetStopReturnValue ()
396{
Greg Clayton5160ce52013-03-27 23:08:40 +0000397 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham73ca05a2011-12-17 01:35:57 +0000398 ValueObjectSP return_valobj_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000399 Mutex::Locker api_locker;
400 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
401
Greg Clayton1ac04c32012-02-21 00:09:25 +0000402 if (exe_ctx.HasThreadScope())
Jim Ingham73ca05a2011-12-17 01:35:57 +0000403 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000404 Process::StopLocker stop_locker;
405 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Jim Ingham73ca05a2011-12-17 01:35:57 +0000406 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000407 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
408 if (stop_info_sp)
409 {
410 return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
411 }
Jim Ingham73ca05a2011-12-17 01:35:57 +0000412 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000413 else
414 {
415 if (log)
416 log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running", exe_ctx.GetThreadPtr());
417 }
Jim Ingham73ca05a2011-12-17 01:35:57 +0000418 }
419
Jim Ingham73ca05a2011-12-17 01:35:57 +0000420 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000421 log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", exe_ctx.GetThreadPtr(),
Jim Ingham73ca05a2011-12-17 01:35:57 +0000422 return_valobj_sp.get()
423 ? return_valobj_sp->GetValueAsCString()
424 : "<no return value>");
425
426 return SBValue (return_valobj_sp);
427}
428
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429void
430SBThread::SetThread (const ThreadSP& lldb_object_sp)
431{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000432 m_opaque_sp->SetThreadSP (lldb_object_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433}
434
435
436lldb::tid_t
437SBThread::GetThreadID () const
438{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000439 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000440 if (thread_sp)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000441 return thread_sp->GetID();
442 return LLDB_INVALID_THREAD_ID;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000443}
444
445uint32_t
446SBThread::GetIndexID () const
447{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000448 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000449 if (thread_sp)
450 return thread_sp->GetIndexID();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000451 return LLDB_INVALID_INDEX32;
452}
Greg Clayton1ac04c32012-02-21 00:09:25 +0000453
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000454const char *
455SBThread::GetName () const
456{
Greg Clayton5160ce52013-03-27 23:08:40 +0000457 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000458 const char *name = NULL;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000459 Mutex::Locker api_locker;
460 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
461
Greg Clayton1ac04c32012-02-21 00:09:25 +0000462 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +0000463 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000464 Process::StopLocker stop_locker;
465 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
466 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000467 name = exe_ctx.GetThreadPtr()->GetName();
468 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000469 else
470 {
471 if (log)
472 log->Printf ("SBThread(%p)::GetName() => error: process is running", exe_ctx.GetThreadPtr());
473 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000474 }
Greg Clayton48381312010-10-30 04:51:46 +0000475
Caroline Ticeceb6b132010-10-26 03:11:13 +0000476 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000477 log->Printf ("SBThread(%p)::GetName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000478
Greg Clayton48381312010-10-30 04:51:46 +0000479 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000480}
481
482const char *
483SBThread::GetQueueName () const
484{
Greg Clayton48381312010-10-30 04:51:46 +0000485 const char *name = NULL;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000486 Mutex::Locker api_locker;
487 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
488
Greg Clayton5160ce52013-03-27 23:08:40 +0000489 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton1ac04c32012-02-21 00:09:25 +0000490 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +0000491 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000492 Process::StopLocker stop_locker;
493 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
494 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000495 name = exe_ctx.GetThreadPtr()->GetQueueName();
496 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000497 else
498 {
499 if (log)
500 log->Printf ("SBThread(%p)::GetQueueName() => error: process is running", exe_ctx.GetThreadPtr());
501 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000502 }
Greg Clayton48381312010-10-30 04:51:46 +0000503
Caroline Ticeceb6b132010-10-26 03:11:13 +0000504 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000505 log->Printf ("SBThread(%p)::GetQueueName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000506
Greg Clayton48381312010-10-30 04:51:46 +0000507 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000508}
509
Jason Molenda4fdb5862013-10-21 23:52:54 +0000510lldb::queue_id_t
511SBThread::GetQueueID () const
512{
513 queue_id_t id = LLDB_INVALID_QUEUE_ID;
514 Mutex::Locker api_locker;
515 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
516
517 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
518 if (exe_ctx.HasThreadScope())
519 {
520 Process::StopLocker stop_locker;
521 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
522 {
523 id = exe_ctx.GetThreadPtr()->GetQueueID();
524 }
525 else
526 {
527 if (log)
528 log->Printf ("SBThread(%p)::GetQueueID() => error: process is running", exe_ctx.GetThreadPtr());
529 }
530 }
531
532 if (log)
533 log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64, exe_ctx.GetThreadPtr(), id);
534
535 return id;
536}
537
Jim Ingham64e7ead2012-05-03 21:19:36 +0000538SBError
539SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
540{
541 SBError sb_error;
542
543 Process *process = exe_ctx.GetProcessPtr();
544 if (!process)
545 {
546 sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
547 return sb_error;
548 }
549
550 Thread *thread = exe_ctx.GetThreadPtr();
551 if (!thread)
552 {
553 sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
554 return sb_error;
555 }
556
557 // User level plans should be Master Plans so they can be interrupted, other plans executed, and
558 // then a "continue" will resume the plan.
559 if (new_plan != NULL)
560 {
561 new_plan->SetIsMasterPlan(true);
562 new_plan->SetOkayToDiscard(false);
563 }
564
565 // Why do we need to set the current thread by ID here???
566 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
567 sb_error.ref() = process->Resume();
568
569 if (sb_error.Success())
570 {
571 // If we are doing synchronous mode, then wait for the
572 // process to stop yet again!
573 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
574 process->WaitForProcessToStop (NULL);
575 }
576
577 return sb_error;
578}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000579
580void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000581SBThread::StepOver (lldb::RunMode stop_other_threads)
582{
Greg Clayton5160ce52013-03-27 23:08:40 +0000583 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000584
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000585 Mutex::Locker api_locker;
586 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
587
Caroline Ticeceb6b132010-10-26 03:11:13 +0000588
Greg Clayton17a6ad02012-01-30 02:53:15 +0000589 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000590 log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", exe_ctx.GetThreadPtr(),
Greg Clayton17a6ad02012-01-30 02:53:15 +0000591 Thread::RunModeAsCString (stop_other_threads));
592
Greg Clayton1ac04c32012-02-21 00:09:25 +0000593 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000594 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000595 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham7ba6e992012-05-11 23:47:32 +0000596 bool abort_other_plans = false;
Jason Molendab57e4a12013-11-04 09:33:30 +0000597 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000598
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000599 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000600 if (frame_sp)
601 {
602 if (frame_sp->HasDebugInformation ())
603 {
604 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000605 new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000606 sc.line_entry.range,
607 sc,
608 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000609 }
610 else
611 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000612 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000613 abort_other_plans,
614 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000615 }
616 }
617
Jim Ingham64e7ead2012-05-03 21:19:36 +0000618 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000619 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000620 }
621}
622
623void
624SBThread::StepInto (lldb::RunMode stop_other_threads)
625{
Jim Inghamc6276822012-12-12 19:58:40 +0000626 StepInto (NULL, stop_other_threads);
627}
628
629void
630SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
631{
Greg Clayton5160ce52013-03-27 23:08:40 +0000632 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000633
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000634 Mutex::Locker api_locker;
635 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000636
637 if (log)
Jim Inghamc6276822012-12-12 19:58:40 +0000638 log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
639 exe_ctx.GetThreadPtr(),
640 target_name? target_name: "<NULL>",
Greg Clayton17a6ad02012-01-30 02:53:15 +0000641 Thread::RunModeAsCString (stop_other_threads));
Jim Inghamc6276822012-12-12 19:58:40 +0000642
Greg Clayton1ac04c32012-02-21 00:09:25 +0000643 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000644 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000645 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000646
Greg Clayton1ac04c32012-02-21 00:09:25 +0000647 Thread *thread = exe_ctx.GetThreadPtr();
Jason Molendab57e4a12013-11-04 09:33:30 +0000648 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000649 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000650
651 if (frame_sp && frame_sp->HasDebugInformation ())
652 {
Greg Clayton474966a2010-06-12 18:59:55 +0000653 bool avoid_code_without_debug_info = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000654 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000655 new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000656 sc.line_entry.range,
657 sc,
658 target_name,
659 stop_other_threads,
660 avoid_code_without_debug_info);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000661 }
662 else
663 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000664 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000665 abort_other_plans,
666 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000667 }
Jim Ingham64e7ead2012-05-03 21:19:36 +0000668
669 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000670 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000671 }
672}
673
674void
675SBThread::StepOut ()
676{
Greg Clayton5160ce52013-03-27 23:08:40 +0000677 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000678
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000679 Mutex::Locker api_locker;
680 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
681
Caroline Ticeceb6b132010-10-26 03:11:13 +0000682
Greg Clayton17a6ad02012-01-30 02:53:15 +0000683 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000684 log->Printf ("SBThread(%p)::StepOut ()", exe_ctx.GetThreadPtr());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000685
Greg Clayton1ac04c32012-02-21 00:09:25 +0000686 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000687 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000688 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000689 bool stop_other_threads = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000690
Greg Clayton1ac04c32012-02-21 00:09:25 +0000691 Thread *thread = exe_ctx.GetThreadPtr();
692
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000693 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000694 NULL,
695 false,
696 stop_other_threads,
697 eVoteYes,
698 eVoteNoOpinion,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000699 0));
Jim Ingham64e7ead2012-05-03 21:19:36 +0000700
701 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000702 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +0000703 }
704}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000705
Greg Clayton481cef22011-01-21 06:11:58 +0000706void
707SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
708{
Greg Clayton5160ce52013-03-27 23:08:40 +0000709 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000710
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000711 Mutex::Locker api_locker;
712 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
713
Jason Molendab57e4a12013-11-04 09:33:30 +0000714 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Clayton481cef22011-01-21 06:11:58 +0000715 if (log)
716 {
717 SBStream frame_desc_strm;
718 sb_frame.GetDescription (frame_desc_strm);
Greg Clayton1ac04c32012-02-21 00:09:25 +0000719 log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
Greg Clayton481cef22011-01-21 06:11:58 +0000720 }
721
Greg Clayton1ac04c32012-02-21 00:09:25 +0000722 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000723 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000724 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000725 bool stop_other_threads = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000726 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000727
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000728 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000729 NULL,
730 false,
731 stop_other_threads,
732 eVoteYes,
733 eVoteNoOpinion,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000734 frame_sp->GetFrameIndex()));
Jim Ingham64e7ead2012-05-03 21:19:36 +0000735
736 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000737 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000738 }
739}
740
741void
742SBThread::StepInstruction (bool step_over)
743{
Greg Clayton5160ce52013-03-27 23:08:40 +0000744 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000745
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000746 Mutex::Locker api_locker;
747 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
748
Greg Clayton1ac04c32012-02-21 00:09:25 +0000749
Caroline Ticeceb6b132010-10-26 03:11:13 +0000750
Greg Clayton17a6ad02012-01-30 02:53:15 +0000751 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000752 log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", exe_ctx.GetThreadPtr(), step_over);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000753
Greg Clayton1ac04c32012-02-21 00:09:25 +0000754 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000755 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000756 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000757 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
Jim Ingham64e7ead2012-05-03 21:19:36 +0000758
759 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000760 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761 }
762}
763
764void
765SBThread::RunToAddress (lldb::addr_t addr)
766{
Greg Clayton5160ce52013-03-27 23:08:40 +0000767 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000768
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000769 Mutex::Locker api_locker;
770 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
771
Caroline Ticeceb6b132010-10-26 03:11:13 +0000772
Greg Clayton17a6ad02012-01-30 02:53:15 +0000773 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000774 log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", exe_ctx.GetThreadPtr(), addr);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000775
Greg Clayton1ac04c32012-02-21 00:09:25 +0000776 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000777 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000778 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000779 bool stop_other_threads = true;
780
Greg Claytone72dfb32012-02-24 01:59:29 +0000781 Address target_addr (addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782
Greg Clayton1ac04c32012-02-21 00:09:25 +0000783 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000784
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000785 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads));
Jim Ingham64e7ead2012-05-03 21:19:36 +0000786
787 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000788 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000789 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000790}
791
Greg Clayton481cef22011-01-21 06:11:58 +0000792SBError
793SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
794 lldb::SBFileSpec &sb_file_spec,
795 uint32_t line)
796{
797 SBError sb_error;
Greg Clayton5160ce52013-03-27 23:08:40 +0000798 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000799 char path[PATH_MAX];
Greg Clayton17a6ad02012-01-30 02:53:15 +0000800
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000801 Mutex::Locker api_locker;
802 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
803
Jason Molendab57e4a12013-11-04 09:33:30 +0000804 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000805
Greg Clayton481cef22011-01-21 06:11:58 +0000806 if (log)
807 {
808 SBStream frame_desc_strm;
809 sb_frame.GetDescription (frame_desc_strm);
810 sb_file_spec->GetPath (path, sizeof(path));
811 log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
Greg Clayton1ac04c32012-02-21 00:09:25 +0000812 exe_ctx.GetThreadPtr(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000813 frame_sp.get(),
Greg Clayton481cef22011-01-21 06:11:58 +0000814 frame_desc_strm.GetData(),
815 path, line);
816 }
Greg Clayton17a6ad02012-01-30 02:53:15 +0000817
Greg Clayton1ac04c32012-02-21 00:09:25 +0000818 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000819 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000820 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000821 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000822
823 if (line == 0)
824 {
825 sb_error.SetErrorString("invalid line argument");
826 return sb_error;
827 }
828
Greg Claytonb9556ac2012-01-30 07:41:31 +0000829 if (!frame_sp)
Greg Clayton481cef22011-01-21 06:11:58 +0000830 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000831 frame_sp = thread->GetSelectedFrame ();
Greg Clayton481cef22011-01-21 06:11:58 +0000832 if (!frame_sp)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000833 frame_sp = thread->GetStackFrameAtIndex (0);
Greg Clayton481cef22011-01-21 06:11:58 +0000834 }
835
836 SymbolContext frame_sc;
837 if (!frame_sp)
838 {
839 sb_error.SetErrorString("no valid frames in thread to step");
840 return sb_error;
841 }
842
843 // If we have a frame, get its line
844 frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit |
845 eSymbolContextFunction |
846 eSymbolContextLineEntry |
847 eSymbolContextSymbol );
848
849 if (frame_sc.comp_unit == NULL)
850 {
851 sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
852 return sb_error;
853 }
854
855 FileSpec step_file_spec;
856 if (sb_file_spec.IsValid())
857 {
858 // The file spec passed in was valid, so use it
859 step_file_spec = sb_file_spec.ref();
860 }
861 else
862 {
863 if (frame_sc.line_entry.IsValid())
864 step_file_spec = frame_sc.line_entry.file;
865 else
866 {
867 sb_error.SetErrorString("invalid file argument or no file for frame");
868 return sb_error;
869 }
870 }
871
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000872 // Grab the current function, then we will make sure the "until" address is
873 // within the function. We discard addresses that are out of the current
874 // function, and then if there are no addresses remaining, give an appropriate
875 // error message.
876
877 bool all_in_function = true;
878 AddressRange fun_range = frame_sc.function->GetAddressRange();
879
Greg Clayton481cef22011-01-21 06:11:58 +0000880 std::vector<addr_t> step_over_until_addrs;
Jim Ingham7ba6e992012-05-11 23:47:32 +0000881 const bool abort_other_plans = false;
Jim Inghamc02e3342012-09-14 18:57:14 +0000882 const bool stop_other_threads = false;
Greg Clayton481cef22011-01-21 06:11:58 +0000883 const bool check_inlines = true;
884 const bool exact = false;
885
886 SymbolContextList sc_list;
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000887 const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
888 line,
889 check_inlines,
890 exact,
891 eSymbolContextLineEntry,
892 sc_list);
Greg Clayton481cef22011-01-21 06:11:58 +0000893 if (num_matches > 0)
894 {
895 SymbolContext sc;
896 for (uint32_t i=0; i<num_matches; ++i)
897 {
898 if (sc_list.GetContextAtIndex(i, sc))
899 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000900 addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
Greg Clayton481cef22011-01-21 06:11:58 +0000901 if (step_addr != LLDB_INVALID_ADDRESS)
902 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000903 if (fun_range.ContainsLoadAddress(step_addr, target))
904 step_over_until_addrs.push_back(step_addr);
905 else
906 all_in_function = false;
Greg Clayton481cef22011-01-21 06:11:58 +0000907 }
908 }
909 }
910 }
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000911
Greg Clayton481cef22011-01-21 06:11:58 +0000912 if (step_over_until_addrs.empty())
913 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000914 if (all_in_function)
915 {
916 step_file_spec.GetPath (path, sizeof(path));
Jason Molendafd54b362011-09-20 21:44:10 +0000917 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000918 }
919 else
Greg Clayton86edbf42011-10-26 00:56:27 +0000920 sb_error.SetErrorString ("step until target not in current function");
Greg Clayton481cef22011-01-21 06:11:58 +0000921 }
922 else
923 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000924 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000925 &step_over_until_addrs[0],
926 step_over_until_addrs.size(),
927 stop_other_threads,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000928 frame_sp->GetFrameIndex()));
Greg Clayton481cef22011-01-21 06:11:58 +0000929
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000930 sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +0000931 }
932 }
933 else
934 {
935 sb_error.SetErrorString("this SBThread object is invalid");
936 }
937 return sb_error;
938}
939
Jim Ingham44137582012-09-12 00:40:39 +0000940SBError
Richard Mittonf86248d2013-09-12 02:20:34 +0000941SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line)
942{
943 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
944 SBError sb_error;
945
946 Mutex::Locker api_locker;
947 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
948
949 if (log)
950 log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)", exe_ctx.GetThreadPtr(), file_spec->GetPath().c_str(), line);
951
952 if (!exe_ctx.HasThreadScope())
953 {
954 sb_error.SetErrorString("this SBThread object is invalid");
955 return sb_error;
956 }
957
958 Thread *thread = exe_ctx.GetThreadPtr();
959
960 Error err = thread->JumpToLine (file_spec.get(), line, true);
961 sb_error.SetError (err);
962 return sb_error;
963}
964
965SBError
Jim Inghamcb640dd2012-09-14 02:14:15 +0000966SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
Jim Ingham44137582012-09-12 00:40:39 +0000967{
968 SBError sb_error;
969
Greg Clayton5160ce52013-03-27 23:08:40 +0000970 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham44137582012-09-12 00:40:39 +0000971
972 Mutex::Locker api_locker;
973 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
974
975
976 if (log)
Jim Inghamcb640dd2012-09-14 02:14:15 +0000977 log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", exe_ctx.GetThreadPtr(), frame.GetFrameID());
Jim Ingham44137582012-09-12 00:40:39 +0000978
979 if (exe_ctx.HasThreadScope())
980 {
981 Thread *thread = exe_ctx.GetThreadPtr();
Jim Inghamcb640dd2012-09-14 02:14:15 +0000982 sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
Jim Ingham44137582012-09-12 00:40:39 +0000983 }
984
985 return sb_error;
986}
987
Greg Clayton481cef22011-01-21 06:11:58 +0000988
Greg Clayton722a0cd2011-01-12 02:25:42 +0000989bool
990SBThread::Suspend()
991{
Greg Clayton5160ce52013-03-27 23:08:40 +0000992 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000993 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +0000994 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000995 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +0000996 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000997 Process::StopLocker stop_locker;
998 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
999 {
1000 exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
1001 result = true;
1002 }
1003 else
1004 {
1005 if (log)
1006 log->Printf ("SBThread(%p)::Suspend() => error: process is running", exe_ctx.GetThreadPtr());
1007 }
Greg Clayton722a0cd2011-01-12 02:25:42 +00001008 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001009 if (log)
1010 log->Printf ("SBThread(%p)::Suspend() => %i", exe_ctx.GetThreadPtr(), result);
1011 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001012}
1013
1014bool
1015SBThread::Resume ()
1016{
Greg Clayton5160ce52013-03-27 23:08:40 +00001017 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001018 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +00001019 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +00001020 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +00001021 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001022 Process::StopLocker stop_locker;
1023 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1024 {
1025 exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning);
1026 result = true;
1027 }
1028 else
1029 {
1030 if (log)
1031 log->Printf ("SBThread(%p)::Resume() => error: process is running", exe_ctx.GetThreadPtr());
1032 }
Greg Clayton722a0cd2011-01-12 02:25:42 +00001033 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001034 if (log)
1035 log->Printf ("SBThread(%p)::Resume() => %i", exe_ctx.GetThreadPtr(), result);
1036 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001037}
1038
1039bool
1040SBThread::IsSuspended()
1041{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001042 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001043 if (exe_ctx.HasThreadScope())
1044 return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001045 return false;
1046}
1047
Andrew Kaylora75418d2013-04-15 23:33:53 +00001048bool
1049SBThread::IsStopped()
1050{
1051 ExecutionContext exe_ctx (m_opaque_sp.get());
1052 if (exe_ctx.HasThreadScope())
1053 return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1054 return false;
1055}
1056
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001057SBProcess
1058SBThread::GetProcess ()
1059{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001060 SBProcess sb_process;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001061 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001062 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001063 {
1064 // Have to go up to the target so we can get a shared pointer to our process...
Greg Clayton1ac04c32012-02-21 00:09:25 +00001065 sb_process.SetSP (exe_ctx.GetProcessSP());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001066 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001067
Greg Clayton5160ce52013-03-27 23:08:40 +00001068 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001069 if (log)
1070 {
Greg Clayton481cef22011-01-21 06:11:58 +00001071 SBStream frame_desc_strm;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001072 sb_process.GetDescription (frame_desc_strm);
Greg Clayton1ac04c32012-02-21 00:09:25 +00001073 log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", exe_ctx.GetThreadPtr(),
Enrico Granata0a2df222013-02-28 02:18:49 +00001074 sb_process.GetSP().get(), frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001075 }
1076
Greg Claytonb9556ac2012-01-30 07:41:31 +00001077 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001078}
1079
1080uint32_t
1081SBThread::GetNumFrames ()
1082{
Greg Clayton5160ce52013-03-27 23:08:40 +00001083 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001084
Caroline Ticeceb6b132010-10-26 03:11:13 +00001085 uint32_t num_frames = 0;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001086 Mutex::Locker api_locker;
1087 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1088
Greg Clayton1ac04c32012-02-21 00:09:25 +00001089 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001090 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001091 Process::StopLocker stop_locker;
1092 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1093 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001094 num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1095 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001096 else
1097 {
1098 if (log)
1099 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", exe_ctx.GetThreadPtr());
1100 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001101 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001102
1103 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +00001104 log->Printf ("SBThread(%p)::GetNumFrames () => %u", exe_ctx.GetThreadPtr(), num_frames);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001105
1106 return num_frames;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001107}
1108
1109SBFrame
1110SBThread::GetFrameAtIndex (uint32_t idx)
1111{
Greg Clayton5160ce52013-03-27 23:08:40 +00001112 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001113
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001114 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001115 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001116 Mutex::Locker api_locker;
1117 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1118
Greg Clayton1ac04c32012-02-21 00:09:25 +00001119 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001120 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001121 Process::StopLocker stop_locker;
1122 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1123 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001124 frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1125 sb_frame.SetFrameSP (frame_sp);
1126 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001127 else
1128 {
1129 if (log)
1130 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
1131 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001132 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001133
1134 if (log)
1135 {
Greg Clayton481cef22011-01-21 06:11:58 +00001136 SBStream frame_desc_strm;
1137 sb_frame.GetDescription (frame_desc_strm);
Greg Clayton48381312010-10-30 04:51:46 +00001138 log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001139 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001140 }
1141
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001142 return sb_frame;
1143}
1144
Greg Claytonf028a1f2010-12-17 02:26:24 +00001145lldb::SBFrame
1146SBThread::GetSelectedFrame ()
1147{
Greg Clayton5160ce52013-03-27 23:08:40 +00001148 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001149
1150 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001151 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001152 Mutex::Locker api_locker;
1153 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1154
Greg Clayton1ac04c32012-02-21 00:09:25 +00001155 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001156 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001157 Process::StopLocker stop_locker;
1158 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1159 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001160 frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1161 sb_frame.SetFrameSP (frame_sp);
1162 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001163 else
1164 {
1165 if (log)
1166 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
1167 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001168 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001169
1170 if (log)
1171 {
Greg Clayton481cef22011-01-21 06:11:58 +00001172 SBStream frame_desc_strm;
1173 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonf028a1f2010-12-17 02:26:24 +00001174 log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001175 exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001176 }
1177
1178 return sb_frame;
1179}
1180
1181lldb::SBFrame
1182SBThread::SetSelectedFrame (uint32_t idx)
1183{
Greg Clayton5160ce52013-03-27 23:08:40 +00001184 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001185
1186 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001187 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001188 Mutex::Locker api_locker;
1189 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1190
Greg Clayton1ac04c32012-02-21 00:09:25 +00001191 if (exe_ctx.HasThreadScope())
Greg Claytonf028a1f2010-12-17 02:26:24 +00001192 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001193 Process::StopLocker stop_locker;
1194 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Claytonf028a1f2010-12-17 02:26:24 +00001195 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001196 Thread *thread = exe_ctx.GetThreadPtr();
1197 frame_sp = thread->GetStackFrameAtIndex (idx);
1198 if (frame_sp)
1199 {
1200 thread->SetSelectedFrame (frame_sp.get());
1201 sb_frame.SetFrameSP (frame_sp);
1202 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001203 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001204 else
1205 {
1206 if (log)
1207 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
1208 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001209 }
1210
1211 if (log)
1212 {
Greg Clayton481cef22011-01-21 06:11:58 +00001213 SBStream frame_desc_strm;
1214 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonf028a1f2010-12-17 02:26:24 +00001215 log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001216 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001217 }
1218 return sb_frame;
1219}
1220
Jim Ingham4f465cf2012-10-10 18:32:14 +00001221bool
1222SBThread::EventIsThreadEvent (const SBEvent &event)
1223{
1224 return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
1225}
1226
1227SBFrame
1228SBThread::GetStackFrameFromEvent (const SBEvent &event)
1229{
1230 return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
1231
1232}
1233
1234SBThread
1235SBThread::GetThreadFromEvent (const SBEvent &event)
1236{
1237 return Thread::ThreadEventData::GetThreadFromEvent (event.get());
1238}
Greg Claytonf028a1f2010-12-17 02:26:24 +00001239
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001240bool
1241SBThread::operator == (const SBThread &rhs) const
1242{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001243 return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001244}
1245
1246bool
1247SBThread::operator != (const SBThread &rhs) const
1248{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001249 return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001250}
Caroline Ticedde9cff2010-09-20 05:20:02 +00001251
1252bool
Jim Ingham4f465cf2012-10-10 18:32:14 +00001253SBThread::GetStatus (SBStream &status) const
1254{
1255 Stream &strm = status.ref();
1256
1257 ExecutionContext exe_ctx (m_opaque_sp.get());
1258 if (exe_ctx.HasThreadScope())
1259 {
1260 exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
1261 }
1262 else
1263 strm.PutCString ("No status");
1264
1265 return true;
1266}
1267
1268bool
Caroline Ticeceb6b132010-10-26 03:11:13 +00001269SBThread::GetDescription (SBStream &description) const
1270{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001271 Stream &strm = description.ref();
1272
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001273 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001274 if (exe_ctx.HasThreadScope())
Caroline Ticeceb6b132010-10-26 03:11:13 +00001275 {
Daniel Malead01b2952012-11-29 21:49:15 +00001276 strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001277 }
1278 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001279 strm.PutCString ("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +00001280
1281 return true;
1282}