blob: 60731e85d0b39b02d2daf22de82dfbad874a86d7 [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"
Jason Molendab9ffa982014-04-25 00:01:15 +000026#include "lldb/Target/Queue.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027#include "lldb/Symbol/SymbolContext.h"
28#include "lldb/Symbol/CompileUnit.h"
Greg Claytonf4b47e12010-08-04 01:40:35 +000029#include "lldb/Target/StopInfo.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030#include "lldb/Target/Target.h"
31#include "lldb/Target/ThreadPlan.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032#include "lldb/Target/ThreadPlanStepInstruction.h"
33#include "lldb/Target/ThreadPlanStepOut.h"
34#include "lldb/Target/ThreadPlanStepRange.h"
35#include "lldb/Target/ThreadPlanStepInRange.h"
36
37
Eli Friedman4c5de692010-06-09 07:44:37 +000038#include "lldb/API/SBAddress.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000039#include "lldb/API/SBDebugger.h"
Jim Ingham4f465cf2012-10-10 18:32:14 +000040#include "lldb/API/SBEvent.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000041#include "lldb/API/SBFrame.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000042#include "lldb/API/SBProcess.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000043#include "lldb/API/SBValue.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044
45using namespace lldb;
46using namespace lldb_private;
47
Jim Ingham4f465cf2012-10-10 18:32:14 +000048const char *
49SBThread::GetBroadcasterClassName ()
50{
51 return Thread::GetStaticBroadcasterClass().AsCString();
52}
53
Greg Claytoncfd1ace2010-10-31 03:01:06 +000054//----------------------------------------------------------------------
55// Constructors
56//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057SBThread::SBThread () :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000058 m_opaque_sp (new ExecutionContextRef())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059{
60}
61
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062SBThread::SBThread (const ThreadSP& lldb_object_sp) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000063 m_opaque_sp (new ExecutionContextRef(lldb_object_sp))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000064{
65}
66
Greg Clayton92ef5732010-10-30 18:26:59 +000067SBThread::SBThread (const SBThread &rhs) :
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000068 m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp))
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000070
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071}
72
73//----------------------------------------------------------------------
Greg Claytoncfd1ace2010-10-31 03:01:06 +000074// Assignment operator
75//----------------------------------------------------------------------
76
77const lldb::SBThread &
78SBThread::operator = (const SBThread &rhs)
79{
80 if (this != &rhs)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +000081 *m_opaque_sp = *rhs.m_opaque_sp;
Greg Claytoncfd1ace2010-10-31 03:01:06 +000082 return *this;
83}
84
85//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086// Destructor
87//----------------------------------------------------------------------
88SBThread::~SBThread()
89{
90}
91
Jason Molendab9ffa982014-04-25 00:01:15 +000092lldb::SBQueue
93SBThread::GetQueue () const
94{
95 SBQueue sb_queue;
96 QueueSP queue_sp;
97 Mutex::Locker api_locker;
98 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
99
100 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
101 if (exe_ctx.HasThreadScope())
102 {
103 Process::StopLocker stop_locker;
104 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
105 {
106 queue_sp = exe_ctx.GetThreadPtr()->GetQueue();
107 if (queue_sp)
108 {
109 sb_queue.SetQueue (queue_sp);
110 }
111 }
112 else
113 {
114 if (log)
115 log->Printf ("SBThread(%p)::GetQueueKind() => error: process is running",
116 static_cast<void*>(exe_ctx.GetThreadPtr()));
117 }
118 }
119
120 if (log)
121 log->Printf ("SBThread(%p)::GetQueueKind () => SBQueue(%p)",
122 static_cast<void*>(exe_ctx.GetThreadPtr()), static_cast<void*>(queue_sp.get()));
123
124 return sb_queue;
125}
126
127
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128bool
129SBThread::IsValid() const
130{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000131 return m_opaque_sp->GetThreadSP().get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000132}
133
Greg Clayton48e42542010-07-30 20:12:55 +0000134void
135SBThread::Clear ()
136{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000137 m_opaque_sp->Clear();
Greg Clayton48e42542010-07-30 20:12:55 +0000138}
139
140
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000141StopReason
142SBThread::GetStopReason()
143{
Greg Clayton5160ce52013-03-27 23:08:40 +0000144 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000145
Caroline Ticeceb6b132010-10-26 03:11:13 +0000146 StopReason reason = eStopReasonInvalid;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000147 Mutex::Locker api_locker;
148 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
149
Greg Clayton1ac04c32012-02-21 00:09:25 +0000150 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000151 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000152 Process::StopLocker stop_locker;
153 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
154 {
Greg Clayton97d5cf02012-09-25 02:40:06 +0000155 return exe_ctx.GetThreadPtr()->GetStopReason();
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000156 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000157 else
158 {
159 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000160 log->Printf ("SBThread(%p)::GetStopReason() => error: process is running",
161 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000162 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000163 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000164
165 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000166 log->Printf ("SBThread(%p)::GetStopReason () => %s",
167 static_cast<void*>(exe_ctx.GetThreadPtr()),
Caroline Tice750cd172010-10-26 23:49:36 +0000168 Thread::StopReasonAsCString (reason));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000169
170 return reason;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000171}
172
173size_t
Greg Clayton4e78f602010-11-18 18:52:36 +0000174SBThread::GetStopReasonDataCount ()
175{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000176 Mutex::Locker api_locker;
177 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
178
Greg Clayton1ac04c32012-02-21 00:09:25 +0000179 if (exe_ctx.HasThreadScope())
Greg Clayton4e78f602010-11-18 18:52:36 +0000180 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000181 Process::StopLocker stop_locker;
182 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Clayton4e78f602010-11-18 18:52:36 +0000183 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000184 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
185 if (stop_info_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000186 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000187 StopReason reason = stop_info_sp->GetStopReason();
188 switch (reason)
Greg Clayton4e78f602010-11-18 18:52:36 +0000189 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000190 case eStopReasonInvalid:
191 case eStopReasonNone:
192 case eStopReasonTrace:
Greg Clayton90ba8112012-12-05 00:16:59 +0000193 case eStopReasonExec:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000194 case eStopReasonPlanComplete:
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000195 case eStopReasonThreadExiting:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000196 // There is no data for these stop reasons.
197 return 0;
198
199 case eStopReasonBreakpoint:
200 {
201 break_id_t site_id = stop_info_sp->GetValue();
202 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
203 if (bp_site_sp)
204 return bp_site_sp->GetNumberOfOwners () * 2;
205 else
206 return 0; // Breakpoint must have cleared itself...
207 }
208 break;
209
210 case eStopReasonWatchpoint:
211 return 1;
212
213 case eStopReasonSignal:
214 return 1;
215
216 case eStopReasonException:
217 return 1;
Greg Clayton4e78f602010-11-18 18:52:36 +0000218 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000219 }
220 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000221 else
222 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000223 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000224 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000225 log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running",
226 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000227 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000228 }
229 return 0;
230}
231
232uint64_t
233SBThread::GetStopReasonDataAtIndex (uint32_t idx)
234{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000235 Mutex::Locker api_locker;
236 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
237
Greg Clayton1ac04c32012-02-21 00:09:25 +0000238 if (exe_ctx.HasThreadScope())
Greg Clayton4e78f602010-11-18 18:52:36 +0000239 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000240 Process::StopLocker stop_locker;
241 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Clayton4e78f602010-11-18 18:52:36 +0000242 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000243 Thread *thread = exe_ctx.GetThreadPtr();
244 StopInfoSP stop_info_sp = thread->GetStopInfo ();
245 if (stop_info_sp)
246 {
247 StopReason reason = stop_info_sp->GetStopReason();
248 switch (reason)
Greg Clayton4e78f602010-11-18 18:52:36 +0000249 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000250 case eStopReasonInvalid:
251 case eStopReasonNone:
252 case eStopReasonTrace:
Greg Clayton90ba8112012-12-05 00:16:59 +0000253 case eStopReasonExec:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000254 case eStopReasonPlanComplete:
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000255 case eStopReasonThreadExiting:
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000256 // There is no data for these stop reasons.
257 return 0;
258
259 case eStopReasonBreakpoint:
Greg Clayton4e78f602010-11-18 18:52:36 +0000260 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000261 break_id_t site_id = stop_info_sp->GetValue();
262 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
263 if (bp_site_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000264 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000265 uint32_t bp_index = idx / 2;
266 BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
267 if (bp_loc_sp)
Greg Clayton4e78f602010-11-18 18:52:36 +0000268 {
Greg Clayton8334e142014-04-11 17:27:02 +0000269 if (idx & 1)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000270 {
271 // Odd idx, return the breakpoint location ID
272 return bp_loc_sp->GetID();
273 }
274 else
275 {
276 // Even idx, return the breakpoint ID
277 return bp_loc_sp->GetBreakpoint().GetID();
278 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000279 }
280 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000281 return LLDB_INVALID_BREAK_ID;
Greg Clayton4e78f602010-11-18 18:52:36 +0000282 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000283 break;
284
285 case eStopReasonWatchpoint:
286 return stop_info_sp->GetValue();
287
288 case eStopReasonSignal:
289 return stop_info_sp->GetValue();
290
291 case eStopReasonException:
292 return stop_info_sp->GetValue();
Greg Clayton4e78f602010-11-18 18:52:36 +0000293 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000294 }
295 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000296 else
297 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000298 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000299 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000300 log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running",
301 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000302 }
Greg Clayton4e78f602010-11-18 18:52:36 +0000303 }
304 return 0;
305}
306
307size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000308SBThread::GetStopDescription (char *dst, size_t dst_len)
309{
Greg Clayton5160ce52013-03-27 23:08:40 +0000310 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000311
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000312 Mutex::Locker api_locker;
313 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
314
Greg Clayton1ac04c32012-02-21 00:09:25 +0000315 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000316 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000317 Process::StopLocker stop_locker;
318 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000319 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000320
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000321 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
322 if (stop_info_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000323 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000324 const char *stop_desc = stop_info_sp->GetDescription();
325 if (stop_desc)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000326 {
Caroline Ticeceb6b132010-10-26 03:11:13 +0000327 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000328 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
329 static_cast<void*>(exe_ctx.GetThreadPtr()),
330 stop_desc);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000331 if (dst)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000332 return ::snprintf (dst, dst_len, "%s", stop_desc);
333 else
334 {
335 // NULL dst passed in, return the length needed to contain the description
336 return ::strlen (stop_desc) + 1; // Include the NULL byte for size
337 }
338 }
339 else
340 {
341 size_t stop_desc_len = 0;
342 switch (stop_info_sp->GetStopReason())
343 {
344 case eStopReasonTrace:
345 case eStopReasonPlanComplete:
346 {
347 static char trace_desc[] = "step";
348 stop_desc = trace_desc;
349 stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
350 }
351 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000352
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000353 case eStopReasonBreakpoint:
354 {
355 static char bp_desc[] = "breakpoint hit";
356 stop_desc = bp_desc;
357 stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
358 }
359 break;
360
361 case eStopReasonWatchpoint:
362 {
363 static char wp_desc[] = "watchpoint hit";
364 stop_desc = wp_desc;
365 stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
366 }
367 break;
368
369 case eStopReasonSignal:
370 {
371 stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
372 if (stop_desc == NULL || stop_desc[0] == '\0')
373 {
374 static char signal_desc[] = "signal";
375 stop_desc = signal_desc;
376 stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
377 }
378 }
379 break;
380
381 case eStopReasonException:
382 {
383 char exc_desc[] = "exception";
384 stop_desc = exc_desc;
385 stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
386 }
387 break;
388
Greg Clayton90ba8112012-12-05 00:16:59 +0000389 case eStopReasonExec:
390 {
391 char exc_desc[] = "exec";
392 stop_desc = exc_desc;
393 stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
394 }
395 break;
396
Andrew Kaylorf85defa2012-12-20 23:08:03 +0000397 case eStopReasonThreadExiting:
398 {
399 char limbo_desc[] = "thread exiting";
400 stop_desc = limbo_desc;
401 stop_desc_len = sizeof(limbo_desc);
402 }
403 break;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000404 default:
405 break;
406 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000407
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000408 if (stop_desc && stop_desc[0])
409 {
410 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000411 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
412 static_cast<void*>(exe_ctx.GetThreadPtr()),
413 stop_desc);
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000414
415 if (dst)
416 return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
417
418 if (stop_desc_len == 0)
419 stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000420
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000421 return stop_desc_len;
422 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000423 }
424 }
425 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000426 else
427 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000428 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +0000429 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000430 log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running",
431 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000432 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433 }
434 if (dst)
435 *dst = 0;
436 return 0;
437}
438
Jim Ingham73ca05a2011-12-17 01:35:57 +0000439SBValue
440SBThread::GetStopReturnValue ()
441{
Greg Clayton5160ce52013-03-27 23:08:40 +0000442 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham73ca05a2011-12-17 01:35:57 +0000443 ValueObjectSP return_valobj_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000444 Mutex::Locker api_locker;
445 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
446
Greg Clayton1ac04c32012-02-21 00:09:25 +0000447 if (exe_ctx.HasThreadScope())
Jim Ingham73ca05a2011-12-17 01:35:57 +0000448 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000449 Process::StopLocker stop_locker;
450 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Jim Ingham73ca05a2011-12-17 01:35:57 +0000451 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000452 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
453 if (stop_info_sp)
454 {
455 return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
456 }
Jim Ingham73ca05a2011-12-17 01:35:57 +0000457 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000458 else
459 {
460 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000461 log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running",
462 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000463 }
Jim Ingham73ca05a2011-12-17 01:35:57 +0000464 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000465
Jim Ingham73ca05a2011-12-17 01:35:57 +0000466 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000467 log->Printf ("SBThread(%p)::GetStopReturnValue () => %s",
468 static_cast<void*>(exe_ctx.GetThreadPtr()),
469 return_valobj_sp.get()
470 ? return_valobj_sp->GetValueAsCString()
471 : "<no return value>");
472
Jim Ingham73ca05a2011-12-17 01:35:57 +0000473 return SBValue (return_valobj_sp);
474}
475
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000476void
477SBThread::SetThread (const ThreadSP& lldb_object_sp)
478{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000479 m_opaque_sp->SetThreadSP (lldb_object_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000480}
481
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000482lldb::tid_t
483SBThread::GetThreadID () const
484{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000485 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000486 if (thread_sp)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000487 return thread_sp->GetID();
488 return LLDB_INVALID_THREAD_ID;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489}
490
491uint32_t
492SBThread::GetIndexID () const
493{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000494 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
Greg Clayton17a6ad02012-01-30 02:53:15 +0000495 if (thread_sp)
496 return thread_sp->GetIndexID();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000497 return LLDB_INVALID_INDEX32;
498}
Greg Clayton1ac04c32012-02-21 00:09:25 +0000499
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000500const char *
501SBThread::GetName () const
502{
Greg Clayton5160ce52013-03-27 23:08:40 +0000503 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000504 const char *name = NULL;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000505 Mutex::Locker api_locker;
506 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
507
Greg Clayton1ac04c32012-02-21 00:09:25 +0000508 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +0000509 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000510 Process::StopLocker stop_locker;
511 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
512 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000513 name = exe_ctx.GetThreadPtr()->GetName();
514 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000515 else
516 {
517 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000518 log->Printf ("SBThread(%p)::GetName() => error: process is running",
519 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000520 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000521 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000522
Caroline Ticeceb6b132010-10-26 03:11:13 +0000523 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000524 log->Printf ("SBThread(%p)::GetName () => %s",
525 static_cast<void*>(exe_ctx.GetThreadPtr()),
526 name ? name : "NULL");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000527
Greg Clayton48381312010-10-30 04:51:46 +0000528 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000529}
530
531const char *
532SBThread::GetQueueName () const
533{
Greg Clayton48381312010-10-30 04:51:46 +0000534 const char *name = NULL;
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000535 Mutex::Locker api_locker;
536 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
537
Greg Clayton5160ce52013-03-27 23:08:40 +0000538 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton1ac04c32012-02-21 00:09:25 +0000539 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +0000540 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000541 Process::StopLocker stop_locker;
542 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
543 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000544 name = exe_ctx.GetThreadPtr()->GetQueueName();
545 }
Greg Claytonc9858e42012-04-06 02:17:47 +0000546 else
547 {
548 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000549 log->Printf ("SBThread(%p)::GetQueueName() => error: process is running",
550 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +0000551 }
Greg Claytonaf67cec2010-12-20 20:49:23 +0000552 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000553
Caroline Ticeceb6b132010-10-26 03:11:13 +0000554 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000555 log->Printf ("SBThread(%p)::GetQueueName () => %s",
556 static_cast<void*>(exe_ctx.GetThreadPtr()),
557 name ? name : "NULL");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000558
Greg Clayton48381312010-10-30 04:51:46 +0000559 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000560}
561
Jason Molenda4fdb5862013-10-21 23:52:54 +0000562lldb::queue_id_t
563SBThread::GetQueueID () const
564{
565 queue_id_t id = LLDB_INVALID_QUEUE_ID;
566 Mutex::Locker api_locker;
567 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
568
569 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
570 if (exe_ctx.HasThreadScope())
571 {
572 Process::StopLocker stop_locker;
573 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
574 {
575 id = exe_ctx.GetThreadPtr()->GetQueueID();
576 }
577 else
578 {
579 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000580 log->Printf ("SBThread(%p)::GetQueueID() => error: process is running",
581 static_cast<void*>(exe_ctx.GetThreadPtr()));
Jason Molenda4fdb5862013-10-21 23:52:54 +0000582 }
583 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000584
Jason Molenda4fdb5862013-10-21 23:52:54 +0000585 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000586 log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64,
587 static_cast<void*>(exe_ctx.GetThreadPtr()), id);
Jason Molenda4fdb5862013-10-21 23:52:54 +0000588
589 return id;
590}
591
Jim Ingham64e7ead2012-05-03 21:19:36 +0000592SBError
593SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
594{
595 SBError sb_error;
596
597 Process *process = exe_ctx.GetProcessPtr();
598 if (!process)
599 {
600 sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
601 return sb_error;
602 }
603
604 Thread *thread = exe_ctx.GetThreadPtr();
605 if (!thread)
606 {
607 sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
608 return sb_error;
609 }
610
611 // User level plans should be Master Plans so they can be interrupted, other plans executed, and
612 // then a "continue" will resume the plan.
613 if (new_plan != NULL)
614 {
615 new_plan->SetIsMasterPlan(true);
616 new_plan->SetOkayToDiscard(false);
617 }
618
619 // Why do we need to set the current thread by ID here???
620 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
621 sb_error.ref() = process->Resume();
622
623 if (sb_error.Success())
624 {
625 // If we are doing synchronous mode, then wait for the
626 // process to stop yet again!
627 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
628 process->WaitForProcessToStop (NULL);
629 }
630
631 return sb_error;
632}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000633
634void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000635SBThread::StepOver (lldb::RunMode stop_other_threads)
636{
Greg Clayton5160ce52013-03-27 23:08:40 +0000637 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000638
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000639 Mutex::Locker api_locker;
640 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
641
Caroline Ticeceb6b132010-10-26 03:11:13 +0000642
Greg Clayton17a6ad02012-01-30 02:53:15 +0000643 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000644 log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')",
645 static_cast<void*>(exe_ctx.GetThreadPtr()),
Greg Clayton17a6ad02012-01-30 02:53:15 +0000646 Thread::RunModeAsCString (stop_other_threads));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000647
Greg Clayton1ac04c32012-02-21 00:09:25 +0000648 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000649 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000650 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham7ba6e992012-05-11 23:47:32 +0000651 bool abort_other_plans = false;
Jason Molendab57e4a12013-11-04 09:33:30 +0000652 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000653
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000654 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000655 if (frame_sp)
656 {
657 if (frame_sp->HasDebugInformation ())
658 {
Jim Ingham4b4b2472014-03-13 02:47:14 +0000659 const LazyBool avoid_no_debug = eLazyBoolCalculate;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000660 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000661 new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000662 sc.line_entry.range,
663 sc,
Jim Ingham4b4b2472014-03-13 02:47:14 +0000664 stop_other_threads,
665 avoid_no_debug);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000666 }
667 else
668 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000669 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000670 abort_other_plans,
671 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000672 }
673 }
674
Jim Ingham64e7ead2012-05-03 21:19:36 +0000675 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000676 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000677 }
678}
679
680void
681SBThread::StepInto (lldb::RunMode stop_other_threads)
682{
Jim Inghamc6276822012-12-12 19:58:40 +0000683 StepInto (NULL, stop_other_threads);
684}
685
686void
687SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
688{
Greg Clayton5160ce52013-03-27 23:08:40 +0000689 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000690
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000691 Mutex::Locker api_locker;
692 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000693
694 if (log)
Jim Inghamc6276822012-12-12 19:58:40 +0000695 log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000696 static_cast<void*>(exe_ctx.GetThreadPtr()),
Jim Inghamc6276822012-12-12 19:58:40 +0000697 target_name? target_name: "<NULL>",
Greg Clayton17a6ad02012-01-30 02:53:15 +0000698 Thread::RunModeAsCString (stop_other_threads));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000699
Greg Clayton1ac04c32012-02-21 00:09:25 +0000700 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000701 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000702 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000703
Greg Clayton1ac04c32012-02-21 00:09:25 +0000704 Thread *thread = exe_ctx.GetThreadPtr();
Jason Molendab57e4a12013-11-04 09:33:30 +0000705 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000706 ThreadPlanSP new_plan_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000707
708 if (frame_sp && frame_sp->HasDebugInformation ())
709 {
Jim Ingham4b4b2472014-03-13 02:47:14 +0000710 const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate;
711 const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000712 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000713 new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
Jim Inghamc6276822012-12-12 19:58:40 +0000714 sc.line_entry.range,
715 sc,
716 target_name,
717 stop_other_threads,
Jim Ingham4b4b2472014-03-13 02:47:14 +0000718 step_in_avoids_code_without_debug_info,
719 step_out_avoids_code_without_debug_info);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000720 }
721 else
722 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000723 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000724 abort_other_plans,
725 stop_other_threads);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000726 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000727
Jim Ingham64e7ead2012-05-03 21:19:36 +0000728 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000729 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000730 }
731}
732
733void
734SBThread::StepOut ()
735{
Greg Clayton5160ce52013-03-27 23:08:40 +0000736 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000737
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000738 Mutex::Locker api_locker;
739 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
740
Caroline Ticeceb6b132010-10-26 03:11:13 +0000741
Greg Clayton17a6ad02012-01-30 02:53:15 +0000742 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000743 log->Printf ("SBThread(%p)::StepOut ()",
744 static_cast<void*>(exe_ctx.GetThreadPtr()));
745
Greg Clayton1ac04c32012-02-21 00:09:25 +0000746 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000747 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000748 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000749 bool stop_other_threads = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000750
Greg Clayton1ac04c32012-02-21 00:09:25 +0000751 Thread *thread = exe_ctx.GetThreadPtr();
752
Jim Ingham4b4b2472014-03-13 02:47:14 +0000753 const LazyBool avoid_no_debug = eLazyBoolCalculate;
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000754 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000755 NULL,
756 false,
757 stop_other_threads,
758 eVoteYes,
759 eVoteNoOpinion,
760 0,
761 avoid_no_debug));
762
Jim Ingham64e7ead2012-05-03 21:19:36 +0000763 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000764 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +0000765 }
766}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000767
Greg Clayton481cef22011-01-21 06:11:58 +0000768void
769SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
770{
Greg Clayton5160ce52013-03-27 23:08:40 +0000771 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000772
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000773 Mutex::Locker api_locker;
774 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
775
Jason Molendab57e4a12013-11-04 09:33:30 +0000776 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Clayton481cef22011-01-21 06:11:58 +0000777 if (log)
778 {
779 SBStream frame_desc_strm;
780 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000781 log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)",
782 static_cast<void*>(exe_ctx.GetThreadPtr()),
783 static_cast<void*>(frame_sp.get()),
784 frame_desc_strm.GetData());
Greg Clayton481cef22011-01-21 06:11:58 +0000785 }
786
Greg Clayton1ac04c32012-02-21 00:09:25 +0000787 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000788 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000789 bool abort_other_plans = false;
Jim Ingham94b09242012-09-14 21:07:14 +0000790 bool stop_other_threads = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +0000791 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000792
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000793 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000794 NULL,
795 false,
796 stop_other_threads,
797 eVoteYes,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000798 eVoteNoOpinion,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000799 frame_sp->GetFrameIndex()));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000800
Jim Ingham64e7ead2012-05-03 21:19:36 +0000801 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000802 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000803 }
804}
805
806void
807SBThread::StepInstruction (bool step_over)
808{
Greg Clayton5160ce52013-03-27 23:08:40 +0000809 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000810
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000811 Mutex::Locker api_locker;
812 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
813
Greg Clayton1ac04c32012-02-21 00:09:25 +0000814
Caroline Ticeceb6b132010-10-26 03:11:13 +0000815
Greg Clayton17a6ad02012-01-30 02:53:15 +0000816 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000817 log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)",
818 static_cast<void*>(exe_ctx.GetThreadPtr()), step_over);
819
Greg Clayton1ac04c32012-02-21 00:09:25 +0000820 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000821 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000822 Thread *thread = exe_ctx.GetThreadPtr();
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000823 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000824
Jim Ingham64e7ead2012-05-03 21:19:36 +0000825 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000826 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000827 }
828}
829
830void
831SBThread::RunToAddress (lldb::addr_t addr)
832{
Greg Clayton5160ce52013-03-27 23:08:40 +0000833 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000834
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000835 Mutex::Locker api_locker;
836 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
837
Caroline Ticeceb6b132010-10-26 03:11:13 +0000838
Greg Clayton17a6ad02012-01-30 02:53:15 +0000839 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000840 log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")",
841 static_cast<void*>(exe_ctx.GetThreadPtr()), addr);
842
Greg Clayton1ac04c32012-02-21 00:09:25 +0000843 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000844 {
Jim Ingham7ba6e992012-05-11 23:47:32 +0000845 bool abort_other_plans = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000846 bool stop_other_threads = true;
847
Greg Claytone72dfb32012-02-24 01:59:29 +0000848 Address target_addr (addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000849
Greg Clayton1ac04c32012-02-21 00:09:25 +0000850 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000851
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000852 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000853
Jim Ingham64e7ead2012-05-03 21:19:36 +0000854 // This returns an error, we should use it!
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000855 ResumeNewPlan (exe_ctx, new_plan_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000856 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000857}
858
Greg Clayton481cef22011-01-21 06:11:58 +0000859SBError
860SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
861 lldb::SBFileSpec &sb_file_spec,
862 uint32_t line)
863{
864 SBError sb_error;
Greg Clayton5160ce52013-03-27 23:08:40 +0000865 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton481cef22011-01-21 06:11:58 +0000866 char path[PATH_MAX];
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000867
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000868 Mutex::Locker api_locker;
869 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
870
Jason Molendab57e4a12013-11-04 09:33:30 +0000871 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000872
Greg Clayton481cef22011-01-21 06:11:58 +0000873 if (log)
874 {
875 SBStream frame_desc_strm;
876 sb_frame.GetDescription (frame_desc_strm);
877 sb_file_spec->GetPath (path, sizeof(path));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000878 log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
879 static_cast<void*>(exe_ctx.GetThreadPtr()),
880 static_cast<void*>(frame_sp.get()),
881 frame_desc_strm.GetData(), path, line);
Greg Clayton481cef22011-01-21 06:11:58 +0000882 }
Greg Clayton17a6ad02012-01-30 02:53:15 +0000883
Greg Clayton1ac04c32012-02-21 00:09:25 +0000884 if (exe_ctx.HasThreadScope())
Greg Clayton481cef22011-01-21 06:11:58 +0000885 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000886 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000887 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton481cef22011-01-21 06:11:58 +0000888
889 if (line == 0)
890 {
891 sb_error.SetErrorString("invalid line argument");
892 return sb_error;
893 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000894
Greg Claytonb9556ac2012-01-30 07:41:31 +0000895 if (!frame_sp)
Greg Clayton481cef22011-01-21 06:11:58 +0000896 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000897 frame_sp = thread->GetSelectedFrame ();
Greg Clayton481cef22011-01-21 06:11:58 +0000898 if (!frame_sp)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000899 frame_sp = thread->GetStackFrameAtIndex (0);
Greg Clayton481cef22011-01-21 06:11:58 +0000900 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000901
Greg Clayton481cef22011-01-21 06:11:58 +0000902 SymbolContext frame_sc;
903 if (!frame_sp)
904 {
905 sb_error.SetErrorString("no valid frames in thread to step");
906 return sb_error;
907 }
908
909 // If we have a frame, get its line
910 frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit |
911 eSymbolContextFunction |
912 eSymbolContextLineEntry |
913 eSymbolContextSymbol );
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000914
Greg Clayton481cef22011-01-21 06:11:58 +0000915 if (frame_sc.comp_unit == NULL)
916 {
917 sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
918 return sb_error;
919 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000920
Greg Clayton481cef22011-01-21 06:11:58 +0000921 FileSpec step_file_spec;
922 if (sb_file_spec.IsValid())
923 {
924 // The file spec passed in was valid, so use it
925 step_file_spec = sb_file_spec.ref();
926 }
927 else
928 {
929 if (frame_sc.line_entry.IsValid())
930 step_file_spec = frame_sc.line_entry.file;
931 else
932 {
933 sb_error.SetErrorString("invalid file argument or no file for frame");
934 return sb_error;
935 }
936 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000937
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000938 // Grab the current function, then we will make sure the "until" address is
939 // within the function. We discard addresses that are out of the current
940 // function, and then if there are no addresses remaining, give an appropriate
941 // error message.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000942
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000943 bool all_in_function = true;
944 AddressRange fun_range = frame_sc.function->GetAddressRange();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000945
Greg Clayton481cef22011-01-21 06:11:58 +0000946 std::vector<addr_t> step_over_until_addrs;
Jim Ingham7ba6e992012-05-11 23:47:32 +0000947 const bool abort_other_plans = false;
Jim Inghamc02e3342012-09-14 18:57:14 +0000948 const bool stop_other_threads = false;
Greg Clayton481cef22011-01-21 06:11:58 +0000949 const bool check_inlines = true;
950 const bool exact = false;
951
952 SymbolContextList sc_list;
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000953 const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
954 line,
955 check_inlines,
956 exact,
957 eSymbolContextLineEntry,
958 sc_list);
Greg Clayton481cef22011-01-21 06:11:58 +0000959 if (num_matches > 0)
960 {
961 SymbolContext sc;
962 for (uint32_t i=0; i<num_matches; ++i)
963 {
964 if (sc_list.GetContextAtIndex(i, sc))
965 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000966 addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
Greg Clayton481cef22011-01-21 06:11:58 +0000967 if (step_addr != LLDB_INVALID_ADDRESS)
968 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000969 if (fun_range.ContainsLoadAddress(step_addr, target))
970 step_over_until_addrs.push_back(step_addr);
971 else
972 all_in_function = false;
Greg Clayton481cef22011-01-21 06:11:58 +0000973 }
974 }
975 }
976 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000977
Greg Clayton481cef22011-01-21 06:11:58 +0000978 if (step_over_until_addrs.empty())
979 {
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000980 if (all_in_function)
981 {
982 step_file_spec.GetPath (path, sizeof(path));
Jason Molendafd54b362011-09-20 21:44:10 +0000983 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
Jim Ingham9b70ddb2011-05-08 00:56:32 +0000984 }
985 else
Greg Clayton86edbf42011-10-26 00:56:27 +0000986 sb_error.SetErrorString ("step until target not in current function");
Greg Clayton481cef22011-01-21 06:11:58 +0000987 }
988 else
989 {
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000990 ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
Jim Ingham64e7ead2012-05-03 21:19:36 +0000991 &step_over_until_addrs[0],
992 step_over_until_addrs.size(),
993 stop_other_threads,
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000994 frame_sp->GetFrameIndex()));
Greg Clayton481cef22011-01-21 06:11:58 +0000995
Jim Ingham4d56e9c2013-07-18 21:48:26 +0000996 sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
Greg Clayton481cef22011-01-21 06:11:58 +0000997 }
998 }
999 else
1000 {
1001 sb_error.SetErrorString("this SBThread object is invalid");
1002 }
1003 return sb_error;
1004}
1005
Jim Ingham44137582012-09-12 00:40:39 +00001006SBError
Richard Mittonf86248d2013-09-12 02:20:34 +00001007SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line)
1008{
1009 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1010 SBError sb_error;
1011
1012 Mutex::Locker api_locker;
1013 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1014
1015 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001016 log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)",
1017 static_cast<void*>(exe_ctx.GetThreadPtr()),
1018 file_spec->GetPath().c_str(), line);
Richard Mittonf86248d2013-09-12 02:20:34 +00001019
1020 if (!exe_ctx.HasThreadScope())
1021 {
1022 sb_error.SetErrorString("this SBThread object is invalid");
1023 return sb_error;
1024 }
1025
1026 Thread *thread = exe_ctx.GetThreadPtr();
1027
1028 Error err = thread->JumpToLine (file_spec.get(), line, true);
1029 sb_error.SetError (err);
1030 return sb_error;
1031}
1032
1033SBError
Jim Inghamcb640dd2012-09-14 02:14:15 +00001034SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
Jim Ingham44137582012-09-12 00:40:39 +00001035{
1036 SBError sb_error;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001037
Greg Clayton5160ce52013-03-27 23:08:40 +00001038 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham44137582012-09-12 00:40:39 +00001039
1040 Mutex::Locker api_locker;
1041 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1042
1043
1044 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001045 log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)",
1046 static_cast<void*>(exe_ctx.GetThreadPtr()),
1047 frame.GetFrameID());
1048
Jim Ingham44137582012-09-12 00:40:39 +00001049 if (exe_ctx.HasThreadScope())
1050 {
1051 Thread *thread = exe_ctx.GetThreadPtr();
Jim Inghamcb640dd2012-09-14 02:14:15 +00001052 sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
Jim Ingham44137582012-09-12 00:40:39 +00001053 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001054
Jim Ingham44137582012-09-12 00:40:39 +00001055 return sb_error;
1056}
1057
Greg Clayton481cef22011-01-21 06:11:58 +00001058
Greg Clayton722a0cd2011-01-12 02:25:42 +00001059bool
1060SBThread::Suspend()
1061{
Greg Clayton5160ce52013-03-27 23:08:40 +00001062 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001063 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +00001064 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +00001065 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +00001066 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001067 Process::StopLocker stop_locker;
1068 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1069 {
1070 exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
1071 result = true;
1072 }
1073 else
1074 {
1075 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001076 log->Printf ("SBThread(%p)::Suspend() => error: process is running",
1077 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001078 }
Greg Clayton722a0cd2011-01-12 02:25:42 +00001079 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001080 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001081 log->Printf ("SBThread(%p)::Suspend() => %i",
1082 static_cast<void*>(exe_ctx.GetThreadPtr()), result);
Greg Claytonc9858e42012-04-06 02:17:47 +00001083 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001084}
1085
1086bool
1087SBThread::Resume ()
1088{
Greg Clayton5160ce52013-03-27 23:08:40 +00001089 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001090 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Claytonc9858e42012-04-06 02:17:47 +00001091 bool result = false;
Greg Clayton1ac04c32012-02-21 00:09:25 +00001092 if (exe_ctx.HasThreadScope())
Greg Clayton722a0cd2011-01-12 02:25:42 +00001093 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001094 Process::StopLocker stop_locker;
1095 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1096 {
Jim Ingham6c9ed912014-04-03 01:26:14 +00001097 const bool override_suspend = true;
1098 exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend);
Greg Claytonc9858e42012-04-06 02:17:47 +00001099 result = true;
1100 }
1101 else
1102 {
1103 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001104 log->Printf ("SBThread(%p)::Resume() => error: process is running",
1105 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001106 }
Greg Clayton722a0cd2011-01-12 02:25:42 +00001107 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001108 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001109 log->Printf ("SBThread(%p)::Resume() => %i",
1110 static_cast<void*>(exe_ctx.GetThreadPtr()), result);
Greg Claytonc9858e42012-04-06 02:17:47 +00001111 return result;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001112}
1113
1114bool
1115SBThread::IsSuspended()
1116{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001117 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001118 if (exe_ctx.HasThreadScope())
1119 return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
Greg Clayton722a0cd2011-01-12 02:25:42 +00001120 return false;
1121}
1122
Andrew Kaylora75418d2013-04-15 23:33:53 +00001123bool
1124SBThread::IsStopped()
1125{
1126 ExecutionContext exe_ctx (m_opaque_sp.get());
1127 if (exe_ctx.HasThreadScope())
1128 return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1129 return false;
1130}
1131
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001132SBProcess
1133SBThread::GetProcess ()
1134{
Greg Claytonb9556ac2012-01-30 07:41:31 +00001135 SBProcess sb_process;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001136 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001137 if (exe_ctx.HasThreadScope())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001138 {
1139 // Have to go up to the target so we can get a shared pointer to our process...
Greg Clayton1ac04c32012-02-21 00:09:25 +00001140 sb_process.SetSP (exe_ctx.GetProcessSP());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001141 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001142
Greg Clayton5160ce52013-03-27 23:08:40 +00001143 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001144 if (log)
1145 {
Greg Clayton481cef22011-01-21 06:11:58 +00001146 SBStream frame_desc_strm;
Greg Claytonb9556ac2012-01-30 07:41:31 +00001147 sb_process.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001148 log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s",
1149 static_cast<void*>(exe_ctx.GetThreadPtr()),
1150 static_cast<void*>(sb_process.GetSP().get()),
1151 frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001152 }
1153
Greg Claytonb9556ac2012-01-30 07:41:31 +00001154 return sb_process;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001155}
1156
1157uint32_t
1158SBThread::GetNumFrames ()
1159{
Greg Clayton5160ce52013-03-27 23:08:40 +00001160 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001161
Caroline Ticeceb6b132010-10-26 03:11:13 +00001162 uint32_t num_frames = 0;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001163 Mutex::Locker api_locker;
1164 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1165
Greg Clayton1ac04c32012-02-21 00:09:25 +00001166 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001167 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001168 Process::StopLocker stop_locker;
1169 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1170 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001171 num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1172 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001173 else
1174 {
1175 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001176 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running",
1177 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001178 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001179 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001180
1181 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001182 log->Printf ("SBThread(%p)::GetNumFrames () => %u",
1183 static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001184
1185 return num_frames;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001186}
1187
1188SBFrame
1189SBThread::GetFrameAtIndex (uint32_t idx)
1190{
Greg Clayton5160ce52013-03-27 23:08:40 +00001191 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001192
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001193 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001194 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001195 Mutex::Locker api_locker;
1196 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1197
Greg Clayton1ac04c32012-02-21 00:09:25 +00001198 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001199 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001200 Process::StopLocker stop_locker;
1201 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1202 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001203 frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1204 sb_frame.SetFrameSP (frame_sp);
1205 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001206 else
1207 {
1208 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001209 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running",
1210 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001211 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001212 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001213
1214 if (log)
1215 {
Greg Clayton481cef22011-01-21 06:11:58 +00001216 SBStream frame_desc_strm;
1217 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001218 log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
1219 static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1220 static_cast<void*>(frame_sp.get()),
1221 frame_desc_strm.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001222 }
1223
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001224 return sb_frame;
1225}
1226
Greg Claytonf028a1f2010-12-17 02:26:24 +00001227lldb::SBFrame
1228SBThread::GetSelectedFrame ()
1229{
Greg Clayton5160ce52013-03-27 23:08:40 +00001230 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001231
1232 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001233 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001234 Mutex::Locker api_locker;
1235 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1236
Greg Clayton1ac04c32012-02-21 00:09:25 +00001237 if (exe_ctx.HasThreadScope())
Greg Claytonaf67cec2010-12-20 20:49:23 +00001238 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001239 Process::StopLocker stop_locker;
1240 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1241 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001242 frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1243 sb_frame.SetFrameSP (frame_sp);
1244 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001245 else
1246 {
1247 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001248 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running",
1249 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001250 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001251 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001252
1253 if (log)
1254 {
Greg Clayton481cef22011-01-21 06:11:58 +00001255 SBStream frame_desc_strm;
1256 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001257 log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
1258 static_cast<void*>(exe_ctx.GetThreadPtr()),
1259 static_cast<void*>(frame_sp.get()),
1260 frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001261 }
1262
1263 return sb_frame;
1264}
1265
1266lldb::SBFrame
1267SBThread::SetSelectedFrame (uint32_t idx)
1268{
Greg Clayton5160ce52013-03-27 23:08:40 +00001269 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonf028a1f2010-12-17 02:26:24 +00001270
1271 SBFrame sb_frame;
Jason Molendab57e4a12013-11-04 09:33:30 +00001272 StackFrameSP frame_sp;
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001273 Mutex::Locker api_locker;
1274 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1275
Greg Clayton1ac04c32012-02-21 00:09:25 +00001276 if (exe_ctx.HasThreadScope())
Greg Claytonf028a1f2010-12-17 02:26:24 +00001277 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001278 Process::StopLocker stop_locker;
1279 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
Greg Claytonf028a1f2010-12-17 02:26:24 +00001280 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001281 Thread *thread = exe_ctx.GetThreadPtr();
1282 frame_sp = thread->GetStackFrameAtIndex (idx);
1283 if (frame_sp)
1284 {
1285 thread->SetSelectedFrame (frame_sp.get());
1286 sb_frame.SetFrameSP (frame_sp);
1287 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001288 }
Greg Claytonc9858e42012-04-06 02:17:47 +00001289 else
1290 {
1291 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001292 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running",
1293 static_cast<void*>(exe_ctx.GetThreadPtr()));
Greg Claytonc9858e42012-04-06 02:17:47 +00001294 }
Greg Claytonf028a1f2010-12-17 02:26:24 +00001295 }
1296
1297 if (log)
1298 {
Greg Clayton481cef22011-01-21 06:11:58 +00001299 SBStream frame_desc_strm;
1300 sb_frame.GetDescription (frame_desc_strm);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001301 log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
1302 static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1303 static_cast<void*>(frame_sp.get()),
1304 frame_desc_strm.GetData());
Greg Claytonf028a1f2010-12-17 02:26:24 +00001305 }
1306 return sb_frame;
1307}
1308
Jim Ingham4f465cf2012-10-10 18:32:14 +00001309bool
1310SBThread::EventIsThreadEvent (const SBEvent &event)
1311{
1312 return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
1313}
1314
1315SBFrame
1316SBThread::GetStackFrameFromEvent (const SBEvent &event)
1317{
1318 return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
1319
1320}
1321
1322SBThread
1323SBThread::GetThreadFromEvent (const SBEvent &event)
1324{
1325 return Thread::ThreadEventData::GetThreadFromEvent (event.get());
1326}
Greg Claytonf028a1f2010-12-17 02:26:24 +00001327
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001328bool
1329SBThread::operator == (const SBThread &rhs) const
1330{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001331 return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001332}
1333
1334bool
1335SBThread::operator != (const SBThread &rhs) const
1336{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001337 return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001338}
Caroline Ticedde9cff2010-09-20 05:20:02 +00001339
1340bool
Jim Ingham4f465cf2012-10-10 18:32:14 +00001341SBThread::GetStatus (SBStream &status) const
1342{
1343 Stream &strm = status.ref();
1344
1345 ExecutionContext exe_ctx (m_opaque_sp.get());
1346 if (exe_ctx.HasThreadScope())
1347 {
1348 exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
1349 }
1350 else
1351 strm.PutCString ("No status");
1352
1353 return true;
1354}
1355
1356bool
Caroline Ticeceb6b132010-10-26 03:11:13 +00001357SBThread::GetDescription (SBStream &description) const
1358{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001359 Stream &strm = description.ref();
1360
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001361 ExecutionContext exe_ctx (m_opaque_sp.get());
Greg Clayton1ac04c32012-02-21 00:09:25 +00001362 if (exe_ctx.HasThreadScope())
Caroline Ticeceb6b132010-10-26 03:11:13 +00001363 {
Daniel Malead01b2952012-11-29 21:49:15 +00001364 strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001365 }
1366 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001367 strm.PutCString ("No value");
Caroline Ticeceb6b132010-10-26 03:11:13 +00001368
1369 return true;
1370}
Jason Molenda5dd49162013-11-06 00:04:44 +00001371
1372SBThread
Jason Molenda008c45f2013-11-12 23:33:32 +00001373SBThread::GetExtendedBacktraceThread (const char *type)
Jason Molenda5dd49162013-11-06 00:04:44 +00001374{
1375 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1376 Mutex::Locker api_locker;
1377 ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1378 SBThread sb_origin_thread;
1379
1380 if (exe_ctx.HasThreadScope())
1381 {
1382 Process::StopLocker stop_locker;
1383 if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1384 {
Jason Molenda7a2f7902013-11-11 05:19:34 +00001385 ThreadSP real_thread(exe_ctx.GetThreadSP());
Jason Molenda5dd49162013-11-06 00:04:44 +00001386 if (real_thread)
1387 {
1388 ConstString type_const (type);
Jason Molenda7a2f7902013-11-11 05:19:34 +00001389 Process *process = exe_ctx.GetProcessPtr();
1390 if (process)
Jason Molenda5dd49162013-11-06 00:04:44 +00001391 {
Jason Molenda7a2f7902013-11-11 05:19:34 +00001392 SystemRuntime *runtime = process->GetSystemRuntime();
1393 if (runtime)
1394 {
Jason Molenda008c45f2013-11-12 23:33:32 +00001395 ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const));
Jason Molendaa6e91302013-11-19 05:44:41 +00001396 if (new_thread_sp)
1397 {
1398 // Save this in the Process' ExtendedThreadList so a strong pointer retains the
1399 // object.
1400 process->GetExtendedThreadList().AddThread (new_thread_sp);
1401 sb_origin_thread.SetThread (new_thread_sp);
1402 if (log)
1403 {
1404 const char *queue_name = new_thread_sp->GetQueueName();
1405 if (queue_name == NULL)
1406 queue_name = "";
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001407 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread created (%p) with queue_id 0x%" PRIx64 " queue name '%s'",
1408 static_cast<void*>(exe_ctx.GetThreadPtr()),
1409 static_cast<void*>(new_thread_sp.get()),
1410 new_thread_sp->GetQueueID(),
1411 queue_name);
Jason Molendaa6e91302013-11-19 05:44:41 +00001412 }
1413 }
Jason Molenda7a2f7902013-11-11 05:19:34 +00001414 }
Jason Molenda5dd49162013-11-06 00:04:44 +00001415 }
1416 }
1417 }
1418 else
1419 {
1420 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001421 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running",
1422 static_cast<void*>(exe_ctx.GetThreadPtr()));
Jason Molenda5dd49162013-11-06 00:04:44 +00001423 }
1424 }
1425
Jason Molendaac605f42014-03-08 01:34:55 +00001426 if (log && sb_origin_thread.IsValid() == false)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001427 log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread",
1428 static_cast<void*>(exe_ctx.GetThreadPtr()));
Jason Molenda5dd49162013-11-06 00:04:44 +00001429 return sb_origin_thread;
1430}
Jason Molenda8ee9cb52013-11-16 01:24:22 +00001431
1432uint32_t
1433SBThread::GetExtendedBacktraceOriginatingIndexID ()
1434{
1435 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1436 if (thread_sp)
1437 return thread_sp->GetExtendedBacktraceOriginatingIndexID();
1438 return LLDB_INVALID_INDEX32;
1439}
Jason Molendab4892cd2014-05-13 22:02:48 +00001440
1441bool
1442SBThread::SafeToCallFunctions ()
1443{
1444 ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1445 if (thread_sp)
1446 return thread_sp->SafeToCallFunctions();
1447 return true;
1448}