blob: 806f93579eaa6d7ffde711f90a19fe58168d1c25 [file] [log] [blame]
Chris Lattner24943d22010-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
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/API/SBSymbolContext.h"
13#include "lldb/API/SBFileSpec.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000014#include "lldb/API/SBStream.h"
Greg Clayton640dc6b2010-11-18 18:52:36 +000015#include "lldb/Breakpoint/BreakpointLocation.h"
Greg Clayton63094e02010-06-23 01:19:29 +000016#include "lldb/Core/Debugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017#include "lldb/Core/Stream.h"
18#include "lldb/Core/StreamFile.h"
Greg Clayton63094e02010-06-23 01:19:29 +000019#include "lldb/Interpreter/CommandInterpreter.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Target/Thread.h"
21#include "lldb/Target/Process.h"
22#include "lldb/Symbol/SymbolContext.h"
23#include "lldb/Symbol/CompileUnit.h"
Greg Clayton643ee732010-08-04 01:40:35 +000024#include "lldb/Target/StopInfo.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Target/Target.h"
26#include "lldb/Target/ThreadPlan.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027#include "lldb/Target/ThreadPlanStepInstruction.h"
28#include "lldb/Target/ThreadPlanStepOut.h"
29#include "lldb/Target/ThreadPlanStepRange.h"
30#include "lldb/Target/ThreadPlanStepInRange.h"
31
32
Eli Friedman7a62c8b2010-06-09 07:44:37 +000033#include "lldb/API/SBAddress.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000034#include "lldb/API/SBDebugger.h"
Jim Ingham1586d972011-12-17 01:35:57 +000035#include "lldb/API/SBFrame.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000036#include "lldb/API/SBProcess.h"
Jim Ingham1586d972011-12-17 01:35:57 +000037#include "lldb/API/SBValue.h"
Chris Lattner24943d22010-06-08 16:52:24 +000038
39using namespace lldb;
40using namespace lldb_private;
41
Greg Clayton49ce6822010-10-31 03:01:06 +000042//----------------------------------------------------------------------
43// Constructors
44//----------------------------------------------------------------------
Chris Lattner24943d22010-06-08 16:52:24 +000045SBThread::SBThread () :
Greg Clayton90c52142012-01-30 02:53:15 +000046 m_opaque_wp ()
Chris Lattner24943d22010-06-08 16:52:24 +000047{
48}
49
Chris Lattner24943d22010-06-08 16:52:24 +000050SBThread::SBThread (const ThreadSP& lldb_object_sp) :
Greg Clayton90c52142012-01-30 02:53:15 +000051 m_opaque_wp (lldb_object_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000052{
53}
54
Greg Clayton1b284412010-10-30 18:26:59 +000055SBThread::SBThread (const SBThread &rhs) :
Greg Clayton90c52142012-01-30 02:53:15 +000056 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner24943d22010-06-08 16:52:24 +000057{
Chris Lattner24943d22010-06-08 16:52:24 +000058}
59
60//----------------------------------------------------------------------
Greg Clayton49ce6822010-10-31 03:01:06 +000061// Assignment operator
62//----------------------------------------------------------------------
63
64const lldb::SBThread &
65SBThread::operator = (const SBThread &rhs)
66{
67 if (this != &rhs)
Greg Clayton90c52142012-01-30 02:53:15 +000068 m_opaque_wp = rhs.m_opaque_wp;
Greg Clayton49ce6822010-10-31 03:01:06 +000069 return *this;
70}
71
72//----------------------------------------------------------------------
Chris Lattner24943d22010-06-08 16:52:24 +000073// Destructor
74//----------------------------------------------------------------------
75SBThread::~SBThread()
76{
77}
78
79bool
80SBThread::IsValid() const
81{
Greg Clayton90c52142012-01-30 02:53:15 +000082 return !m_opaque_wp.expired();
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
Greg Clayton43490d12010-07-30 20:12:55 +000085void
86SBThread::Clear ()
87{
Greg Clayton90c52142012-01-30 02:53:15 +000088 m_opaque_wp.reset();
Greg Clayton43490d12010-07-30 20:12:55 +000089}
90
91
Chris Lattner24943d22010-06-08 16:52:24 +000092StopReason
93SBThread::GetStopReason()
94{
Greg Claytone005f2c2010-11-06 01:53:30 +000095 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000096
Caroline Tice7826c882010-10-26 03:11:13 +000097 StopReason reason = eStopReasonInvalid;
Greg Claytonf4124de2012-02-21 00:09:25 +000098 ExecutionContext exe_ctx (m_opaque_wp);
99 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000100 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000101 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
102 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
Jim Ingham6297a3a2010-10-20 00:39:53 +0000103 if (stop_info_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000104 reason = stop_info_sp->GetStopReason();
Chris Lattner24943d22010-06-08 16:52:24 +0000105 }
Caroline Tice7826c882010-10-26 03:11:13 +0000106
107 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000108 log->Printf ("SBThread(%p)::GetStopReason () => %s", exe_ctx.GetThreadPtr(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000109 Thread::StopReasonAsCString (reason));
Caroline Tice7826c882010-10-26 03:11:13 +0000110
111 return reason;
Chris Lattner24943d22010-06-08 16:52:24 +0000112}
113
114size_t
Greg Clayton640dc6b2010-11-18 18:52:36 +0000115SBThread::GetStopReasonDataCount ()
116{
Greg Claytonf4124de2012-02-21 00:09:25 +0000117 ExecutionContext exe_ctx (m_opaque_wp);
118 if (exe_ctx.HasThreadScope())
Greg Clayton640dc6b2010-11-18 18:52:36 +0000119 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000120 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
121 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
Greg Clayton640dc6b2010-11-18 18:52:36 +0000122 if (stop_info_sp)
123 {
124 StopReason reason = stop_info_sp->GetStopReason();
125 switch (reason)
126 {
127 case eStopReasonInvalid:
128 case eStopReasonNone:
129 case eStopReasonTrace:
130 case eStopReasonPlanComplete:
131 // There is no data for these stop reasons.
132 return 0;
133
134 case eStopReasonBreakpoint:
135 {
136 break_id_t site_id = stop_info_sp->GetValue();
Greg Claytonf4124de2012-02-21 00:09:25 +0000137 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
Greg Clayton640dc6b2010-11-18 18:52:36 +0000138 if (bp_site_sp)
139 return bp_site_sp->GetNumberOfOwners () * 2;
140 else
141 return 0; // Breakpoint must have cleared itself...
142 }
143 break;
144
145 case eStopReasonWatchpoint:
Johnny Chenbcbefa82011-12-17 02:07:52 +0000146 return 1;
Greg Clayton640dc6b2010-11-18 18:52:36 +0000147
148 case eStopReasonSignal:
149 return 1;
150
151 case eStopReasonException:
152 return 1;
153 }
154 }
155 }
156 return 0;
157}
158
159uint64_t
160SBThread::GetStopReasonDataAtIndex (uint32_t idx)
161{
Greg Claytonf4124de2012-02-21 00:09:25 +0000162 ExecutionContext exe_ctx (m_opaque_wp);
163 if (exe_ctx.HasThreadScope())
Greg Clayton640dc6b2010-11-18 18:52:36 +0000164 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000165 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
166 Thread *thread = exe_ctx.GetThreadPtr();
167 StopInfoSP stop_info_sp = thread->GetStopInfo ();
Greg Clayton640dc6b2010-11-18 18:52:36 +0000168 if (stop_info_sp)
169 {
170 StopReason reason = stop_info_sp->GetStopReason();
171 switch (reason)
172 {
173 case eStopReasonInvalid:
174 case eStopReasonNone:
175 case eStopReasonTrace:
176 case eStopReasonPlanComplete:
177 // There is no data for these stop reasons.
178 return 0;
179
180 case eStopReasonBreakpoint:
181 {
182 break_id_t site_id = stop_info_sp->GetValue();
Greg Claytonf4124de2012-02-21 00:09:25 +0000183 lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
Greg Clayton640dc6b2010-11-18 18:52:36 +0000184 if (bp_site_sp)
185 {
186 uint32_t bp_index = idx / 2;
187 BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
188 if (bp_loc_sp)
189 {
190 if (bp_index & 1)
191 {
192 // Odd idx, return the breakpoint location ID
193 return bp_loc_sp->GetID();
194 }
195 else
196 {
197 // Even idx, return the breakpoint ID
198 return bp_loc_sp->GetBreakpoint().GetID();
199 }
200 }
201 }
202 return LLDB_INVALID_BREAK_ID;
203 }
204 break;
205
206 case eStopReasonWatchpoint:
Johnny Chenbcbefa82011-12-17 02:07:52 +0000207 return stop_info_sp->GetValue();
Greg Clayton640dc6b2010-11-18 18:52:36 +0000208
209 case eStopReasonSignal:
210 return stop_info_sp->GetValue();
211
212 case eStopReasonException:
213 return stop_info_sp->GetValue();
214 }
215 }
216 }
217 return 0;
218}
219
220size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000221SBThread::GetStopDescription (char *dst, size_t dst_len)
222{
Greg Claytone005f2c2010-11-06 01:53:30 +0000223 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000224
Greg Claytonf4124de2012-02-21 00:09:25 +0000225 ExecutionContext exe_ctx (m_opaque_wp);
226 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000227 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000228 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
229 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
Jim Ingham6297a3a2010-10-20 00:39:53 +0000230 if (stop_info_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000231 {
Jim Ingham6297a3a2010-10-20 00:39:53 +0000232 const char *stop_desc = stop_info_sp->GetDescription();
Chris Lattner24943d22010-06-08 16:52:24 +0000233 if (stop_desc)
234 {
Caroline Tice7826c882010-10-26 03:11:13 +0000235 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000236 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
Greg Claytonf4124de2012-02-21 00:09:25 +0000237 exe_ctx.GetThreadPtr(), stop_desc);
Chris Lattner24943d22010-06-08 16:52:24 +0000238 if (dst)
239 return ::snprintf (dst, dst_len, "%s", stop_desc);
240 else
241 {
242 // NULL dst passed in, return the length needed to contain the description
243 return ::strlen (stop_desc) + 1; // Include the NULL byte for size
244 }
245 }
246 else
247 {
Chris Lattner24943d22010-06-08 16:52:24 +0000248 size_t stop_desc_len = 0;
Jim Ingham6297a3a2010-10-20 00:39:53 +0000249 switch (stop_info_sp->GetStopReason())
Chris Lattner24943d22010-06-08 16:52:24 +0000250 {
251 case eStopReasonTrace:
252 case eStopReasonPlanComplete:
253 {
254 static char trace_desc[] = "step";
255 stop_desc = trace_desc;
256 stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
257 }
258 break;
259
260 case eStopReasonBreakpoint:
261 {
262 static char bp_desc[] = "breakpoint hit";
263 stop_desc = bp_desc;
264 stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
265 }
266 break;
267
268 case eStopReasonWatchpoint:
269 {
270 static char wp_desc[] = "watchpoint hit";
271 stop_desc = wp_desc;
272 stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
273 }
274 break;
275
276 case eStopReasonSignal:
277 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000278 stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
Chris Lattner24943d22010-06-08 16:52:24 +0000279 if (stop_desc == NULL || stop_desc[0] == '\0')
280 {
281 static char signal_desc[] = "signal";
282 stop_desc = signal_desc;
283 stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
284 }
285 }
286 break;
287
288 case eStopReasonException:
289 {
290 char exc_desc[] = "exception";
291 stop_desc = exc_desc;
292 stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
293 }
Greg Clayton54e7afa2010-07-09 20:39:50 +0000294 break;
295
296 default:
297 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000298 }
299
300 if (stop_desc && stop_desc[0])
301 {
Caroline Tice7826c882010-10-26 03:11:13 +0000302 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000303 log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
Greg Claytonf4124de2012-02-21 00:09:25 +0000304 exe_ctx.GetThreadPtr(), stop_desc);
Caroline Tice7826c882010-10-26 03:11:13 +0000305
Chris Lattner24943d22010-06-08 16:52:24 +0000306 if (dst)
307 return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
308
309 if (stop_desc_len == 0)
310 stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
311
312 return stop_desc_len;
313 }
314 }
315 }
316 }
317 if (dst)
318 *dst = 0;
319 return 0;
320}
321
Jim Ingham1586d972011-12-17 01:35:57 +0000322SBValue
323SBThread::GetStopReturnValue ()
324{
325 ValueObjectSP return_valobj_sp;
Greg Claytonf4124de2012-02-21 00:09:25 +0000326 ExecutionContext exe_ctx (m_opaque_wp);
327 if (exe_ctx.HasThreadScope())
Jim Ingham1586d972011-12-17 01:35:57 +0000328 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000329 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
330 StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
Jim Ingham1586d972011-12-17 01:35:57 +0000331 if (stop_info_sp)
332 {
333 return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
334 }
335 }
336
337 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
338 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000339 log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", exe_ctx.GetThreadPtr(),
Jim Ingham1586d972011-12-17 01:35:57 +0000340 return_valobj_sp.get()
341 ? return_valobj_sp->GetValueAsCString()
342 : "<no return value>");
343
344 return SBValue (return_valobj_sp);
345}
346
Chris Lattner24943d22010-06-08 16:52:24 +0000347void
348SBThread::SetThread (const ThreadSP& lldb_object_sp)
349{
Greg Clayton90c52142012-01-30 02:53:15 +0000350 m_opaque_wp = lldb_object_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000351}
352
353
354lldb::tid_t
355SBThread::GetThreadID () const
356{
Greg Clayton90c52142012-01-30 02:53:15 +0000357 ThreadSP thread_sp(m_opaque_wp.lock());
358 if (thread_sp)
Greg Claytonf4124de2012-02-21 00:09:25 +0000359 return thread_sp->GetID();
360 return LLDB_INVALID_THREAD_ID;
Chris Lattner24943d22010-06-08 16:52:24 +0000361}
362
363uint32_t
364SBThread::GetIndexID () const
365{
Greg Clayton90c52142012-01-30 02:53:15 +0000366 ThreadSP thread_sp(m_opaque_wp.lock());
367 if (thread_sp)
368 return thread_sp->GetIndexID();
Chris Lattner24943d22010-06-08 16:52:24 +0000369 return LLDB_INVALID_INDEX32;
370}
Greg Claytonf4124de2012-02-21 00:09:25 +0000371
Chris Lattner24943d22010-06-08 16:52:24 +0000372const char *
373SBThread::GetName () const
374{
Greg Claytona66ba462010-10-30 04:51:46 +0000375 const char *name = NULL;
Greg Claytonf4124de2012-02-21 00:09:25 +0000376 ExecutionContext exe_ctx (m_opaque_wp);
377 if (exe_ctx.HasThreadScope())
Greg Claytonbdcda462010-12-20 20:49:23 +0000378 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000379 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
380 name = exe_ctx.GetThreadPtr()->GetName();
Greg Claytonbdcda462010-12-20 20:49:23 +0000381 }
Greg Claytona66ba462010-10-30 04:51:46 +0000382
Greg Claytone005f2c2010-11-06 01:53:30 +0000383 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000384 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000385 log->Printf ("SBThread(%p)::GetName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
Caroline Tice7826c882010-10-26 03:11:13 +0000386
Greg Claytona66ba462010-10-30 04:51:46 +0000387 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000388}
389
390const char *
391SBThread::GetQueueName () const
392{
Greg Claytona66ba462010-10-30 04:51:46 +0000393 const char *name = NULL;
Greg Claytonf4124de2012-02-21 00:09:25 +0000394 ExecutionContext exe_ctx (m_opaque_wp);
395 if (exe_ctx.HasThreadScope())
Greg Claytonbdcda462010-12-20 20:49:23 +0000396 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000397 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
398 name = exe_ctx.GetThreadPtr()->GetQueueName();
Greg Claytonbdcda462010-12-20 20:49:23 +0000399 }
Greg Claytona66ba462010-10-30 04:51:46 +0000400
Greg Claytone005f2c2010-11-06 01:53:30 +0000401 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000402 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000403 log->Printf ("SBThread(%p)::GetQueueName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
Caroline Tice7826c882010-10-26 03:11:13 +0000404
Greg Claytona66ba462010-10-30 04:51:46 +0000405 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000406}
407
408
409void
Chris Lattner24943d22010-06-08 16:52:24 +0000410SBThread::StepOver (lldb::RunMode stop_other_threads)
411{
Greg Claytone005f2c2010-11-06 01:53:30 +0000412 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000413
Greg Claytonf4124de2012-02-21 00:09:25 +0000414 ExecutionContext exe_ctx (m_opaque_wp);
Caroline Tice7826c882010-10-26 03:11:13 +0000415
Greg Clayton90c52142012-01-30 02:53:15 +0000416 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000417 log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", exe_ctx.GetThreadPtr(),
Greg Clayton90c52142012-01-30 02:53:15 +0000418 Thread::RunModeAsCString (stop_other_threads));
419
Greg Claytonf4124de2012-02-21 00:09:25 +0000420 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000421 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000422 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
423 Thread *thread = exe_ctx.GetThreadPtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000424 bool abort_other_plans = true;
Greg Claytonf4124de2012-02-21 00:09:25 +0000425 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Chris Lattner24943d22010-06-08 16:52:24 +0000426
427 if (frame_sp)
428 {
429 if (frame_sp->HasDebugInformation ())
430 {
431 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Greg Claytonf4124de2012-02-21 00:09:25 +0000432 thread->QueueThreadPlanForStepRange (abort_other_plans,
Greg Clayton90c52142012-01-30 02:53:15 +0000433 eStepTypeOver,
434 sc.line_entry.range,
435 sc,
436 stop_other_threads,
437 false);
Chris Lattner24943d22010-06-08 16:52:24 +0000438
439 }
440 else
441 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000442 thread->QueueThreadPlanForStepSingleInstruction (true,
Greg Clayton90c52142012-01-30 02:53:15 +0000443 abort_other_plans,
444 stop_other_threads);
Chris Lattner24943d22010-06-08 16:52:24 +0000445 }
446 }
447
Greg Claytonf4124de2012-02-21 00:09:25 +0000448 Process *process = exe_ctx.GetProcessPtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000449 // Why do we need to set the current thread by ID here???
Greg Claytonf4124de2012-02-21 00:09:25 +0000450 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
451 Error error (process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000452 if (error.Success())
453 {
454 // If we are doing synchronous mode, then wait for the
455 // process to stop yet again!
Greg Claytonf4124de2012-02-21 00:09:25 +0000456 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
457 process->WaitForProcessToStop (NULL);
Greg Clayton1a3083a2010-10-06 03:53:16 +0000458 }
Chris Lattner24943d22010-06-08 16:52:24 +0000459 }
460}
461
462void
463SBThread::StepInto (lldb::RunMode stop_other_threads)
464{
Greg Claytone005f2c2010-11-06 01:53:30 +0000465 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000466
Greg Claytonf4124de2012-02-21 00:09:25 +0000467 ExecutionContext exe_ctx (m_opaque_wp);
Greg Clayton90c52142012-01-30 02:53:15 +0000468
469 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000470 log->Printf ("SBThread(%p)::StepInto (stop_other_threads='%s')", exe_ctx.GetThreadPtr(),
Greg Clayton90c52142012-01-30 02:53:15 +0000471 Thread::RunModeAsCString (stop_other_threads));
Greg Claytonf4124de2012-02-21 00:09:25 +0000472 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000473 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000474 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000475 bool abort_other_plans = true;
476
Greg Claytonf4124de2012-02-21 00:09:25 +0000477 Thread *thread = exe_ctx.GetThreadPtr();
478 StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
Chris Lattner24943d22010-06-08 16:52:24 +0000479
480 if (frame_sp && frame_sp->HasDebugInformation ())
481 {
Greg Clayton8f5fd6b2010-06-12 18:59:55 +0000482 bool avoid_code_without_debug_info = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000483 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
Greg Claytonf4124de2012-02-21 00:09:25 +0000484 thread->QueueThreadPlanForStepRange (abort_other_plans,
485 eStepTypeInto,
486 sc.line_entry.range,
487 sc,
488 stop_other_threads,
489 avoid_code_without_debug_info);
Chris Lattner24943d22010-06-08 16:52:24 +0000490 }
491 else
492 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000493 thread->QueueThreadPlanForStepSingleInstruction (false,
494 abort_other_plans,
495 stop_other_threads);
Chris Lattner24943d22010-06-08 16:52:24 +0000496 }
497
Greg Claytonf4124de2012-02-21 00:09:25 +0000498 Process *process = exe_ctx.GetProcessPtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000499 // Why do we need to set the current thread by ID here???
Greg Claytonf4124de2012-02-21 00:09:25 +0000500 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
501 Error error (process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000502 if (error.Success())
503 {
504 // If we are doing synchronous mode, then wait for the
505 // process to stop yet again!
Greg Claytonf4124de2012-02-21 00:09:25 +0000506 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
507 process->WaitForProcessToStop (NULL);
Greg Clayton1a3083a2010-10-06 03:53:16 +0000508 }
Chris Lattner24943d22010-06-08 16:52:24 +0000509 }
510}
511
512void
513SBThread::StepOut ()
514{
Greg Claytone005f2c2010-11-06 01:53:30 +0000515 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000516
Greg Claytonf4124de2012-02-21 00:09:25 +0000517 ExecutionContext exe_ctx (m_opaque_wp);
Caroline Tice7826c882010-10-26 03:11:13 +0000518
Greg Clayton90c52142012-01-30 02:53:15 +0000519 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000520 log->Printf ("SBThread(%p)::StepOut ()", exe_ctx.GetThreadPtr());
Greg Clayton90c52142012-01-30 02:53:15 +0000521
Greg Claytonf4124de2012-02-21 00:09:25 +0000522 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000523 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000524 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000525 bool abort_other_plans = true;
526 bool stop_other_threads = true;
527
Greg Claytonf4124de2012-02-21 00:09:25 +0000528 Thread *thread = exe_ctx.GetThreadPtr();
529
530 thread->QueueThreadPlanForStepOut (abort_other_plans,
Greg Clayton90c52142012-01-30 02:53:15 +0000531 NULL,
532 false,
533 stop_other_threads,
534 eVoteYes,
535 eVoteNoOpinion,
536 0);
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000537
Greg Claytonf4124de2012-02-21 00:09:25 +0000538 Process *process = exe_ctx.GetProcessPtr();
539 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
540 Error error (process->Resume());
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000541 if (error.Success())
542 {
543 // If we are doing synchronous mode, then wait for the
544 // process to stop yet again!
Greg Claytonf4124de2012-02-21 00:09:25 +0000545 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
546 process->WaitForProcessToStop (NULL);
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000547 }
548 }
549}
Chris Lattner24943d22010-06-08 16:52:24 +0000550
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000551void
552SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
553{
554 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
555
Greg Claytonf4124de2012-02-21 00:09:25 +0000556 ExecutionContext exe_ctx (m_opaque_wp);
Greg Clayton334d33a2012-01-30 07:41:31 +0000557 StackFrameSP frame_sp (sb_frame.GetFrameSP());
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000558 if (log)
559 {
560 SBStream frame_desc_strm;
561 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonf4124de2012-02-21 00:09:25 +0000562 log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000563 }
564
Greg Claytonf4124de2012-02-21 00:09:25 +0000565 if (exe_ctx.HasThreadScope())
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000566 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000567 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000568 bool abort_other_plans = true;
569 bool stop_other_threads = true;
Greg Claytonf4124de2012-02-21 00:09:25 +0000570 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000571
Greg Claytonf4124de2012-02-21 00:09:25 +0000572 thread->QueueThreadPlanForStepOut (abort_other_plans,
Greg Clayton90c52142012-01-30 02:53:15 +0000573 NULL,
574 false,
575 stop_other_threads,
576 eVoteYes,
577 eVoteNoOpinion,
Greg Clayton334d33a2012-01-30 07:41:31 +0000578 frame_sp->GetFrameIndex());
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000579
Greg Claytonf4124de2012-02-21 00:09:25 +0000580 Process *process = exe_ctx.GetProcessPtr();
581 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
582 Error error (process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000583 if (error.Success())
584 {
585 // If we are doing synchronous mode, then wait for the
586 // process to stop yet again!
Greg Claytonf4124de2012-02-21 00:09:25 +0000587 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
588 process->WaitForProcessToStop (NULL);
Greg Clayton1a3083a2010-10-06 03:53:16 +0000589 }
Chris Lattner24943d22010-06-08 16:52:24 +0000590 }
591}
592
593void
594SBThread::StepInstruction (bool step_over)
595{
Greg Claytone005f2c2010-11-06 01:53:30 +0000596 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000597
Greg Claytonf4124de2012-02-21 00:09:25 +0000598 ExecutionContext exe_ctx (m_opaque_wp);
599
Caroline Tice7826c882010-10-26 03:11:13 +0000600
Greg Clayton90c52142012-01-30 02:53:15 +0000601 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000602 log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", exe_ctx.GetThreadPtr(), step_over);
Greg Clayton90c52142012-01-30 02:53:15 +0000603
Greg Claytonf4124de2012-02-21 00:09:25 +0000604 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000605 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000606 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
607 Thread *thread = exe_ctx.GetThreadPtr();
608 Process *process = exe_ctx.GetProcessPtr();
609 thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true);
610 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
611 Error error (process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000612 if (error.Success())
613 {
614 // If we are doing synchronous mode, then wait for the
615 // process to stop yet again!
Greg Claytonf4124de2012-02-21 00:09:25 +0000616 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
617 process->WaitForProcessToStop (NULL);
Greg Clayton1a3083a2010-10-06 03:53:16 +0000618 }
Chris Lattner24943d22010-06-08 16:52:24 +0000619 }
620}
621
622void
623SBThread::RunToAddress (lldb::addr_t addr)
624{
Greg Claytone005f2c2010-11-06 01:53:30 +0000625 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000626
Greg Claytonf4124de2012-02-21 00:09:25 +0000627 ExecutionContext exe_ctx (m_opaque_wp);
Caroline Tice7826c882010-10-26 03:11:13 +0000628
Greg Clayton90c52142012-01-30 02:53:15 +0000629 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000630 log->Printf ("SBThread(%p)::RunToAddress (addr=0x%llx)", exe_ctx.GetThreadPtr(), addr);
Greg Clayton90c52142012-01-30 02:53:15 +0000631
Greg Claytonf4124de2012-02-21 00:09:25 +0000632 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000633 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000634 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000635 bool abort_other_plans = true;
636 bool stop_other_threads = true;
637
638 Address target_addr (NULL, addr);
639
Greg Claytonf4124de2012-02-21 00:09:25 +0000640 Thread *thread = exe_ctx.GetThreadPtr();
641 Process *process = exe_ctx.GetProcessPtr();
642
643 thread->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads);
644 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
645 Error error (process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000646 if (error.Success())
647 {
648 // If we are doing synchronous mode, then wait for the
649 // process to stop yet again!
Greg Claytonf4124de2012-02-21 00:09:25 +0000650 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
651 process->WaitForProcessToStop (NULL);
Greg Clayton1a3083a2010-10-06 03:53:16 +0000652 }
Chris Lattner24943d22010-06-08 16:52:24 +0000653 }
Chris Lattner24943d22010-06-08 16:52:24 +0000654}
655
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000656SBError
657SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
658 lldb::SBFileSpec &sb_file_spec,
659 uint32_t line)
660{
661 SBError sb_error;
662 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
663 char path[PATH_MAX];
Greg Clayton90c52142012-01-30 02:53:15 +0000664
Greg Claytonf4124de2012-02-21 00:09:25 +0000665 ExecutionContext exe_ctx (m_opaque_wp);
Greg Clayton334d33a2012-01-30 07:41:31 +0000666 StackFrameSP frame_sp (sb_frame.GetFrameSP());
667
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000668 if (log)
669 {
670 SBStream frame_desc_strm;
671 sb_frame.GetDescription (frame_desc_strm);
672 sb_file_spec->GetPath (path, sizeof(path));
673 log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
Greg Claytonf4124de2012-02-21 00:09:25 +0000674 exe_ctx.GetThreadPtr(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000675 frame_sp.get(),
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000676 frame_desc_strm.GetData(),
677 path, line);
678 }
Greg Clayton90c52142012-01-30 02:53:15 +0000679
Greg Claytonf4124de2012-02-21 00:09:25 +0000680 if (exe_ctx.HasThreadScope())
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000681 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000682 Target *target = exe_ctx.GetTargetPtr();
683 Mutex::Locker api_locker (target->GetAPIMutex());
684 Thread *thread = exe_ctx.GetThreadPtr();
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000685
686 if (line == 0)
687 {
688 sb_error.SetErrorString("invalid line argument");
689 return sb_error;
690 }
691
692 StackFrameSP frame_sp;
Greg Clayton334d33a2012-01-30 07:41:31 +0000693 if (!frame_sp)
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000694 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000695 frame_sp = thread->GetSelectedFrame ();
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000696 if (!frame_sp)
Greg Claytonf4124de2012-02-21 00:09:25 +0000697 frame_sp = thread->GetStackFrameAtIndex (0);
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000698 }
699
700 SymbolContext frame_sc;
701 if (!frame_sp)
702 {
703 sb_error.SetErrorString("no valid frames in thread to step");
704 return sb_error;
705 }
706
707 // If we have a frame, get its line
708 frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit |
709 eSymbolContextFunction |
710 eSymbolContextLineEntry |
711 eSymbolContextSymbol );
712
713 if (frame_sc.comp_unit == NULL)
714 {
715 sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
716 return sb_error;
717 }
718
719 FileSpec step_file_spec;
720 if (sb_file_spec.IsValid())
721 {
722 // The file spec passed in was valid, so use it
723 step_file_spec = sb_file_spec.ref();
724 }
725 else
726 {
727 if (frame_sc.line_entry.IsValid())
728 step_file_spec = frame_sc.line_entry.file;
729 else
730 {
731 sb_error.SetErrorString("invalid file argument or no file for frame");
732 return sb_error;
733 }
734 }
735
Jim Inghamb07c62a2011-05-08 00:56:32 +0000736 // Grab the current function, then we will make sure the "until" address is
737 // within the function. We discard addresses that are out of the current
738 // function, and then if there are no addresses remaining, give an appropriate
739 // error message.
740
741 bool all_in_function = true;
742 AddressRange fun_range = frame_sc.function->GetAddressRange();
743
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000744 std::vector<addr_t> step_over_until_addrs;
745 const bool abort_other_plans = true;
746 const bool stop_other_threads = true;
747 const bool check_inlines = true;
748 const bool exact = false;
749
750 SymbolContextList sc_list;
Jim Inghamb07c62a2011-05-08 00:56:32 +0000751 const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
752 line,
753 check_inlines,
754 exact,
755 eSymbolContextLineEntry,
756 sc_list);
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000757 if (num_matches > 0)
758 {
759 SymbolContext sc;
760 for (uint32_t i=0; i<num_matches; ++i)
761 {
762 if (sc_list.GetContextAtIndex(i, sc))
763 {
Jim Inghamb07c62a2011-05-08 00:56:32 +0000764 addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000765 if (step_addr != LLDB_INVALID_ADDRESS)
766 {
Jim Inghamb07c62a2011-05-08 00:56:32 +0000767 if (fun_range.ContainsLoadAddress(step_addr, target))
768 step_over_until_addrs.push_back(step_addr);
769 else
770 all_in_function = false;
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000771 }
772 }
773 }
774 }
Jim Inghamb07c62a2011-05-08 00:56:32 +0000775
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000776 if (step_over_until_addrs.empty())
777 {
Jim Inghamb07c62a2011-05-08 00:56:32 +0000778 if (all_in_function)
779 {
780 step_file_spec.GetPath (path, sizeof(path));
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000781 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
Jim Inghamb07c62a2011-05-08 00:56:32 +0000782 }
783 else
Greg Clayton9c236732011-10-26 00:56:27 +0000784 sb_error.SetErrorString ("step until target not in current function");
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000785 }
786 else
787 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000788 thread->QueueThreadPlanForStepUntil (abort_other_plans,
789 &step_over_until_addrs[0],
790 step_over_until_addrs.size(),
791 stop_other_threads,
792 frame_sp->GetFrameIndex());
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000793
Greg Claytonf4124de2012-02-21 00:09:25 +0000794 Process *process = exe_ctx.GetProcessPtr();
795
796 process->GetThreadList().SetSelectedThreadByID (thread->GetID());
797 sb_error.ref() = process->Resume();
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000798 if (sb_error->Success())
799 {
800 // If we are doing synchronous mode, then wait for the
801 // process to stop yet again!
Greg Claytonf4124de2012-02-21 00:09:25 +0000802 if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
803 process->WaitForProcessToStop (NULL);
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000804 }
805 }
806 }
807 else
808 {
809 sb_error.SetErrorString("this SBThread object is invalid");
810 }
811 return sb_error;
812}
813
814
Greg Clayton123db402011-01-12 02:25:42 +0000815bool
816SBThread::Suspend()
817{
Greg Claytonf4124de2012-02-21 00:09:25 +0000818 ExecutionContext exe_ctx (m_opaque_wp);
819 if (exe_ctx.HasThreadScope())
Greg Clayton123db402011-01-12 02:25:42 +0000820 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000821 exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
Greg Clayton123db402011-01-12 02:25:42 +0000822 return true;
823 }
824 return false;
825}
826
827bool
828SBThread::Resume ()
829{
Greg Claytonf4124de2012-02-21 00:09:25 +0000830 ExecutionContext exe_ctx (m_opaque_wp);
831 if (exe_ctx.HasThreadScope())
Greg Clayton123db402011-01-12 02:25:42 +0000832 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000833 exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning);
Greg Clayton123db402011-01-12 02:25:42 +0000834 return true;
835 }
836 return false;
837}
838
839bool
840SBThread::IsSuspended()
841{
Greg Claytonf4124de2012-02-21 00:09:25 +0000842 ExecutionContext exe_ctx (m_opaque_wp);
843 if (exe_ctx.HasThreadScope())
844 return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
Greg Clayton123db402011-01-12 02:25:42 +0000845 return false;
846}
847
Chris Lattner24943d22010-06-08 16:52:24 +0000848SBProcess
849SBThread::GetProcess ()
850{
Caroline Tice7826c882010-10-26 03:11:13 +0000851
Greg Clayton334d33a2012-01-30 07:41:31 +0000852 SBProcess sb_process;
853 ProcessSP process_sp;
Greg Claytonf4124de2012-02-21 00:09:25 +0000854 ExecutionContext exe_ctx (m_opaque_wp);
855 if (exe_ctx.HasThreadScope())
Chris Lattner24943d22010-06-08 16:52:24 +0000856 {
857 // Have to go up to the target so we can get a shared pointer to our process...
Greg Claytonf4124de2012-02-21 00:09:25 +0000858 sb_process.SetSP (exe_ctx.GetProcessSP());
Chris Lattner24943d22010-06-08 16:52:24 +0000859 }
Caroline Tice7826c882010-10-26 03:11:13 +0000860
Greg Claytone005f2c2010-11-06 01:53:30 +0000861 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000862 if (log)
863 {
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000864 SBStream frame_desc_strm;
Greg Clayton334d33a2012-01-30 07:41:31 +0000865 sb_process.GetDescription (frame_desc_strm);
Greg Claytonf4124de2012-02-21 00:09:25 +0000866 log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", exe_ctx.GetThreadPtr(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000867 process_sp.get(), frame_desc_strm.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000868 }
869
Greg Clayton334d33a2012-01-30 07:41:31 +0000870 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000871}
872
873uint32_t
874SBThread::GetNumFrames ()
875{
Greg Claytone005f2c2010-11-06 01:53:30 +0000876 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000877
Caroline Tice7826c882010-10-26 03:11:13 +0000878 uint32_t num_frames = 0;
Greg Claytonf4124de2012-02-21 00:09:25 +0000879 ExecutionContext exe_ctx (m_opaque_wp);
880 if (exe_ctx.HasThreadScope())
Greg Claytonbdcda462010-12-20 20:49:23 +0000881 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000882 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
883 num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
Greg Claytonbdcda462010-12-20 20:49:23 +0000884 }
Caroline Tice7826c882010-10-26 03:11:13 +0000885
886 if (log)
Greg Claytonf4124de2012-02-21 00:09:25 +0000887 log->Printf ("SBThread(%p)::GetNumFrames () => %u", exe_ctx.GetThreadPtr(), num_frames);
Caroline Tice7826c882010-10-26 03:11:13 +0000888
889 return num_frames;
Chris Lattner24943d22010-06-08 16:52:24 +0000890}
891
892SBFrame
893SBThread::GetFrameAtIndex (uint32_t idx)
894{
Greg Claytone005f2c2010-11-06 01:53:30 +0000895 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000896
Chris Lattner24943d22010-06-08 16:52:24 +0000897 SBFrame sb_frame;
Greg Clayton334d33a2012-01-30 07:41:31 +0000898 StackFrameSP frame_sp;
Greg Claytonf4124de2012-02-21 00:09:25 +0000899 ExecutionContext exe_ctx (m_opaque_wp);
900 if (exe_ctx.HasThreadScope())
Greg Claytonbdcda462010-12-20 20:49:23 +0000901 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000902 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
903 frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
Greg Clayton334d33a2012-01-30 07:41:31 +0000904 sb_frame.SetFrameSP (frame_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000905 }
Caroline Tice7826c882010-10-26 03:11:13 +0000906
907 if (log)
908 {
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000909 SBStream frame_desc_strm;
910 sb_frame.GetDescription (frame_desc_strm);
Greg Claytona66ba462010-10-30 04:51:46 +0000911 log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
Greg Claytonf4124de2012-02-21 00:09:25 +0000912 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000913 }
914
Chris Lattner24943d22010-06-08 16:52:24 +0000915 return sb_frame;
916}
917
Greg Claytonc5157ec2010-12-17 02:26:24 +0000918lldb::SBFrame
919SBThread::GetSelectedFrame ()
920{
921 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
922
923 SBFrame sb_frame;
Greg Clayton334d33a2012-01-30 07:41:31 +0000924 StackFrameSP frame_sp;
Greg Claytonf4124de2012-02-21 00:09:25 +0000925 ExecutionContext exe_ctx (m_opaque_wp);
926 if (exe_ctx.HasThreadScope())
Greg Claytonbdcda462010-12-20 20:49:23 +0000927 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000928 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
929 frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
Greg Clayton334d33a2012-01-30 07:41:31 +0000930 sb_frame.SetFrameSP (frame_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000931 }
Greg Claytonc5157ec2010-12-17 02:26:24 +0000932
933 if (log)
934 {
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000935 SBStream frame_desc_strm;
936 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonc5157ec2010-12-17 02:26:24 +0000937 log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
Greg Claytonf4124de2012-02-21 00:09:25 +0000938 exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonc5157ec2010-12-17 02:26:24 +0000939 }
940
941 return sb_frame;
942}
943
944lldb::SBFrame
945SBThread::SetSelectedFrame (uint32_t idx)
946{
947 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
948
949 SBFrame sb_frame;
Greg Clayton334d33a2012-01-30 07:41:31 +0000950 StackFrameSP frame_sp;
Greg Claytonf4124de2012-02-21 00:09:25 +0000951 ExecutionContext exe_ctx (m_opaque_wp);
952 if (exe_ctx.HasThreadScope())
Greg Claytonc5157ec2010-12-17 02:26:24 +0000953 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000954 Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
955 Thread *thread = exe_ctx.GetThreadPtr();
956 frame_sp = thread->GetStackFrameAtIndex (idx);
Greg Claytonc5157ec2010-12-17 02:26:24 +0000957 if (frame_sp)
958 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000959 thread->SetSelectedFrame (frame_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000960 sb_frame.SetFrameSP (frame_sp);
Greg Claytonc5157ec2010-12-17 02:26:24 +0000961 }
962 }
963
964 if (log)
965 {
Greg Clayton1ebdcc72011-01-21 06:11:58 +0000966 SBStream frame_desc_strm;
967 sb_frame.GetDescription (frame_desc_strm);
Greg Claytonc5157ec2010-12-17 02:26:24 +0000968 log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
Greg Claytonf4124de2012-02-21 00:09:25 +0000969 exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
Greg Claytonc5157ec2010-12-17 02:26:24 +0000970 }
971 return sb_frame;
972}
973
974
Chris Lattner24943d22010-06-08 16:52:24 +0000975bool
976SBThread::operator == (const SBThread &rhs) const
977{
Greg Clayton90c52142012-01-30 02:53:15 +0000978 return m_opaque_wp.lock().get() == rhs.m_opaque_wp.lock().get();
Chris Lattner24943d22010-06-08 16:52:24 +0000979}
980
981bool
982SBThread::operator != (const SBThread &rhs) const
983{
Greg Clayton90c52142012-01-30 02:53:15 +0000984 return m_opaque_wp.lock().get() != rhs.m_opaque_wp.lock().get();
Chris Lattner24943d22010-06-08 16:52:24 +0000985}
Caroline Tice98f930f2010-09-20 05:20:02 +0000986
987bool
Caroline Tice7826c882010-10-26 03:11:13 +0000988SBThread::GetDescription (SBStream &description) const
989{
Greg Clayton96154be2011-11-13 06:57:31 +0000990 Stream &strm = description.ref();
991
Greg Claytonf4124de2012-02-21 00:09:25 +0000992 ExecutionContext exe_ctx (m_opaque_wp);
993 if (exe_ctx.HasThreadScope())
Caroline Tice7826c882010-10-26 03:11:13 +0000994 {
Greg Claytonf4124de2012-02-21 00:09:25 +0000995 strm.Printf("SBThread: tid = 0x%4.4llx", exe_ctx.GetThreadPtr()->GetID());
Caroline Tice7826c882010-10-26 03:11:13 +0000996 }
997 else
Greg Clayton96154be2011-11-13 06:57:31 +0000998 strm.PutCString ("No value");
Caroline Tice7826c882010-10-26 03:11:13 +0000999
1000 return true;
1001}