blob: 2752620c9bafc8e0fb2d576732c9a2c7f40cc132 [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
Jim Ingham64e7ead2012-05-03 21:19:36 +0000510SBError
511SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
512{
513 SBError sb_error;
514
515 Process *process = exe_ctx.GetProcessPtr();
516 if (!process)
517 {
518 sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
519 return sb_error;
520 }
521
522 Thread *thread = exe_ctx.GetThreadPtr();
523 if (!thread)
524 {
525 sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
526 return sb_error;
527 }
528
529 // User level plans should be Master Plans so they can be interrupted, other plans executed, and
530 // then a "continue" will resume the plan.
531 if (new_plan != NULL)
532 {
533 new_plan->SetIsMasterPlan(true);
534 new_plan->SetOkayToDiscard(false);
535 }
536
537 // Why do we need to set the current thread by ID here???
538 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
539 sb_error.ref() = process->Resume();
540
541 if (sb_error.Success())
542 {
543 // If we are doing synchronous mode, then wait for the
544 // process to stop yet again!
545 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
546 process->WaitForProcessToStop (NULL);
547 }
548
549 return sb_error;
550}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000551
552void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000553SBThread::StepOver (lldb::RunMode stop_other_threads)
554{
Greg Clayton5160ce52013-03-27 23:08:40 +0000555 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000556
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000557 Mutex::Locker api_locker;
558 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
559
Caroline Ticeceb6b132010-10-26 03:11:13 +0000560
Greg Clayton17a6ad02012-01-30 02:53:15 +0000561 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000562 log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", exe_ctx.GetThreadPtr(),
Greg Clayton17a6ad02012-01-30 02:53:15 +0000563 Thread::RunModeAsCString (stop_other_threads));
564
Greg Clayton1ac04c32012-02-21 00:09:25 +0000565 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000566 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000567 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham7ba6e992012-05-11 23:47:32 +0000568 bool abort_other_plans = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000569 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000570
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000571 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000572 if (frame_sp)
573 {
574 if (frame_sp->HasDebugInformation ())
575 {
576 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000577 new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000578 sc.line_entry.range,
579 sc,
580 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000581 }
582 else
583 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000584 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000585 abort_other_plans,
586 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000587 }
588 }
589
Jim Ingham64e7ead2012-05-03 21:19:36 +0000590 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000591 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000592 }
593}
594
595void
596SBThread::StepInto (lldb::RunMode stop_other_threads)
597{
Jim Inghamc6276822012-12-12 19:58:40 +0000598 StepInto (NULL, stop_other_threads);
599}
600
601void
602SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
603{
Greg Clayton5160ce52013-03-27 23:08:40 +0000604 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000605
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000606 Mutex::Locker api_locker;
607 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000608
609 if (log)
Jim Inghamc6276822012-12-12 19:58:40 +0000610 log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
611 exe_ctx.GetThreadPtr(),
612 target_name? target_name: "<NULL>",
Greg Clayton17a6ad02012-01-30 02:53:15 +0000613 Thread::RunModeAsCString (stop_other_threads));
Jim Inghamc6276822012-12-12 19:58:40 +0000614
Greg Clayton1ac04c32012-02-21 00:09:25 +0000615 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000616 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000617 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000618
Greg Clayton1ac04c32012-02-21 00:09:25 +0000619 Thread *thread = exe_ctx.GetThreadPtr();
620 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000621 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000622
623 if (frame_sp && frame_sp->HasDebugInformation ())
624 {
Greg Clayton474966a2010-06-12 18:59:55 +0000625 bool avoid_code_without_debug_info = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000626 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000627 new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000628 sc.line_entry.range,
629 sc,
630 target_name,
631 stop_other_threads,
632 avoid_code_without_debug_info);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000633 }
634 else
635 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000636 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000637 abort_other_plans,
638 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000639 }
Jim Ingham64e7ead2012-05-03 21:19:36 +0000640
641 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000642 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000643 }
644}
645
646void
647SBThread::StepOut ()
648{
Greg Clayton5160ce52013-03-27 23:08:40 +0000649 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000650
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000651 Mutex::Locker api_locker;
652 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
653
Caroline Ticeceb6b132010-10-26 03:11:13 +0000654
Greg Clayton17a6ad02012-01-30 02:53:15 +0000655 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000656 log->Printf ("SBThread(%p)::StepOut ()", exe_ctx.GetThreadPtr());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000657
Greg Clayton1ac04c32012-02-21 00:09:25 +0000658 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000659 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000660 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000661 bool stop_other_threads = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000662
Greg Clayton1ac04c32012-02-21 00:09:25 +0000663 Thread *thread = exe_ctx.GetThreadPtr();
664
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000665 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000666 NULL,
667 false,
668 stop_other_threads,
669 eVoteYes,
670 eVoteNoOpinion,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000671 0));
Jim Ingham64e7ead2012-05-03 21:19:36 +0000672
673 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000674 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +0000675 }
676}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000677
Greg Clayton481cef22011-01-21 06:11:58 +0000678void
679SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
680{
Greg Clayton5160ce52013-03-27 23:08:40 +0000681 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000682
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000683 Mutex::Locker api_locker;
684 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
685
Greg Claytonb9556ac2012-01-30 07:41:31 +0000686 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Clayton481cef22011-01-21 06:11:58 +0000687 if (log)
688 {
689 SBStream frame_desc_strm;
690 sb_frame.GetDescription (frame_desc_strm);
Greg Clayton1ac04c32012-02-21 00:09:25 +0000691 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 +0000692 }
693
Greg Clayton1ac04c32012-02-21 00:09:25 +0000694 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000695 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000696 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000697 bool stop_other_threads = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000698 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000699
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000700 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000701 NULL,
702 false,
703 stop_other_threads,
704 eVoteYes,
705 eVoteNoOpinion,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000706 frame_sp->GetFrameIndex()));
Jim Ingham64e7ead2012-05-03 21:19:36 +0000707
708 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000709 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000710 }
711}
712
713void
714SBThread::StepInstruction (bool step_over)
715{
Greg Clayton5160ce52013-03-27 23:08:40 +0000716 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000717
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000718 Mutex::Locker api_locker;
719 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
720
Greg Clayton1ac04c32012-02-21 00:09:25 +0000721
Caroline Ticeceb6b132010-10-26 03:11:13 +0000722
Greg Clayton17a6ad02012-01-30 02:53:15 +0000723 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000724 log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", exe_ctx.GetThreadPtr(), step_over);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000725
Greg Clayton1ac04c32012-02-21 00:09:25 +0000726 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000727 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000728 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000729 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
Jim Ingham64e7ead2012-05-03 21:19:36 +0000730
731 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000732 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000733 }
734}
735
736void
737SBThread::RunToAddress (lldb::addr_t addr)
738{
Greg Clayton5160ce52013-03-27 23:08:40 +0000739 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000740
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000741 Mutex::Locker api_locker;
742 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
743
Caroline Ticeceb6b132010-10-26 03:11:13 +0000744
Greg Clayton17a6ad02012-01-30 02:53:15 +0000745 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000746 log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", exe_ctx.GetThreadPtr(), addr);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000747
Greg Clayton1ac04c32012-02-21 00:09:25 +0000748 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000749 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000750 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000751 bool stop_other_threads = true;
752
Greg Claytone72dfb32012-02-24 01:59:29 +0000753 Address target_addr (addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000754
Greg Clayton1ac04c32012-02-21 00:09:25 +0000755 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000756
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000757 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads));
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 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000762}
763
Greg Clayton481cef22011-01-21 06:11:58 +0000764SBError
765SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
766 lldb::SBFileSpec &sb_file_spec,
767 uint32_t line)
768{
769 SBError sb_error;
Greg Clayton5160ce52013-03-27 23:08:40 +0000770 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000771 char path[PATH_MAX];
Greg Clayton17a6ad02012-01-30 02:53:15 +0000772
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000773 Mutex::Locker api_locker;
774 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
775
Greg Claytonb9556ac2012-01-30 07:41:31 +0000776 StackFrameSP frame_sp (sb_frame.GetFrameSP());
777
Greg Clayton481cef22011-01-21 06:11:58 +0000778 if (log)
779 {
780 SBStream frame_desc_strm;
781 sb_frame.GetDescription (frame_desc_strm);
782 sb_file_spec->GetPath (path, sizeof(path));
783 log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
Greg Clayton1ac04c32012-02-21 00:09:25 +0000784 exe_ctx.GetThreadPtr(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000785 frame_sp.get(),
Greg Clayton481cef22011-01-21 06:11:58 +0000786 frame_desc_strm.GetData(),
787 path, line);
788 }
Greg Clayton17a6ad02012-01-30 02:53:15 +0000789
Greg Clayton1ac04c32012-02-21 00:09:25 +0000790 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000791 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000792 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000793 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000794
795 if (line == 0)
796 {
797 sb_error.SetErrorString("invalid line argument");
798 return sb_error;
799 }
800
Greg Claytonb9556ac2012-01-30 07:41:31 +0000801 if (!frame_sp)
Greg Clayton481cef22011-01-21 06:11:58 +0000802 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000803 frame_sp = thread->GetSelectedFrame ();
Greg Clayton481cef22011-01-21 06:11:58 +0000804 if (!frame_sp)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000805 frame_sp = thread->GetStackFrameAtIndex (0);
Greg Clayton481cef22011-01-21 06:11:58 +0000806 }
807
808 SymbolContext frame_sc;
809 if (!frame_sp)
810 {
811 sb_error.SetErrorString("no valid frames in thread to step");
812 return sb_error;
813 }
814
815 // If we have a frame, get its line
816 frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit |
817 eSymbolContextFunction |
818 eSymbolContextLineEntry |
819 eSymbolContextSymbol );
820
821 if (frame_sc.comp_unit == NULL)
822 {
823 sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
824 return sb_error;
825 }
826
827 FileSpec step_file_spec;
828 if (sb_file_spec.IsValid())
829 {
830 // The file spec passed in was valid, so use it
831 step_file_spec = sb_file_spec.ref();
832 }
833 else
834 {
835 if (frame_sc.line_entry.IsValid())
836 step_file_spec = frame_sc.line_entry.file;
837 else
838 {
839 sb_error.SetErrorString("invalid file argument or no file for frame");
840 return sb_error;
841 }
842 }
843
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000844 // Grab the current function, then we will make sure the "until" address is
845 // within the function. We discard addresses that are out of the current
846 // function, and then if there are no addresses remaining, give an appropriate
847 // error message.
848
849 bool all_in_function = true;
850 AddressRange fun_range = frame_sc.function->GetAddressRange();
851
Greg Clayton481cef22011-01-21 06:11:58 +0000852 std::vector<addr_t> step_over_until_addrs;
Jim Ingham7ba6e992012-05-11 23:47:32 +0000853 const bool abort_other_plans = false;
Jim Inghamc02e3342012-09-14 18:57:14 +0000854 const bool stop_other_threads = false;
Greg Clayton481cef22011-01-21 06:11:58 +0000855 const bool check_inlines = true;
856 const bool exact = false;
857
858 SymbolContextList sc_list;
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000859 const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
860 line,
861 check_inlines,
862 exact,
863 eSymbolContextLineEntry,
864 sc_list);
Greg Clayton481cef22011-01-21 06:11:58 +0000865 if (num_matches > 0)
866 {
867 SymbolContext sc;
868 for (uint32_t i=0; i<num_matches; ++i)
869 {
870 if (sc_list.GetContextAtIndex(i, sc))
871 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000872 addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
Greg Clayton481cef22011-01-21 06:11:58 +0000873 if (step_addr != LLDB_INVALID_ADDRESS)
874 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000875 if (fun_range.ContainsLoadAddress(step_addr, target))
876 step_over_until_addrs.push_back(step_addr);
877 else
878 all_in_function = false;
Greg Clayton481cef22011-01-21 06:11:58 +0000879 }
880 }
881 }
882 }
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000883
Greg Clayton481cef22011-01-21 06:11:58 +0000884 if (step_over_until_addrs.empty())
885 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000886 if (all_in_function)
887 {
888 step_file_spec.GetPath (path, sizeof(path));
Jason Molendafd54b362011-09-20 21:44:10 +0000889 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000890 }
891 else
Greg Clayton86edbf42011-10-26 00:56:27 +0000892 sb_error.SetErrorString ("step until target not in current function");
Greg Clayton481cef22011-01-21 06:11:58 +0000893 }
894 else
895 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000896 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000897 &step_over_until_addrs[0],
898 step_over_until_addrs.size(),
899 stop_other_threads,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000900 frame_sp->GetFrameIndex()));
Greg Clayton481cef22011-01-21 06:11:58 +0000901
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000902 sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +0000903 }
904 }
905 else
906 {
907 sb_error.SetErrorString("this SBThread object is invalid");
908 }
909 return sb_error;
910}
911
Jim Ingham44137582012-09-12 00:40:39 +0000912SBError
Jim Inghamcb640dd2012-09-14 02:14:15 +0000913SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
Jim Ingham44137582012-09-12 00:40:39 +0000914{
915 SBError sb_error;
916
Greg Clayton5160ce52013-03-27 23:08:40 +0000917 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham44137582012-09-12 00:40:39 +0000918
919 Mutex::Locker api_locker;
920 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
921
922
923 if (log)
Jim Inghamcb640dd2012-09-14 02:14:15 +0000924 log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", exe_ctx.GetThreadPtr(), frame.GetFrameID());
Jim Ingham44137582012-09-12 00:40:39 +0000925
926 if (exe_ctx.HasThreadScope())
927 {
928 Thread *thread = exe_ctx.GetThreadPtr();
Jim Inghamcb640dd2012-09-14 02:14:15 +0000929 sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
Jim Ingham44137582012-09-12 00:40:39 +0000930 }
931
932 return sb_error;
933}
934
Greg Clayton481cef22011-01-21 06:11:58 +0000935
Greg Clayton722a0cd2011-01-12 02:25:42 +0000936bool
937SBThread::Suspend()
938{
Greg Clayton5160ce52013-03-27 23:08:40 +0000939 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000940 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +0000941 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000942 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +0000943 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000944 Process::StopLocker stop_locker;
945 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
946 {
947 exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
948 result = true;
949 }
950 else
951 {
952 if (log)
953 log->Printf ("SBThread(%p)::Suspend() => error: process is running", exe_ctx.GetThreadPtr());
954 }
Greg Clayton722a0cd2011-01-12 02:25:42 +0000955 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000956 if (log)
957 log->Printf ("SBThread(%p)::Suspend() => %i", exe_ctx.GetThreadPtr(), result);
958 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +0000959}
960
961bool
962SBThread::Resume ()
963{
Greg Clayton5160ce52013-03-27 23:08:40 +0000964 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000965 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +0000966 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000967 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +0000968 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000969 Process::StopLocker stop_locker;
970 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
971 {
972 exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning);
973 result = true;
974 }
975 else
976 {
977 if (log)
978 log->Printf ("SBThread(%p)::Resume() => error: process is running", exe_ctx.GetThreadPtr());
979 }
Greg Clayton722a0cd2011-01-12 02:25:42 +0000980 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000981 if (log)
982 log->Printf ("SBThread(%p)::Resume() => %i", exe_ctx.GetThreadPtr(), result);
983 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +0000984}
985
986bool
987SBThread::IsSuspended()
988{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000989 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +0000990 if (exe_ctx.HasThreadScope())
991 return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
Greg Clayton722a0cd2011-01-12 02:25:42 +0000992 return false;
993}
994
Andrew Kaylora75418d2013-04-15 23:33:53 +0000995bool
996SBThread::IsStopped()
997{
998 ExecutionContext exe_ctx (m_opaque_sp.get());
999 if (exe_ctx.HasThreadScope())
1000 return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1001 return false;
1002}
1003
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001004SBProcess
1005SBThread::GetProcess ()
1006{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001007 SBProcess sb_process;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001008 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001009 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001010 {
1011 // Have to go up to the target so we can get a shared pointer to our process...
Greg Clayton1ac04c32012-02-21 00:09:25 +00001012 sb_process.SetSP (exe_ctx.GetProcessSP());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001013 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001014
Greg Clayton5160ce52013-03-27 23:08:40 +00001015 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001016 if (log)
1017 {
Greg Clayton481cef22011-01-21 06:11:58 +00001018 SBStream frame_desc_strm;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001019 sb_process.GetDescription (frame_desc_strm);
Greg Clayton1ac04c32012-02-21 00:09:25 +00001020 log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", exe_ctx.GetThreadPtr(),
Enrico Granata0a2df222013-02-28 02:18:49 +00001021 sb_process.GetSP().get(), frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001022 }
1023
Greg Claytonb9556ac2012-01-30 07:41:31 +00001024 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001025}
1026
1027uint32_t
1028SBThread::GetNumFrames ()
1029{
Greg Clayton5160ce52013-03-27 23:08:40 +00001030 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001031
Caroline Ticeceb6b132010-10-26 03:11:13 +00001032 uint32_t num_frames = 0;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001033 Mutex::Locker api_locker;
1034 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1035
Greg Clayton1ac04c32012-02-21 00:09:25 +00001036 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001037 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001038 Process::StopLocker stop_locker;
1039 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1040 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001041 num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1042 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001043 else
1044 {
1045 if (log)
1046 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", exe_ctx.GetThreadPtr());
1047 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001048 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001049
1050 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +00001051 log->Printf ("SBThread(%p)::GetNumFrames () => %u", exe_ctx.GetThreadPtr(), num_frames);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001052
1053 return num_frames;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001054}
1055
1056SBFrame
1057SBThread::GetFrameAtIndex (uint32_t idx)
1058{
Greg Clayton5160ce52013-03-27 23:08:40 +00001059 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001060
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001061 SBFrame sb_frame;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001062 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001063 Mutex::Locker api_locker;
1064 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1065
Greg Clayton1ac04c32012-02-21 00:09:25 +00001066 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001067 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001068 Process::StopLocker stop_locker;
1069 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1070 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001071 frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1072 sb_frame.SetFrameSP (frame_sp);
1073 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001074 else
1075 {
1076 if (log)
1077 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
1078 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001079 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001080
1081 if (log)
1082 {
Greg Clayton481cef22011-01-21 06:11:58 +00001083 SBStream frame_desc_strm;
1084 sb_frame.GetDescription (frame_desc_strm);
Greg Clayton48381312010-10-30 04:51:46 +00001085 log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001086 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001087 }
1088
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001089 return sb_frame;
1090}
1091
Greg Claytonf028a1f2010-12-17 02:26:24 +00001092lldb::SBFrame
1093SBThread::GetSelectedFrame ()
1094{
Greg Clayton5160ce52013-03-27 23:08:40 +00001095 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001096
1097 SBFrame sb_frame;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001098 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001099 Mutex::Locker api_locker;
1100 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1101
Greg Clayton1ac04c32012-02-21 00:09:25 +00001102 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001103 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001104 Process::StopLocker stop_locker;
1105 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1106 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001107 frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1108 sb_frame.SetFrameSP (frame_sp);
1109 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001110 else
1111 {
1112 if (log)
1113 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
1114 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001115 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001116
1117 if (log)
1118 {
Greg Clayton481cef22011-01-21 06:11:58 +00001119 SBStream frame_desc_strm;
1120 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonf028a1f2010-12-17 02:26:24 +00001121 log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001122 exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001123 }
1124
1125 return sb_frame;
1126}
1127
1128lldb::SBFrame
1129SBThread::SetSelectedFrame (uint32_t idx)
1130{
Greg Clayton5160ce52013-03-27 23:08:40 +00001131 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001132
1133 SBFrame sb_frame;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001134 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001135 Mutex::Locker api_locker;
1136 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1137
Greg Clayton1ac04c32012-02-21 00:09:25 +00001138 if (exe_ctx.HasThreadScope())
Greg Claytonf028a1f2010-12-17 02:26:24 +00001139 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001140 Process::StopLocker stop_locker;
1141 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Claytonf028a1f2010-12-17 02:26:24 +00001142 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001143 Thread *thread = exe_ctx.GetThreadPtr();
1144 frame_sp = thread->GetStackFrameAtIndex (idx);
1145 if (frame_sp)
1146 {
1147 thread->SetSelectedFrame (frame_sp.get());
1148 sb_frame.SetFrameSP (frame_sp);
1149 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001150 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001151 else
1152 {
1153 if (log)
1154 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
1155 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001156 }
1157
1158 if (log)
1159 {
Greg Clayton481cef22011-01-21 06:11:58 +00001160 SBStream frame_desc_strm;
1161 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonf028a1f2010-12-17 02:26:24 +00001162 log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001163 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001164 }
1165 return sb_frame;
1166}
1167
Jim Ingham4f465cf2012-10-10 18:32:14 +00001168bool
1169SBThread::EventIsThreadEvent (const SBEvent &event)
1170{
1171 return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
1172}
1173
1174SBFrame
1175SBThread::GetStackFrameFromEvent (const SBEvent &event)
1176{
1177 return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
1178
1179}
1180
1181SBThread
1182SBThread::GetThreadFromEvent (const SBEvent &event)
1183{
1184 return Thread::ThreadEventData::GetThreadFromEvent (event.get());
1185}
Greg Claytonf028a1f2010-12-17 02:26:24 +00001186
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001187bool
1188SBThread::operator == (const SBThread &rhs) const
1189{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001190 return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001191}
1192
1193bool
1194SBThread::operator != (const SBThread &rhs) const
1195{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001196 return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001197}
Caroline Ticedde9cff2010-09-20 05:20:02 +00001198
1199bool
Jim Ingham4f465cf2012-10-10 18:32:14 +00001200SBThread::GetStatus (SBStream &status) const
1201{
1202 Stream &strm = status.ref();
1203
1204 ExecutionContext exe_ctx (m_opaque_sp.get());
1205 if (exe_ctx.HasThreadScope())
1206 {
1207 exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
1208 }
1209 else
1210 strm.PutCString ("No status");
1211
1212 return true;
1213}
1214
1215bool
Caroline Ticeceb6b132010-10-26 03:11:13 +00001216SBThread::GetDescription (SBStream &description) const
1217{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001218 Stream &strm = description.ref();
1219
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001220 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001221 if (exe_ctx.HasThreadScope())
Caroline Ticeceb6b132010-10-26 03:11:13 +00001222 {
Daniel Malead01b2952012-11-29 21:49:15 +00001223 strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001224 }
1225 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001226 strm.PutCString ("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +00001227
1228 return true;
1229}