blob: 03dab63a3e581026f65c04663282c631bc4c6a5f [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"
Jason Molenda705b1802014-06-13 02:37:02 +000022#include "lldb/Core/StructuredData.h"
Greg Clayton66111032010-06-23 01:19:29 +000023#include "lldb/Interpreter/CommandInterpreter.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000024#include "lldb/Symbol/SymbolContext.h"
25#include "lldb/Symbol/CompileUnit.h"
Jason Molenda5dd49162013-11-06 00:04:44 +000026#include "lldb/Target/SystemRuntime.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027#include "lldb/Target/Thread.h"
28#include "lldb/Target/Process.h"
Jason Molendab9ffa982014-04-25 00:01:15 +000029#include "lldb/Target/Queue.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000030#include "lldb/Target/UnixSignals.h"
Greg Claytonf4b47e12010-08-04 01:40:35 +000031#include "lldb/Target/StopInfo.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032#include "lldb/Target/Target.h"
33#include "lldb/Target/ThreadPlan.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000034#include "lldb/Target/ThreadPlanStepInstruction.h"
35#include "lldb/Target/ThreadPlanStepOut.h"
36#include "lldb/Target/ThreadPlanStepRange.h"
37#include "lldb/Target/ThreadPlanStepInRange.h"
38
39
Eli Friedman4c5de692010-06-09 07:44:37 +000040#include "lldb/API/SBAddress.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000041#include "lldb/API/SBDebugger.h"
Jim Ingham4f465cf2012-10-10 18:32:14 +000042#include "lldb/API/SBEvent.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000043#include "lldb/API/SBFrame.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000044#include "lldb/API/SBProcess.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000045#include "lldb/API/SBThreadPlan.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000046#include "lldb/API/SBValue.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047
48using namespace lldb;
49using namespace lldb_private;
50
Jim Ingham4f465cf2012-10-10 18:32:14 +000051const char *
52SBThread::GetBroadcasterClassName ()
53{
54 return Thread::GetStaticBroadcasterClass().AsCString();
55}
56
Greg Claytoncfd1ace2010-10-31 03:01:06 +000057//----------------------------------------------------------------------
58// Constructors
59//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060SBThread::SBThread () :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000061 m_opaque_sp (new ExecutionContextRef())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062{
63}
64
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065SBThread::SBThread (const ThreadSP& lldb_object_sp) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000066 m_opaque_sp (new ExecutionContextRef(lldb_object_sp))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000067{
68}
69
Greg Clayton92ef5732010-10-30 18:26:59 +000070SBThread::SBThread (const SBThread &rhs) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000071 m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000072{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000073
Chris Lattner30fdc8d2010-06-08 16:52:24 +000074}
75
76//----------------------------------------------------------------------
Greg Claytoncfd1ace2010-10-31 03:01:06 +000077// Assignment operator
78//----------------------------------------------------------------------
79
80const lldb::SBThread &
81SBThread::operator = (const SBThread &rhs)
82{
83 if (this != &rhs)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000084 *m_opaque_sp = *rhs.m_opaque_sp;
Greg Claytoncfd1ace2010-10-31 03:01:06 +000085 return *this;
86}
87
88//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +000089// Destructor
90//----------------------------------------------------------------------
91SBThread::~SBThread()
92{
93}
94
Jason Molendab9ffa982014-04-25 00:01:15 +000095lldb::SBQueue
96SBThread::GetQueue () const
97{
98 SBQueue sb_queue;
99 QueueSP queue_sp;
100 Mutex::Locker api_locker;
101 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
102
103 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
104 if (exe_ctx.HasThreadScope())
105 {
106 Process::StopLocker stop_locker;
107 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
108 {
109 queue_sp = exe_ctx.GetThreadPtr()->GetQueue();
110 if (queue_sp)
111 {
112 sb_queue.SetQueue (queue_sp);
113 }
114 }
115 else
116 {
117 if (log)
118 log->Printf ("SBThread(%p)::GetQueueKind() => error: process is running",
119 static_cast<void*>(exe_ctx.GetThreadPtr()));
120 }
121 }
122
123 if (log)
124 log->Printf ("SBThread(%p)::GetQueueKind () => SBQueue(%p)",
125 static_cast<void*>(exe_ctx.GetThreadPtr()), static_cast<void*>(queue_sp.get()));
126
127 return sb_queue;
128}
129
130
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000131bool
132SBThread::IsValid() const
133{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000134 return m_opaque_sp->GetThreadSP().get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000135}
136
Greg Clayton48e42542010-07-30 20:12:55 +0000137void
138SBThread::Clear ()
139{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000140 m_opaque_sp->Clear();
Greg Clayton48e42542010-07-30 20:12:55 +0000141}
142
143
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000144StopReason
145SBThread::GetStopReason()
146{
Greg Clayton5160ce52013-03-27 23:08:40 +0000147 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000148
Caroline Ticeceb6b132010-10-26 03:11:13 +0000149 StopReason reason = eStopReasonInvalid;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000150 Mutex::Locker api_locker;
151 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
152
Greg Clayton1ac04c32012-02-21 00:09:25 +0000153 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000154 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000155 Process::StopLocker stop_locker;
156 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
157 {
Greg Clayton97d5cf02012-09-25 02:40:06 +0000158 return exe_ctx.GetThreadPtr()->GetStopReason();
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000159 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000160 else
161 {
162 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000163 log->Printf ("SBThread(%p)::GetStopReason() => error: process is running",
164 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000165 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000167
168 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000169 log->Printf ("SBThread(%p)::GetStopReason () => %s",
170 static_cast<void*>(exe_ctx.GetThreadPtr()),
Caroline Tice750cd172010-10-26 23:49:36 +0000171 Thread::StopReasonAsCString (reason));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000172
173 return reason;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000174}
175
176size_t
Greg Clayton4e78f602010-11-18 18:52:36 +0000177SBThread::GetStopReasonDataCount ()
178{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000179 Mutex::Locker api_locker;
180 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
181
Greg Clayton1ac04c32012-02-21 00:09:25 +0000182 if (exe_ctx.HasThreadScope())
Greg Clayton4e78f602010-11-18 18:52:36 +0000183 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000184 Process::StopLocker stop_locker;
185 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Clayton4e78f602010-11-18 18:52:36 +0000186 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000187 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
188 if (stop_info_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000189 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000190 StopReason reason = stop_info_sp->GetStopReason();
191 switch (reason)
Greg Clayton4e78f602010-11-18 18:52:36 +0000192 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000193 case eStopReasonInvalid:
194 case eStopReasonNone:
195 case eStopReasonTrace:
Greg Clayton90ba8112012-12-05 00:16:59 +0000196 case eStopReasonExec:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000197 case eStopReasonPlanComplete:
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000198 case eStopReasonThreadExiting:
Kuba Breckaafdf8422014-10-10 23:43:03 +0000199 case eStopReasonInstrumentation:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000200 // There is no data for these stop reasons.
201 return 0;
202
203 case eStopReasonBreakpoint:
204 {
205 break_id_t site_id = stop_info_sp->GetValue();
206 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
207 if (bp_site_sp)
208 return bp_site_sp->GetNumberOfOwners () * 2;
209 else
210 return 0; // Breakpoint must have cleared itself...
211 }
212 break;
213
214 case eStopReasonWatchpoint:
215 return 1;
216
217 case eStopReasonSignal:
218 return 1;
219
220 case eStopReasonException:
221 return 1;
Greg Clayton4e78f602010-11-18 18:52:36 +0000222 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000223 }
224 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000225 else
226 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000227 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000228 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000229 log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running",
230 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000231 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000232 }
233 return 0;
234}
235
236uint64_t
237SBThread::GetStopReasonDataAtIndex (uint32_t idx)
238{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000239 Mutex::Locker api_locker;
240 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
241
Greg Clayton1ac04c32012-02-21 00:09:25 +0000242 if (exe_ctx.HasThreadScope())
Greg Clayton4e78f602010-11-18 18:52:36 +0000243 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000244 Process::StopLocker stop_locker;
245 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Clayton4e78f602010-11-18 18:52:36 +0000246 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000247 Thread *thread = exe_ctx.GetThreadPtr();
248 StopInfoSP stop_info_sp = thread->GetStopInfo ();
249 if (stop_info_sp)
250 {
251 StopReason reason = stop_info_sp->GetStopReason();
252 switch (reason)
Greg Clayton4e78f602010-11-18 18:52:36 +0000253 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000254 case eStopReasonInvalid:
255 case eStopReasonNone:
256 case eStopReasonTrace:
Greg Clayton90ba8112012-12-05 00:16:59 +0000257 case eStopReasonExec:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000258 case eStopReasonPlanComplete:
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000259 case eStopReasonThreadExiting:
Kuba Breckaafdf8422014-10-10 23:43:03 +0000260 case eStopReasonInstrumentation:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000261 // There is no data for these stop reasons.
262 return 0;
263
264 case eStopReasonBreakpoint:
Greg Clayton4e78f602010-11-18 18:52:36 +0000265 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000266 break_id_t site_id = stop_info_sp->GetValue();
267 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
268 if (bp_site_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000269 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000270 uint32_t bp_index = idx / 2;
271 BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
272 if (bp_loc_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000273 {
Greg Clayton8334e142014-04-11 17:27:02 +0000274 if (idx & 1)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000275 {
276 // Odd idx, return the breakpoint location ID
277 return bp_loc_sp->GetID();
278 }
279 else
280 {
281 // Even idx, return the breakpoint ID
282 return bp_loc_sp->GetBreakpoint().GetID();
283 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000284 }
285 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000286 return LLDB_INVALID_BREAK_ID;
Greg Clayton4e78f602010-11-18 18:52:36 +0000287 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000288 break;
289
290 case eStopReasonWatchpoint:
291 return stop_info_sp->GetValue();
292
293 case eStopReasonSignal:
294 return stop_info_sp->GetValue();
295
296 case eStopReasonException:
297 return stop_info_sp->GetValue();
Greg Clayton4e78f602010-11-18 18:52:36 +0000298 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000299 }
300 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000301 else
302 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000303 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000304 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000305 log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running",
306 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000307 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000308 }
309 return 0;
310}
311
Kuba Breckaafdf8422014-10-10 23:43:03 +0000312bool
313SBThread::GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream)
314{
315 Stream &strm = stream.ref();
316
317 ExecutionContext exe_ctx (m_opaque_sp.get());
318 if (! exe_ctx.HasThreadScope())
319 return false;
320
321
322 StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo();
323 StructuredData::ObjectSP info = stop_info->GetExtendedInfo();
324 if (! info)
325 return false;
326
327 info->Dump(strm);
328
329 return true;
330}
331
Greg Clayton4e78f602010-11-18 18:52:36 +0000332size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000333SBThread::GetStopDescription (char *dst, size_t dst_len)
334{
Greg Clayton5160ce52013-03-27 23:08:40 +0000335 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000336
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000337 Mutex::Locker api_locker;
338 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
339
Greg Clayton1ac04c32012-02-21 00:09:25 +0000340 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000341 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000342 Process::StopLocker stop_locker;
343 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000344 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000345
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000346 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
347 if (stop_info_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000348 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000349 const char *stop_desc = stop_info_sp->GetDescription();
350 if (stop_desc)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351 {
Caroline Ticeceb6b132010-10-26 03:11:13 +0000352 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000353 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
354 static_cast<void*>(exe_ctx.GetThreadPtr()),
355 stop_desc);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000356 if (dst)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000357 return ::snprintf (dst, dst_len, "%s", stop_desc);
358 else
359 {
360 // NULL dst passed in, return the length needed to contain the description
361 return ::strlen (stop_desc) + 1; // Include the NULL byte for size
362 }
363 }
364 else
365 {
366 size_t stop_desc_len = 0;
367 switch (stop_info_sp->GetStopReason())
368 {
369 case eStopReasonTrace:
370 case eStopReasonPlanComplete:
371 {
372 static char trace_desc[] = "step";
373 stop_desc = trace_desc;
374 stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
375 }
376 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000378 case eStopReasonBreakpoint:
379 {
380 static char bp_desc[] = "breakpoint hit";
381 stop_desc = bp_desc;
382 stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
383 }
384 break;
385
386 case eStopReasonWatchpoint:
387 {
388 static char wp_desc[] = "watchpoint hit";
389 stop_desc = wp_desc;
390 stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
391 }
392 break;
393
394 case eStopReasonSignal:
395 {
396 stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
397 if (stop_desc == NULL || stop_desc[0] == '\0')
398 {
399 static char signal_desc[] = "signal";
400 stop_desc = signal_desc;
401 stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
402 }
403 }
404 break;
405
406 case eStopReasonException:
407 {
408 char exc_desc[] = "exception";
409 stop_desc = exc_desc;
410 stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
411 }
412 break;
413
Greg Clayton90ba8112012-12-05 00:16:59 +0000414 case eStopReasonExec:
415 {
416 char exc_desc[] = "exec";
417 stop_desc = exc_desc;
418 stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
419 }
420 break;
421
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000422 case eStopReasonThreadExiting:
423 {
424 char limbo_desc[] = "thread exiting";
425 stop_desc = limbo_desc;
426 stop_desc_len = sizeof(limbo_desc);
427 }
428 break;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000429 default:
430 break;
431 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000432
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000433 if (stop_desc && stop_desc[0])
434 {
435 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000436 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
437 static_cast<void*>(exe_ctx.GetThreadPtr()),
438 stop_desc);
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000439
440 if (dst)
441 return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
442
443 if (stop_desc_len == 0)
444 stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000445
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000446 return stop_desc_len;
447 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000448 }
449 }
450 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000451 else
452 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000453 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000454 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000455 log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running",
456 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000457 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000458 }
459 if (dst)
460 *dst = 0;
461 return 0;
462}
463
Jim Ingham73ca05a2011-12-17 01:35:57 +0000464SBValue
465SBThread::GetStopReturnValue ()
466{
Greg Clayton5160ce52013-03-27 23:08:40 +0000467 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham73ca05a2011-12-17 01:35:57 +0000468 ValueObjectSP return_valobj_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000469 Mutex::Locker api_locker;
470 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
471
Greg Clayton1ac04c32012-02-21 00:09:25 +0000472 if (exe_ctx.HasThreadScope())
Jim Ingham73ca05a2011-12-17 01:35:57 +0000473 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000474 Process::StopLocker stop_locker;
475 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Jim Ingham73ca05a2011-12-17 01:35:57 +0000476 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000477 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
478 if (stop_info_sp)
479 {
480 return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
481 }
Jim Ingham73ca05a2011-12-17 01:35:57 +0000482 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000483 else
484 {
485 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000486 log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running",
487 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000488 }
Jim Ingham73ca05a2011-12-17 01:35:57 +0000489 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000490
Jim Ingham73ca05a2011-12-17 01:35:57 +0000491 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000492 log->Printf ("SBThread(%p)::GetStopReturnValue () => %s",
493 static_cast<void*>(exe_ctx.GetThreadPtr()),
494 return_valobj_sp.get()
495 ? return_valobj_sp->GetValueAsCString()
496 : "<no return value>");
497
Jim Ingham73ca05a2011-12-17 01:35:57 +0000498 return SBValue (return_valobj_sp);
499}
500
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000501void
502SBThread::SetThread (const ThreadSP& lldb_object_sp)
503{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000504 m_opaque_sp->SetThreadSP (lldb_object_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000505}
506
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000507lldb::tid_t
508SBThread::GetThreadID () const
509{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000510 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000511 if (thread_sp)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000512 return thread_sp->GetID();
513 return LLDB_INVALID_THREAD_ID;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000514}
515
516uint32_t
517SBThread::GetIndexID () const
518{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000519 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000520 if (thread_sp)
521 return thread_sp->GetIndexID();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000522 return LLDB_INVALID_INDEX32;
523}
Greg Clayton1ac04c32012-02-21 00:09:25 +0000524
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000525const char *
526SBThread::GetName () const
527{
Greg Clayton5160ce52013-03-27 23:08:40 +0000528 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000529 const char *name = NULL;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000530 Mutex::Locker api_locker;
531 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
532
Greg Clayton1ac04c32012-02-21 00:09:25 +0000533 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +0000534 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000535 Process::StopLocker stop_locker;
536 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
537 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000538 name = exe_ctx.GetThreadPtr()->GetName();
539 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000540 else
541 {
542 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000543 log->Printf ("SBThread(%p)::GetName() => error: process is running",
544 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000545 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000546 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000547
Caroline Ticeceb6b132010-10-26 03:11:13 +0000548 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000549 log->Printf ("SBThread(%p)::GetName () => %s",
550 static_cast<void*>(exe_ctx.GetThreadPtr()),
551 name ? name : "NULL");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000552
Greg Clayton48381312010-10-30 04:51:46 +0000553 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554}
555
556const char *
557SBThread::GetQueueName () const
558{
Greg Clayton48381312010-10-30 04:51:46 +0000559 const char *name = NULL;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000560 Mutex::Locker api_locker;
561 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
562
Greg Clayton5160ce52013-03-27 23:08:40 +0000563 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton1ac04c32012-02-21 00:09:25 +0000564 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +0000565 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000566 Process::StopLocker stop_locker;
567 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
568 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000569 name = exe_ctx.GetThreadPtr()->GetQueueName();
570 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000571 else
572 {
573 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000574 log->Printf ("SBThread(%p)::GetQueueName() => error: process is running",
575 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000576 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000577 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000578
Caroline Ticeceb6b132010-10-26 03:11:13 +0000579 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000580 log->Printf ("SBThread(%p)::GetQueueName () => %s",
581 static_cast<void*>(exe_ctx.GetThreadPtr()),
582 name ? name : "NULL");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000583
Greg Clayton48381312010-10-30 04:51:46 +0000584 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000585}
586
Jason Molenda4fdb5862013-10-21 23:52:54 +0000587lldb::queue_id_t
588SBThread::GetQueueID () const
589{
590 queue_id_t id = LLDB_INVALID_QUEUE_ID;
591 Mutex::Locker api_locker;
592 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
593
594 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
595 if (exe_ctx.HasThreadScope())
596 {
597 Process::StopLocker stop_locker;
598 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
599 {
600 id = exe_ctx.GetThreadPtr()->GetQueueID();
601 }
602 else
603 {
604 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000605 log->Printf ("SBThread(%p)::GetQueueID() => error: process is running",
606 static_cast<void*>(exe_ctx.GetThreadPtr()));
Jason Molenda4fdb5862013-10-21 23:52:54 +0000607 }
608 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000609
Jason Molenda4fdb5862013-10-21 23:52:54 +0000610 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000611 log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64,
612 static_cast<void*>(exe_ctx.GetThreadPtr()), id);
Jason Molenda4fdb5862013-10-21 23:52:54 +0000613
614 return id;
615}
616
Jason Molenda705b1802014-06-13 02:37:02 +0000617bool
618SBThread::GetInfoItemByPathAsString (const char *path, SBStream &strm)
619{
620 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
621 bool success = false;
622 Mutex::Locker api_locker;
623 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
624
625 if (exe_ctx.HasThreadScope())
626 {
627 Process::StopLocker stop_locker;
628 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
629 {
630 Thread *thread = exe_ctx.GetThreadPtr();
631 StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo();
632 if (info_root_sp)
633 {
634 StructuredData::ObjectSP node = info_root_sp->GetObjectForDotSeparatedPath (path);
635 if (node)
636 {
637 if (node->GetType() == StructuredData::Type::eTypeString)
638 {
639 strm.Printf ("%s", node->GetAsString()->GetValue().c_str());
640 success = true;
641 }
642 if (node->GetType() == StructuredData::Type::eTypeInteger)
643 {
644 strm.Printf ("0x%" PRIx64, node->GetAsInteger()->GetValue());
645 success = true;
646 }
647 if (node->GetType() == StructuredData::Type::eTypeFloat)
648 {
649 strm.Printf ("0x%f", node->GetAsFloat()->GetValue());
650 success = true;
651 }
652 if (node->GetType() == StructuredData::Type::eTypeBoolean)
653 {
654 if (node->GetAsBoolean()->GetValue() == true)
655 strm.Printf ("true");
656 else
657 strm.Printf ("false");
658 success = true;
659 }
660 if (node->GetType() == StructuredData::Type::eTypeNull)
661 {
662 strm.Printf ("null");
663 success = true;
664 }
665 }
666 }
667 }
668 else
669 {
670 if (log)
671 log->Printf ("SBThread(%p)::GetInfoItemByPathAsString() => error: process is running",
672 static_cast<void*>(exe_ctx.GetThreadPtr()));
673 }
674 }
675
676 if (log)
677 log->Printf ("SBThread(%p)::GetInfoItemByPathAsString () => %s",
678 static_cast<void*>(exe_ctx.GetThreadPtr()),
679 strm.GetData());
680
681 return success;
682}
683
684
Jim Ingham64e7ead2012-05-03 21:19:36 +0000685SBError
686SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
687{
688 SBError sb_error;
689
690 Process *process = exe_ctx.GetProcessPtr();
691 if (!process)
692 {
693 sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
694 return sb_error;
695 }
696
697 Thread *thread = exe_ctx.GetThreadPtr();
698 if (!thread)
699 {
700 sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
701 return sb_error;
702 }
703
704 // User level plans should be Master Plans so they can be interrupted, other plans executed, and
705 // then a "continue" will resume the plan.
706 if (new_plan != NULL)
707 {
708 new_plan->SetIsMasterPlan(true);
709 new_plan->SetOkayToDiscard(false);
710 }
711
712 // Why do we need to set the current thread by ID here???
713 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
Greg Claytondc6224e2014-10-21 01:00:42 +0000714
715 if (process->GetTarget().GetDebugger().GetAsyncExecution ())
716 sb_error.ref() = process->Resume ();
717 else
718 sb_error.ref() = process->ResumeSynchronous (NULL);
Jim Ingham64e7ead2012-05-03 21:19:36 +0000719
720 return sb_error;
721}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000722
723void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724SBThread::StepOver (lldb::RunMode stop_other_threads)
725{
Greg Clayton5160ce52013-03-27 23:08:40 +0000726 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000727
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000728 Mutex::Locker api_locker;
729 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
730
Caroline Ticeceb6b132010-10-26 03:11:13 +0000731
Greg Clayton17a6ad02012-01-30 02:53:15 +0000732 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000733 log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')",
734 static_cast<void*>(exe_ctx.GetThreadPtr()),
Greg Clayton17a6ad02012-01-30 02:53:15 +0000735 Thread::RunModeAsCString (stop_other_threads));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000736
Greg Clayton1ac04c32012-02-21 00:09:25 +0000737 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000738 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000739 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham7ba6e992012-05-11 23:47:32 +0000740 bool abort_other_plans = false;
Jason Molendab57e4a12013-11-04 09:33:30 +0000741 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000742
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000743 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000744 if (frame_sp)
745 {
746 if (frame_sp->HasDebugInformation ())
747 {
Jim Ingham4b4b2472014-03-13 02:47:14 +0000748 const LazyBool avoid_no_debug = eLazyBoolCalculate;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000749 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000750 new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000751 sc.line_entry.range,
752 sc,
Jim Ingham4b4b2472014-03-13 02:47:14 +0000753 stop_other_threads,
754 avoid_no_debug);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000755 }
756 else
757 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000758 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000759 abort_other_plans,
760 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761 }
762 }
763
Jim Ingham64e7ead2012-05-03 21:19:36 +0000764 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000765 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000766 }
767}
768
769void
770SBThread::StepInto (lldb::RunMode stop_other_threads)
771{
Jim Inghamc6276822012-12-12 19:58:40 +0000772 StepInto (NULL, stop_other_threads);
773}
774
775void
776SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
777{
Greg Clayton5160ce52013-03-27 23:08:40 +0000778 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000779
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000780 Mutex::Locker api_locker;
781 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000782
783 if (log)
Jim Inghamc6276822012-12-12 19:58:40 +0000784 log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000785 static_cast<void*>(exe_ctx.GetThreadPtr()),
Jim Inghamc6276822012-12-12 19:58:40 +0000786 target_name? target_name: "<NULL>",
Greg Clayton17a6ad02012-01-30 02:53:15 +0000787 Thread::RunModeAsCString (stop_other_threads));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000788
Greg Clayton1ac04c32012-02-21 00:09:25 +0000789 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000790 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000791 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000792
Greg Clayton1ac04c32012-02-21 00:09:25 +0000793 Thread *thread = exe_ctx.GetThreadPtr();
Jason Molendab57e4a12013-11-04 09:33:30 +0000794 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000795 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000796
797 if (frame_sp && frame_sp->HasDebugInformation ())
798 {
Jim Ingham4b4b2472014-03-13 02:47:14 +0000799 const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate;
800 const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000801 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000802 new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000803 sc.line_entry.range,
804 sc,
805 target_name,
806 stop_other_threads,
Jim Ingham4b4b2472014-03-13 02:47:14 +0000807 step_in_avoids_code_without_debug_info,
808 step_out_avoids_code_without_debug_info);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000809 }
810 else
811 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000812 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000813 abort_other_plans,
814 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000815 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000816
Jim Ingham64e7ead2012-05-03 21:19:36 +0000817 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000818 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000819 }
820}
821
822void
823SBThread::StepOut ()
824{
Greg Clayton5160ce52013-03-27 23:08:40 +0000825 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000826
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000827 Mutex::Locker api_locker;
828 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
829
Caroline Ticeceb6b132010-10-26 03:11:13 +0000830
Greg Clayton17a6ad02012-01-30 02:53:15 +0000831 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000832 log->Printf ("SBThread(%p)::StepOut ()",
833 static_cast<void*>(exe_ctx.GetThreadPtr()));
834
Greg Clayton1ac04c32012-02-21 00:09:25 +0000835 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000836 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000837 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000838 bool stop_other_threads = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000839
Greg Clayton1ac04c32012-02-21 00:09:25 +0000840 Thread *thread = exe_ctx.GetThreadPtr();
841
Jim Ingham4b4b2472014-03-13 02:47:14 +0000842 const LazyBool avoid_no_debug = eLazyBoolCalculate;
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000843 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000844 NULL,
845 false,
846 stop_other_threads,
847 eVoteYes,
848 eVoteNoOpinion,
849 0,
850 avoid_no_debug));
851
Jim Ingham64e7ead2012-05-03 21:19:36 +0000852 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000853 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +0000854 }
855}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000856
Greg Clayton481cef22011-01-21 06:11:58 +0000857void
858SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
859{
Greg Clayton5160ce52013-03-27 23:08:40 +0000860 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000861
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000862 Mutex::Locker api_locker;
863 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
864
Jason Molendab57e4a12013-11-04 09:33:30 +0000865 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Clayton481cef22011-01-21 06:11:58 +0000866 if (log)
867 {
868 SBStream frame_desc_strm;
869 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000870 log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)",
871 static_cast<void*>(exe_ctx.GetThreadPtr()),
872 static_cast<void*>(frame_sp.get()),
873 frame_desc_strm.GetData());
Greg Clayton481cef22011-01-21 06:11:58 +0000874 }
875
Greg Clayton1ac04c32012-02-21 00:09:25 +0000876 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000877 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000878 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000879 bool stop_other_threads = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000880 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000881
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000882 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000883 NULL,
884 false,
885 stop_other_threads,
886 eVoteYes,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000887 eVoteNoOpinion,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000888 frame_sp->GetFrameIndex()));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000889
Jim Ingham64e7ead2012-05-03 21:19:36 +0000890 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000891 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000892 }
893}
894
895void
896SBThread::StepInstruction (bool step_over)
897{
Greg Clayton5160ce52013-03-27 23:08:40 +0000898 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000899
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000900 Mutex::Locker api_locker;
901 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
902
Greg Clayton1ac04c32012-02-21 00:09:25 +0000903
Caroline Ticeceb6b132010-10-26 03:11:13 +0000904
Greg Clayton17a6ad02012-01-30 02:53:15 +0000905 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000906 log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)",
907 static_cast<void*>(exe_ctx.GetThreadPtr()), step_over);
908
Greg Clayton1ac04c32012-02-21 00:09:25 +0000909 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000910 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000911 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000912 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000913
Jim Ingham64e7ead2012-05-03 21:19:36 +0000914 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000915 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000916 }
917}
918
919void
920SBThread::RunToAddress (lldb::addr_t addr)
921{
Greg Clayton5160ce52013-03-27 23:08:40 +0000922 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000923
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000924 Mutex::Locker api_locker;
925 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
926
Caroline Ticeceb6b132010-10-26 03:11:13 +0000927
Greg Clayton17a6ad02012-01-30 02:53:15 +0000928 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000929 log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")",
930 static_cast<void*>(exe_ctx.GetThreadPtr()), addr);
931
Greg Clayton1ac04c32012-02-21 00:09:25 +0000932 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000933 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000934 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000935 bool stop_other_threads = true;
936
Greg Claytone72dfb32012-02-24 01:59:29 +0000937 Address target_addr (addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000938
Greg Clayton1ac04c32012-02-21 00:09:25 +0000939 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000940
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000941 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans,
942 target_addr,
943 stop_other_threads));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000944
Jim Ingham64e7ead2012-05-03 21:19:36 +0000945 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000946 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000947 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000948}
949
Greg Clayton481cef22011-01-21 06:11:58 +0000950SBError
951SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
952 lldb::SBFileSpec &sb_file_spec,
953 uint32_t line)
954{
955 SBError sb_error;
Greg Clayton5160ce52013-03-27 23:08:40 +0000956 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000957 char path[PATH_MAX];
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000958
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000959 Mutex::Locker api_locker;
960 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
961
Jason Molendab57e4a12013-11-04 09:33:30 +0000962 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000963
Greg Clayton481cef22011-01-21 06:11:58 +0000964 if (log)
965 {
966 SBStream frame_desc_strm;
967 sb_frame.GetDescription (frame_desc_strm);
968 sb_file_spec->GetPath (path, sizeof(path));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000969 log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
970 static_cast<void*>(exe_ctx.GetThreadPtr()),
971 static_cast<void*>(frame_sp.get()),
972 frame_desc_strm.GetData(), path, line);
Greg Clayton481cef22011-01-21 06:11:58 +0000973 }
Greg Clayton17a6ad02012-01-30 02:53:15 +0000974
Greg Clayton1ac04c32012-02-21 00:09:25 +0000975 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000976 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000977 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000978 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000979
980 if (line == 0)
981 {
982 sb_error.SetErrorString("invalid line argument");
983 return sb_error;
984 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000985
Greg Claytonb9556ac2012-01-30 07:41:31 +0000986 if (!frame_sp)
Greg Clayton481cef22011-01-21 06:11:58 +0000987 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000988 frame_sp = thread->GetSelectedFrame ();
Greg Clayton481cef22011-01-21 06:11:58 +0000989 if (!frame_sp)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000990 frame_sp = thread->GetStackFrameAtIndex (0);
Greg Clayton481cef22011-01-21 06:11:58 +0000991 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000992
Greg Clayton481cef22011-01-21 06:11:58 +0000993 SymbolContext frame_sc;
994 if (!frame_sp)
995 {
996 sb_error.SetErrorString("no valid frames in thread to step");
997 return sb_error;
998 }
999
1000 // If we have a frame, get its line
1001 frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit |
1002 eSymbolContextFunction |
1003 eSymbolContextLineEntry |
1004 eSymbolContextSymbol );
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001005
Greg Clayton481cef22011-01-21 06:11:58 +00001006 if (frame_sc.comp_unit == NULL)
1007 {
1008 sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
1009 return sb_error;
1010 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001011
Greg Clayton481cef22011-01-21 06:11:58 +00001012 FileSpec step_file_spec;
1013 if (sb_file_spec.IsValid())
1014 {
1015 // The file spec passed in was valid, so use it
1016 step_file_spec = sb_file_spec.ref();
1017 }
1018 else
1019 {
1020 if (frame_sc.line_entry.IsValid())
1021 step_file_spec = frame_sc.line_entry.file;
1022 else
1023 {
1024 sb_error.SetErrorString("invalid file argument or no file for frame");
1025 return sb_error;
1026 }
1027 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001028
Jim Ingham9b70ddb2011-05-08 00:56:32 +00001029 // Grab the current function, then we will make sure the "until" address is
1030 // within the function. We discard addresses that are out of the current
1031 // function, and then if there are no addresses remaining, give an appropriate
1032 // error message.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001033
Jim Ingham9b70ddb2011-05-08 00:56:32 +00001034 bool all_in_function = true;
1035 AddressRange fun_range = frame_sc.function->GetAddressRange();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001036
Greg Clayton481cef22011-01-21 06:11:58 +00001037 std::vector<addr_t> step_over_until_addrs;
Jim Ingham7ba6e992012-05-11 23:47:32 +00001038 const bool abort_other_plans = false;
Jim Inghamc02e3342012-09-14 18:57:14 +00001039 const bool stop_other_threads = false;
Greg Clayton481cef22011-01-21 06:11:58 +00001040 const bool check_inlines = true;
1041 const bool exact = false;
1042
1043 SymbolContextList sc_list;
Jim Ingham9b70ddb2011-05-08 00:56:32 +00001044 const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
1045 line,
1046 check_inlines,
1047 exact,
1048 eSymbolContextLineEntry,
1049 sc_list);
Greg Clayton481cef22011-01-21 06:11:58 +00001050 if (num_matches > 0)
1051 {
1052 SymbolContext sc;
1053 for (uint32_t i=0; i<num_matches; ++i)
1054 {
1055 if (sc_list.GetContextAtIndex(i, sc))
1056 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +00001057 addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
Greg Clayton481cef22011-01-21 06:11:58 +00001058 if (step_addr != LLDB_INVALID_ADDRESS)
1059 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +00001060 if (fun_range.ContainsLoadAddress(step_addr, target))
1061 step_over_until_addrs.push_back(step_addr);
1062 else
1063 all_in_function = false;
Greg Clayton481cef22011-01-21 06:11:58 +00001064 }
1065 }
1066 }
1067 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001068
Greg Clayton481cef22011-01-21 06:11:58 +00001069 if (step_over_until_addrs.empty())
1070 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +00001071 if (all_in_function)
1072 {
1073 step_file_spec.GetPath (path, sizeof(path));
Jason Molendafd54b362011-09-20 21:44:10 +00001074 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
Jim Ingham9b70ddb2011-05-08 00:56:32 +00001075 }
1076 else
Greg Clayton86edbf42011-10-26 00:56:27 +00001077 sb_error.SetErrorString ("step until target not in current function");
Greg Clayton481cef22011-01-21 06:11:58 +00001078 }
1079 else
1080 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +00001081 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +00001082 &step_over_until_addrs[0],
1083 step_over_until_addrs.size(),
1084 stop_other_threads,
Jim Ingham4d56e9c2013-07-18 21:48:26 +00001085 frame_sp->GetFrameIndex()));
Greg Clayton481cef22011-01-21 06:11:58 +00001086
Jim Ingham4d56e9c2013-07-18 21:48:26 +00001087 sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +00001088 }
1089 }
1090 else
1091 {
1092 sb_error.SetErrorString("this SBThread object is invalid");
1093 }
1094 return sb_error;
1095}
1096
Jim Ingham44137582012-09-12 00:40:39 +00001097SBError
Jim Ingham2bdbfd52014-09-29 23:17:18 +00001098SBThread::StepUsingScriptedThreadPlan (const char *script_class_name)
1099{
1100 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1101 SBError sb_error;
1102
1103 Mutex::Locker api_locker;
1104 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1105
1106 if (log)
1107 {
1108 log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s",
1109 static_cast<void*>(exe_ctx.GetThreadPtr()),
1110 script_class_name);
1111 }
1112
1113
1114 if (!exe_ctx.HasThreadScope())
1115 {
1116 sb_error.SetErrorString("this SBThread object is invalid");
1117 return sb_error;
1118 }
1119
1120 Thread *thread = exe_ctx.GetThreadPtr();
1121 ThreadPlanSP thread_plan_sp = thread->QueueThreadPlanForStepScripted(false, script_class_name, false);
1122
1123 if (thread_plan_sp)
1124 sb_error = ResumeNewPlan(exe_ctx, thread_plan_sp.get());
1125 else
1126 {
1127 sb_error.SetErrorStringWithFormat("Error queuing thread plan for class: %s.", script_class_name);
1128 if (log)
1129 log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: Error queuing thread plan for class: %s",
1130 static_cast<void*>(exe_ctx.GetThreadPtr()),
1131 script_class_name);
1132 }
1133
1134 return sb_error;
1135}
1136
1137SBError
Richard Mittonf86248d2013-09-12 02:20:34 +00001138SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line)
1139{
1140 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1141 SBError sb_error;
1142
1143 Mutex::Locker api_locker;
1144 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1145
1146 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001147 log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)",
1148 static_cast<void*>(exe_ctx.GetThreadPtr()),
1149 file_spec->GetPath().c_str(), line);
Richard Mittonf86248d2013-09-12 02:20:34 +00001150
1151 if (!exe_ctx.HasThreadScope())
1152 {
1153 sb_error.SetErrorString("this SBThread object is invalid");
1154 return sb_error;
1155 }
1156
1157 Thread *thread = exe_ctx.GetThreadPtr();
1158
1159 Error err = thread->JumpToLine (file_spec.get(), line, true);
1160 sb_error.SetError (err);
1161 return sb_error;
1162}
1163
1164SBError
Jim Inghamcb640dd2012-09-14 02:14:15 +00001165SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
Jim Ingham44137582012-09-12 00:40:39 +00001166{
1167 SBError sb_error;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001168
Greg Clayton5160ce52013-03-27 23:08:40 +00001169 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham44137582012-09-12 00:40:39 +00001170
1171 Mutex::Locker api_locker;
1172 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1173
1174
1175 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001176 log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)",
1177 static_cast<void*>(exe_ctx.GetThreadPtr()),
1178 frame.GetFrameID());
1179
Jim Ingham44137582012-09-12 00:40:39 +00001180 if (exe_ctx.HasThreadScope())
1181 {
1182 Thread *thread = exe_ctx.GetThreadPtr();
Jim Inghamcb640dd2012-09-14 02:14:15 +00001183 sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
Jim Ingham44137582012-09-12 00:40:39 +00001184 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001185
Jim Ingham44137582012-09-12 00:40:39 +00001186 return sb_error;
1187}
1188
Greg Clayton481cef22011-01-21 06:11:58 +00001189
Greg Clayton722a0cd2011-01-12 02:25:42 +00001190bool
1191SBThread::Suspend()
1192{
Greg Clayton5160ce52013-03-27 23:08:40 +00001193 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001194 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +00001195 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +00001196 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +00001197 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001198 Process::StopLocker stop_locker;
1199 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1200 {
1201 exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
1202 result = true;
1203 }
1204 else
1205 {
1206 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001207 log->Printf ("SBThread(%p)::Suspend() => error: process is running",
1208 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001209 }
Greg Clayton722a0cd2011-01-12 02:25:42 +00001210 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001211 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001212 log->Printf ("SBThread(%p)::Suspend() => %i",
1213 static_cast<void*>(exe_ctx.GetThreadPtr()), result);
Greg Claytonc9858e42012-04-06 02:17:47 +00001214 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001215}
1216
1217bool
1218SBThread::Resume ()
1219{
Greg Clayton5160ce52013-03-27 23:08:40 +00001220 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001221 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +00001222 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +00001223 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +00001224 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001225 Process::StopLocker stop_locker;
1226 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1227 {
Jim Ingham6c9ed912014-04-03 01:26:14 +00001228 const bool override_suspend = true;
1229 exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend);
Greg Claytonc9858e42012-04-06 02:17:47 +00001230 result = true;
1231 }
1232 else
1233 {
1234 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001235 log->Printf ("SBThread(%p)::Resume() => error: process is running",
1236 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001237 }
Greg Clayton722a0cd2011-01-12 02:25:42 +00001238 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001239 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001240 log->Printf ("SBThread(%p)::Resume() => %i",
1241 static_cast<void*>(exe_ctx.GetThreadPtr()), result);
Greg Claytonc9858e42012-04-06 02:17:47 +00001242 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001243}
1244
1245bool
1246SBThread::IsSuspended()
1247{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001248 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001249 if (exe_ctx.HasThreadScope())
1250 return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001251 return false;
1252}
1253
Andrew Kaylora75418d2013-04-15 23:33:53 +00001254bool
1255SBThread::IsStopped()
1256{
1257 ExecutionContext exe_ctx (m_opaque_sp.get());
1258 if (exe_ctx.HasThreadScope())
1259 return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1260 return false;
1261}
1262
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001263SBProcess
1264SBThread::GetProcess ()
1265{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001266 SBProcess sb_process;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001267 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001268 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001269 {
1270 // Have to go up to the target so we can get a shared pointer to our process...
Greg Clayton1ac04c32012-02-21 00:09:25 +00001271 sb_process.SetSP (exe_ctx.GetProcessSP());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001272 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001273
Greg Clayton5160ce52013-03-27 23:08:40 +00001274 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001275 if (log)
1276 {
Greg Clayton481cef22011-01-21 06:11:58 +00001277 SBStream frame_desc_strm;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001278 sb_process.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001279 log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s",
1280 static_cast<void*>(exe_ctx.GetThreadPtr()),
1281 static_cast<void*>(sb_process.GetSP().get()),
1282 frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001283 }
1284
Greg Claytonb9556ac2012-01-30 07:41:31 +00001285 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001286}
1287
1288uint32_t
1289SBThread::GetNumFrames ()
1290{
Greg Clayton5160ce52013-03-27 23:08:40 +00001291 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001292
Caroline Ticeceb6b132010-10-26 03:11:13 +00001293 uint32_t num_frames = 0;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001294 Mutex::Locker api_locker;
1295 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1296
Greg Clayton1ac04c32012-02-21 00:09:25 +00001297 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001298 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001299 Process::StopLocker stop_locker;
1300 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1301 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001302 num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1303 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001304 else
1305 {
1306 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001307 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running",
1308 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001309 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001310 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001311
1312 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001313 log->Printf ("SBThread(%p)::GetNumFrames () => %u",
1314 static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001315
1316 return num_frames;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001317}
1318
1319SBFrame
1320SBThread::GetFrameAtIndex (uint32_t idx)
1321{
Greg Clayton5160ce52013-03-27 23:08:40 +00001322 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001323
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001324 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001325 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001326 Mutex::Locker api_locker;
1327 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1328
Greg Clayton1ac04c32012-02-21 00:09:25 +00001329 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001330 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001331 Process::StopLocker stop_locker;
1332 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1333 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001334 frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1335 sb_frame.SetFrameSP (frame_sp);
1336 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001337 else
1338 {
1339 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001340 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running",
1341 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001342 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001343 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001344
1345 if (log)
1346 {
Greg Clayton481cef22011-01-21 06:11:58 +00001347 SBStream frame_desc_strm;
1348 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001349 log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
1350 static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1351 static_cast<void*>(frame_sp.get()),
1352 frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001353 }
1354
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001355 return sb_frame;
1356}
1357
Greg Claytonf028a1f2010-12-17 02:26:24 +00001358lldb::SBFrame
1359SBThread::GetSelectedFrame ()
1360{
Greg Clayton5160ce52013-03-27 23:08:40 +00001361 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001362
1363 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001364 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001365 Mutex::Locker api_locker;
1366 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1367
Greg Clayton1ac04c32012-02-21 00:09:25 +00001368 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001369 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001370 Process::StopLocker stop_locker;
1371 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1372 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001373 frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1374 sb_frame.SetFrameSP (frame_sp);
1375 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001376 else
1377 {
1378 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001379 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running",
1380 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001381 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001382 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001383
1384 if (log)
1385 {
Greg Clayton481cef22011-01-21 06:11:58 +00001386 SBStream frame_desc_strm;
1387 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001388 log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
1389 static_cast<void*>(exe_ctx.GetThreadPtr()),
1390 static_cast<void*>(frame_sp.get()),
1391 frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001392 }
1393
1394 return sb_frame;
1395}
1396
1397lldb::SBFrame
1398SBThread::SetSelectedFrame (uint32_t idx)
1399{
Greg Clayton5160ce52013-03-27 23:08:40 +00001400 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001401
1402 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001403 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001404 Mutex::Locker api_locker;
1405 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1406
Greg Clayton1ac04c32012-02-21 00:09:25 +00001407 if (exe_ctx.HasThreadScope())
Greg Claytonf028a1f2010-12-17 02:26:24 +00001408 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001409 Process::StopLocker stop_locker;
1410 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Claytonf028a1f2010-12-17 02:26:24 +00001411 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001412 Thread *thread = exe_ctx.GetThreadPtr();
1413 frame_sp = thread->GetStackFrameAtIndex (idx);
1414 if (frame_sp)
1415 {
1416 thread->SetSelectedFrame (frame_sp.get());
1417 sb_frame.SetFrameSP (frame_sp);
1418 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001419 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001420 else
1421 {
1422 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001423 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running",
1424 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001425 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001426 }
1427
1428 if (log)
1429 {
Greg Clayton481cef22011-01-21 06:11:58 +00001430 SBStream frame_desc_strm;
1431 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001432 log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
1433 static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1434 static_cast<void*>(frame_sp.get()),
1435 frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001436 }
1437 return sb_frame;
1438}
1439
Jim Ingham4f465cf2012-10-10 18:32:14 +00001440bool
1441SBThread::EventIsThreadEvent (const SBEvent &event)
1442{
1443 return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
1444}
1445
1446SBFrame
1447SBThread::GetStackFrameFromEvent (const SBEvent &event)
1448{
1449 return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
1450
1451}
1452
1453SBThread
1454SBThread::GetThreadFromEvent (const SBEvent &event)
1455{
1456 return Thread::ThreadEventData::GetThreadFromEvent (event.get());
1457}
Greg Claytonf028a1f2010-12-17 02:26:24 +00001458
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001459bool
1460SBThread::operator == (const SBThread &rhs) const
1461{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001462 return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001463}
1464
1465bool
1466SBThread::operator != (const SBThread &rhs) const
1467{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001468 return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001469}
Caroline Ticedde9cff2010-09-20 05:20:02 +00001470
1471bool
Jim Ingham4f465cf2012-10-10 18:32:14 +00001472SBThread::GetStatus (SBStream &status) const
1473{
1474 Stream &strm = status.ref();
1475
1476 ExecutionContext exe_ctx (m_opaque_sp.get());
1477 if (exe_ctx.HasThreadScope())
1478 {
1479 exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
1480 }
1481 else
1482 strm.PutCString ("No status");
1483
1484 return true;
1485}
1486
1487bool
Caroline Ticeceb6b132010-10-26 03:11:13 +00001488SBThread::GetDescription (SBStream &description) const
1489{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001490 Stream &strm = description.ref();
1491
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001492 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001493 if (exe_ctx.HasThreadScope())
Caroline Ticeceb6b132010-10-26 03:11:13 +00001494 {
Jim Ingham603985f2015-01-28 01:18:01 +00001495 exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, LLDB_INVALID_THREAD_ID);
1496 //strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001497 }
1498 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001499 strm.PutCString ("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +00001500
1501 return true;
1502}
Jason Molenda5dd49162013-11-06 00:04:44 +00001503
1504SBThread
Jason Molenda008c45f2013-11-12 23:33:32 +00001505SBThread::GetExtendedBacktraceThread (const char *type)
Jason Molenda5dd49162013-11-06 00:04:44 +00001506{
1507 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1508 Mutex::Locker api_locker;
1509 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1510 SBThread sb_origin_thread;
1511
1512 if (exe_ctx.HasThreadScope())
1513 {
1514 Process::StopLocker stop_locker;
1515 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1516 {
Jason Molenda7a2f7902013-11-11 05:19:34 +00001517 ThreadSP real_thread(exe_ctx.GetThreadSP());
Jason Molenda5dd49162013-11-06 00:04:44 +00001518 if (real_thread)
1519 {
1520 ConstString type_const (type);
Jason Molenda7a2f7902013-11-11 05:19:34 +00001521 Process *process = exe_ctx.GetProcessPtr();
1522 if (process)
Jason Molenda5dd49162013-11-06 00:04:44 +00001523 {
Jason Molenda7a2f7902013-11-11 05:19:34 +00001524 SystemRuntime *runtime = process->GetSystemRuntime();
1525 if (runtime)
1526 {
Jason Molenda008c45f2013-11-12 23:33:32 +00001527 ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const));
Jason Molendaa6e91302013-11-19 05:44:41 +00001528 if (new_thread_sp)
1529 {
1530 // Save this in the Process' ExtendedThreadList so a strong pointer retains the
1531 // object.
1532 process->GetExtendedThreadList().AddThread (new_thread_sp);
1533 sb_origin_thread.SetThread (new_thread_sp);
1534 if (log)
1535 {
1536 const char *queue_name = new_thread_sp->GetQueueName();
1537 if (queue_name == NULL)
1538 queue_name = "";
Jim Ingham2bdbfd52014-09-29 23:17:18 +00001539 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread "
1540 "created (%p) with queue_id 0x%" PRIx64 " queue name '%s'",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001541 static_cast<void*>(exe_ctx.GetThreadPtr()),
1542 static_cast<void*>(new_thread_sp.get()),
1543 new_thread_sp->GetQueueID(),
1544 queue_name);
Jason Molendaa6e91302013-11-19 05:44:41 +00001545 }
1546 }
Jason Molenda7a2f7902013-11-11 05:19:34 +00001547 }
Jason Molenda5dd49162013-11-06 00:04:44 +00001548 }
1549 }
1550 }
1551 else
1552 {
1553 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001554 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running",
1555 static_cast<void*>(exe_ctx.GetThreadPtr()));
Jason Molenda5dd49162013-11-06 00:04:44 +00001556 }
1557 }
1558
Jason Molendaac605f42014-03-08 01:34:55 +00001559 if (log && sb_origin_thread.IsValid() == false)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001560 log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread",
1561 static_cast<void*>(exe_ctx.GetThreadPtr()));
Jason Molenda5dd49162013-11-06 00:04:44 +00001562 return sb_origin_thread;
1563}
Jason Molenda8ee9cb52013-11-16 01:24:22 +00001564
1565uint32_t
1566SBThread::GetExtendedBacktraceOriginatingIndexID ()
1567{
1568 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1569 if (thread_sp)
1570 return thread_sp->GetExtendedBacktraceOriginatingIndexID();
1571 return LLDB_INVALID_INDEX32;
1572}
Jason Molendab4892cd2014-05-13 22:02:48 +00001573
1574bool
1575SBThread::SafeToCallFunctions ()
1576{
1577 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1578 if (thread_sp)
1579 return thread_sp->SafeToCallFunctions();
1580 return true;
1581}
Jim Ingham2bdbfd52014-09-29 23:17:18 +00001582
1583lldb_private::Thread *
1584SBThread::operator->()
1585{
1586 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1587 if (thread_sp)
1588 return thread_sp.get();
1589 else
1590 return NULL;
1591}
1592
1593lldb_private::Thread *
1594SBThread::get()
1595{
1596 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1597 if (thread_sp)
1598 return thread_sp.get();
1599 else
1600 return NULL;
1601}
1602