blob: ceaaa34b2bbe35872fa7c79dc454384df9481c61 [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
Richard Mittonf86248d2013-09-12 02:20:34 +0000913SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line)
914{
915 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
916 SBError sb_error;
917
918 Mutex::Locker api_locker;
919 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
920
921 if (log)
922 log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)", exe_ctx.GetThreadPtr(), file_spec->GetPath().c_str(), line);
923
924 if (!exe_ctx.HasThreadScope())
925 {
926 sb_error.SetErrorString("this SBThread object is invalid");
927 return sb_error;
928 }
929
930 Thread *thread = exe_ctx.GetThreadPtr();
931
932 Error err = thread->JumpToLine (file_spec.get(), line, true);
933 sb_error.SetError (err);
934 return sb_error;
935}
936
937SBError
Jim Inghamcb640dd2012-09-14 02:14:15 +0000938SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
Jim Ingham44137582012-09-12 00:40:39 +0000939{
940 SBError sb_error;
941
Greg Clayton5160ce52013-03-27 23:08:40 +0000942 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham44137582012-09-12 00:40:39 +0000943
944 Mutex::Locker api_locker;
945 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
946
947
948 if (log)
Jim Inghamcb640dd2012-09-14 02:14:15 +0000949 log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", exe_ctx.GetThreadPtr(), frame.GetFrameID());
Jim Ingham44137582012-09-12 00:40:39 +0000950
951 if (exe_ctx.HasThreadScope())
952 {
953 Thread *thread = exe_ctx.GetThreadPtr();
Jim Inghamcb640dd2012-09-14 02:14:15 +0000954 sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
Jim Ingham44137582012-09-12 00:40:39 +0000955 }
956
957 return sb_error;
958}
959
Greg Clayton481cef22011-01-21 06:11:58 +0000960
Greg Clayton722a0cd2011-01-12 02:25:42 +0000961bool
962SBThread::Suspend()
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 (eStateSuspended);
973 result = true;
974 }
975 else
976 {
977 if (log)
978 log->Printf ("SBThread(%p)::Suspend() => 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)::Suspend() => %i", exe_ctx.GetThreadPtr(), result);
983 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +0000984}
985
986bool
987SBThread::Resume ()
988{
Greg Clayton5160ce52013-03-27 23:08:40 +0000989 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000990 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +0000991 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000992 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +0000993 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000994 Process::StopLocker stop_locker;
995 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
996 {
997 exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning);
998 result = true;
999 }
1000 else
1001 {
1002 if (log)
1003 log->Printf ("SBThread(%p)::Resume() => error: process is running", exe_ctx.GetThreadPtr());
1004 }
Greg Clayton722a0cd2011-01-12 02:25:42 +00001005 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001006 if (log)
1007 log->Printf ("SBThread(%p)::Resume() => %i", exe_ctx.GetThreadPtr(), result);
1008 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001009}
1010
1011bool
1012SBThread::IsSuspended()
1013{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001014 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001015 if (exe_ctx.HasThreadScope())
1016 return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001017 return false;
1018}
1019
Andrew Kaylora75418d2013-04-15 23:33:53 +00001020bool
1021SBThread::IsStopped()
1022{
1023 ExecutionContext exe_ctx (m_opaque_sp.get());
1024 if (exe_ctx.HasThreadScope())
1025 return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1026 return false;
1027}
1028
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001029SBProcess
1030SBThread::GetProcess ()
1031{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001032 SBProcess sb_process;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001033 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001034 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001035 {
1036 // Have to go up to the target so we can get a shared pointer to our process...
Greg Clayton1ac04c32012-02-21 00:09:25 +00001037 sb_process.SetSP (exe_ctx.GetProcessSP());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001038 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001039
Greg Clayton5160ce52013-03-27 23:08:40 +00001040 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001041 if (log)
1042 {
Greg Clayton481cef22011-01-21 06:11:58 +00001043 SBStream frame_desc_strm;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001044 sb_process.GetDescription (frame_desc_strm);
Greg Clayton1ac04c32012-02-21 00:09:25 +00001045 log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", exe_ctx.GetThreadPtr(),
Enrico Granata0a2df222013-02-28 02:18:49 +00001046 sb_process.GetSP().get(), frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001047 }
1048
Greg Claytonb9556ac2012-01-30 07:41:31 +00001049 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001050}
1051
1052uint32_t
1053SBThread::GetNumFrames ()
1054{
Greg Clayton5160ce52013-03-27 23:08:40 +00001055 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001056
Caroline Ticeceb6b132010-10-26 03:11:13 +00001057 uint32_t num_frames = 0;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001058 Mutex::Locker api_locker;
1059 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1060
Greg Clayton1ac04c32012-02-21 00:09:25 +00001061 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001062 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001063 Process::StopLocker stop_locker;
1064 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1065 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001066 num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1067 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001068 else
1069 {
1070 if (log)
1071 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", exe_ctx.GetThreadPtr());
1072 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001073 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001074
1075 if (log)
Greg Clayton1ac04c32012-02-21 00:09:25 +00001076 log->Printf ("SBThread(%p)::GetNumFrames () => %u", exe_ctx.GetThreadPtr(), num_frames);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001077
1078 return num_frames;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001079}
1080
1081SBFrame
1082SBThread::GetFrameAtIndex (uint32_t idx)
1083{
Greg Clayton5160ce52013-03-27 23:08:40 +00001084 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001085
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001086 SBFrame sb_frame;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001087 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001088 Mutex::Locker api_locker;
1089 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1090
Greg Clayton1ac04c32012-02-21 00:09:25 +00001091 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001092 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001093 Process::StopLocker stop_locker;
1094 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1095 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001096 frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1097 sb_frame.SetFrameSP (frame_sp);
1098 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001099 else
1100 {
1101 if (log)
1102 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
1103 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001104 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001105
1106 if (log)
1107 {
Greg Clayton481cef22011-01-21 06:11:58 +00001108 SBStream frame_desc_strm;
1109 sb_frame.GetDescription (frame_desc_strm);
Greg Clayton48381312010-10-30 04:51:46 +00001110 log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001111 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001112 }
1113
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001114 return sb_frame;
1115}
1116
Greg Claytonf028a1f2010-12-17 02:26:24 +00001117lldb::SBFrame
1118SBThread::GetSelectedFrame ()
1119{
Greg Clayton5160ce52013-03-27 23:08:40 +00001120 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001121
1122 SBFrame sb_frame;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001123 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001124 Mutex::Locker api_locker;
1125 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1126
Greg Clayton1ac04c32012-02-21 00:09:25 +00001127 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001128 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001129 Process::StopLocker stop_locker;
1130 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1131 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001132 frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1133 sb_frame.SetFrameSP (frame_sp);
1134 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001135 else
1136 {
1137 if (log)
1138 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
1139 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001140 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001141
1142 if (log)
1143 {
Greg Clayton481cef22011-01-21 06:11:58 +00001144 SBStream frame_desc_strm;
1145 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonf028a1f2010-12-17 02:26:24 +00001146 log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001147 exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001148 }
1149
1150 return sb_frame;
1151}
1152
1153lldb::SBFrame
1154SBThread::SetSelectedFrame (uint32_t idx)
1155{
Greg Clayton5160ce52013-03-27 23:08:40 +00001156 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001157
1158 SBFrame sb_frame;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001159 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001160 Mutex::Locker api_locker;
1161 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1162
Greg Clayton1ac04c32012-02-21 00:09:25 +00001163 if (exe_ctx.HasThreadScope())
Greg Claytonf028a1f2010-12-17 02:26:24 +00001164 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001165 Process::StopLocker stop_locker;
1166 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Claytonf028a1f2010-12-17 02:26:24 +00001167 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001168 Thread *thread = exe_ctx.GetThreadPtr();
1169 frame_sp = thread->GetStackFrameAtIndex (idx);
1170 if (frame_sp)
1171 {
1172 thread->SetSelectedFrame (frame_sp.get());
1173 sb_frame.SetFrameSP (frame_sp);
1174 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001175 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001176 else
1177 {
1178 if (log)
1179 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
1180 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001181 }
1182
1183 if (log)
1184 {
Greg Clayton481cef22011-01-21 06:11:58 +00001185 SBStream frame_desc_strm;
1186 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonf028a1f2010-12-17 02:26:24 +00001187 log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
Greg Clayton1ac04c32012-02-21 00:09:25 +00001188 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001189 }
1190 return sb_frame;
1191}
1192
Jim Ingham4f465cf2012-10-10 18:32:14 +00001193bool
1194SBThread::EventIsThreadEvent (const SBEvent &event)
1195{
1196 return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
1197}
1198
1199SBFrame
1200SBThread::GetStackFrameFromEvent (const SBEvent &event)
1201{
1202 return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
1203
1204}
1205
1206SBThread
1207SBThread::GetThreadFromEvent (const SBEvent &event)
1208{
1209 return Thread::ThreadEventData::GetThreadFromEvent (event.get());
1210}
Greg Claytonf028a1f2010-12-17 02:26:24 +00001211
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001212bool
1213SBThread::operator == (const SBThread &rhs) const
1214{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001215 return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001216}
1217
1218bool
1219SBThread::operator != (const SBThread &rhs) const
1220{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001221 return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001222}
Caroline Ticedde9cff2010-09-20 05:20:02 +00001223
1224bool
Jim Ingham4f465cf2012-10-10 18:32:14 +00001225SBThread::GetStatus (SBStream &status) const
1226{
1227 Stream &strm = status.ref();
1228
1229 ExecutionContext exe_ctx (m_opaque_sp.get());
1230 if (exe_ctx.HasThreadScope())
1231 {
1232 exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
1233 }
1234 else
1235 strm.PutCString ("No status");
1236
1237 return true;
1238}
1239
1240bool
Caroline Ticeceb6b132010-10-26 03:11:13 +00001241SBThread::GetDescription (SBStream &description) const
1242{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001243 Stream &strm = description.ref();
1244
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001245 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001246 if (exe_ctx.HasThreadScope())
Caroline Ticeceb6b132010-10-26 03:11:13 +00001247 {
Daniel Malead01b2952012-11-29 21:49:15 +00001248 strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001249 }
1250 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001251 strm.PutCString ("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +00001252
1253 return true;
1254}