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