130fdc8d8SChris Lattner //===-- SBThread.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
104c5de699SEli Friedman #include "lldb/API/SBThread.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include "lldb/API/SBSymbolContext.h"
1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
156611103cSGreg Clayton #include "lldb/Core/Debugger.h"
1630fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
1730fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
186611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
1930fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
2030fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2130fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2230fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
23f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h"
2430fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2530fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h"
2630fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h"
2730fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h"
2830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h"
2930fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInRange.h"
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner 
324c5de699SEli Friedman #include "lldb/API/SBAddress.h"
334c5de699SEli Friedman #include "lldb/API/SBFrame.h"
344c5de699SEli Friedman #include "lldb/API/SBSourceManager.h"
354c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
364c5de699SEli Friedman #include "lldb/API/SBProcess.h"
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner using namespace lldb;
3930fdc8d8SChris Lattner using namespace lldb_private;
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner SBThread::SBThread () :
426611103cSGreg Clayton     m_opaque_sp ()
4330fdc8d8SChris Lattner {
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner //----------------------------------------------------------------------
4730fdc8d8SChris Lattner // Thread constructor
4830fdc8d8SChris Lattner //----------------------------------------------------------------------
4930fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) :
506611103cSGreg Clayton     m_opaque_sp (lldb_object_sp)
5130fdc8d8SChris Lattner {
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
54*92ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) :
55*92ef5735SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5630fdc8d8SChris Lattner {
5730fdc8d8SChris Lattner }
5830fdc8d8SChris Lattner 
5930fdc8d8SChris Lattner //----------------------------------------------------------------------
6030fdc8d8SChris Lattner // Destructor
6130fdc8d8SChris Lattner //----------------------------------------------------------------------
6230fdc8d8SChris Lattner SBThread::~SBThread()
6330fdc8d8SChris Lattner {
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner bool
6730fdc8d8SChris Lattner SBThread::IsValid() const
6830fdc8d8SChris Lattner {
696611103cSGreg Clayton     return m_opaque_sp != NULL;
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
7248e42549SGreg Clayton void
7348e42549SGreg Clayton SBThread::Clear ()
7448e42549SGreg Clayton {
7548e42549SGreg Clayton     m_opaque_sp.reset();
7648e42549SGreg Clayton }
7748e42549SGreg Clayton 
7848e42549SGreg Clayton 
7930fdc8d8SChris Lattner StopReason
8030fdc8d8SChris Lattner SBThread::GetStopReason()
8130fdc8d8SChris Lattner {
82ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
83ceb6b139SCaroline Tice 
84ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
856611103cSGreg Clayton     if (m_opaque_sp)
8630fdc8d8SChris Lattner     {
87b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
88b15bfc75SJim Ingham         if (stop_info_sp)
89ceb6b139SCaroline Tice             reason =  stop_info_sp->GetStopReason();
9030fdc8d8SChris Lattner     }
91ceb6b139SCaroline Tice 
92ceb6b139SCaroline Tice     if (log)
934838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetStopReason () => %s", m_opaque_sp.get(),
94750cd175SCaroline Tice                      Thread::StopReasonAsCString (reason));
95ceb6b139SCaroline Tice 
96ceb6b139SCaroline Tice     return reason;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner size_t
10030fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
10130fdc8d8SChris Lattner {
102ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
103ceb6b139SCaroline Tice 
1046611103cSGreg Clayton     if (m_opaque_sp)
10530fdc8d8SChris Lattner     {
106b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
107b15bfc75SJim Ingham         if (stop_info_sp)
10830fdc8d8SChris Lattner         {
109b15bfc75SJim Ingham             const char *stop_desc = stop_info_sp->GetDescription();
11030fdc8d8SChris Lattner             if (stop_desc)
11130fdc8d8SChris Lattner             {
112ceb6b139SCaroline Tice                 if (log)
1134838131bSGreg Clayton                     log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
114750cd175SCaroline Tice                                  m_opaque_sp.get(), stop_desc);
11530fdc8d8SChris Lattner                 if (dst)
11630fdc8d8SChris Lattner                     return ::snprintf (dst, dst_len, "%s", stop_desc);
11730fdc8d8SChris Lattner                 else
11830fdc8d8SChris Lattner                 {
11930fdc8d8SChris Lattner                     // NULL dst passed in, return the length needed to contain the description
12030fdc8d8SChris Lattner                     return ::strlen (stop_desc) + 1; // Include the NULL byte for size
12130fdc8d8SChris Lattner                 }
12230fdc8d8SChris Lattner             }
12330fdc8d8SChris Lattner             else
12430fdc8d8SChris Lattner             {
12530fdc8d8SChris Lattner                 size_t stop_desc_len = 0;
126b15bfc75SJim Ingham                 switch (stop_info_sp->GetStopReason())
12730fdc8d8SChris Lattner                 {
12830fdc8d8SChris Lattner                 case eStopReasonTrace:
12930fdc8d8SChris Lattner                 case eStopReasonPlanComplete:
13030fdc8d8SChris Lattner                     {
13130fdc8d8SChris Lattner                         static char trace_desc[] = "step";
13230fdc8d8SChris Lattner                         stop_desc = trace_desc;
13330fdc8d8SChris Lattner                         stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
13430fdc8d8SChris Lattner                     }
13530fdc8d8SChris Lattner                     break;
13630fdc8d8SChris Lattner 
13730fdc8d8SChris Lattner                 case eStopReasonBreakpoint:
13830fdc8d8SChris Lattner                     {
13930fdc8d8SChris Lattner                         static char bp_desc[] = "breakpoint hit";
14030fdc8d8SChris Lattner                         stop_desc = bp_desc;
14130fdc8d8SChris Lattner                         stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
14230fdc8d8SChris Lattner                     }
14330fdc8d8SChris Lattner                     break;
14430fdc8d8SChris Lattner 
14530fdc8d8SChris Lattner                 case eStopReasonWatchpoint:
14630fdc8d8SChris Lattner                     {
14730fdc8d8SChris Lattner                         static char wp_desc[] = "watchpoint hit";
14830fdc8d8SChris Lattner                         stop_desc = wp_desc;
14930fdc8d8SChris Lattner                         stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
15030fdc8d8SChris Lattner                     }
15130fdc8d8SChris Lattner                     break;
15230fdc8d8SChris Lattner 
15330fdc8d8SChris Lattner                 case eStopReasonSignal:
15430fdc8d8SChris Lattner                     {
155b15bfc75SJim Ingham                         stop_desc = m_opaque_sp->GetProcess().GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
15630fdc8d8SChris Lattner                         if (stop_desc == NULL || stop_desc[0] == '\0')
15730fdc8d8SChris Lattner                         {
15830fdc8d8SChris Lattner                             static char signal_desc[] = "signal";
15930fdc8d8SChris Lattner                             stop_desc = signal_desc;
16030fdc8d8SChris Lattner                             stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
16130fdc8d8SChris Lattner                         }
16230fdc8d8SChris Lattner                     }
16330fdc8d8SChris Lattner                     break;
16430fdc8d8SChris Lattner 
16530fdc8d8SChris Lattner                 case eStopReasonException:
16630fdc8d8SChris Lattner                     {
16730fdc8d8SChris Lattner                         char exc_desc[] = "exception";
16830fdc8d8SChris Lattner                         stop_desc = exc_desc;
16930fdc8d8SChris Lattner                         stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
17030fdc8d8SChris Lattner                     }
17130fdc8d8SChris Lattner                     break;
172c982c768SGreg Clayton 
173c982c768SGreg Clayton                 default:
174c982c768SGreg Clayton                     break;
17530fdc8d8SChris Lattner                 }
17630fdc8d8SChris Lattner 
17730fdc8d8SChris Lattner                 if (stop_desc && stop_desc[0])
17830fdc8d8SChris Lattner                 {
179ceb6b139SCaroline Tice                     if (log)
18093aa84e8SGreg Clayton                         log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
181750cd175SCaroline Tice                                      m_opaque_sp.get(), stop_desc);
182ceb6b139SCaroline Tice 
18330fdc8d8SChris Lattner                     if (dst)
18430fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
18530fdc8d8SChris Lattner 
18630fdc8d8SChris Lattner                     if (stop_desc_len == 0)
18730fdc8d8SChris Lattner                         stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
18830fdc8d8SChris Lattner 
18930fdc8d8SChris Lattner                     return stop_desc_len;
19030fdc8d8SChris Lattner                 }
19130fdc8d8SChris Lattner             }
19230fdc8d8SChris Lattner         }
19330fdc8d8SChris Lattner     }
19430fdc8d8SChris Lattner     if (dst)
19530fdc8d8SChris Lattner         *dst = 0;
19630fdc8d8SChris Lattner     return 0;
19730fdc8d8SChris Lattner }
19830fdc8d8SChris Lattner 
19930fdc8d8SChris Lattner void
20030fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
20130fdc8d8SChris Lattner {
2026611103cSGreg Clayton     m_opaque_sp = lldb_object_sp;
20330fdc8d8SChris Lattner }
20430fdc8d8SChris Lattner 
20530fdc8d8SChris Lattner 
20630fdc8d8SChris Lattner lldb::tid_t
20730fdc8d8SChris Lattner SBThread::GetThreadID () const
20830fdc8d8SChris Lattner {
209ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
210ceb6b139SCaroline Tice 
211ceb6b139SCaroline Tice     lldb::tid_t id = LLDB_INVALID_THREAD_ID;
2126611103cSGreg Clayton     if (m_opaque_sp)
213ceb6b139SCaroline Tice         id = m_opaque_sp->GetID();
214ceb6b139SCaroline Tice 
215ceb6b139SCaroline Tice     if (log)
2164838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetThreadID () => 0x%4.4x", m_opaque_sp.get(), id);
217ceb6b139SCaroline Tice 
218ceb6b139SCaroline Tice     return id;
21930fdc8d8SChris Lattner }
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner uint32_t
22230fdc8d8SChris Lattner SBThread::GetIndexID () const
22330fdc8d8SChris Lattner {
2246611103cSGreg Clayton     if (m_opaque_sp)
2256611103cSGreg Clayton         return m_opaque_sp->GetIndexID();
22630fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
22730fdc8d8SChris Lattner }
22830fdc8d8SChris Lattner const char *
22930fdc8d8SChris Lattner SBThread::GetName () const
23030fdc8d8SChris Lattner {
2314838131bSGreg Clayton     const char *name = NULL;
2326611103cSGreg Clayton     if (m_opaque_sp)
2334838131bSGreg Clayton         name = m_opaque_sp->GetName();
234ceb6b139SCaroline Tice 
2354838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
236ceb6b139SCaroline Tice     if (log)
2374838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetName () => %s", m_opaque_sp.get(), name ? name : "NULL");
238ceb6b139SCaroline Tice 
2394838131bSGreg Clayton     return name;
24030fdc8d8SChris Lattner }
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner const char *
24330fdc8d8SChris Lattner SBThread::GetQueueName () const
24430fdc8d8SChris Lattner {
2454838131bSGreg Clayton     const char *name = NULL;
2466611103cSGreg Clayton     if (m_opaque_sp)
2474838131bSGreg Clayton         name = m_opaque_sp->GetQueueName();
248ceb6b139SCaroline Tice 
2494838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
250ceb6b139SCaroline Tice     if (log)
2514838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetQueueName () => %s", m_opaque_sp.get(), name ? name : "NULL");
252ceb6b139SCaroline Tice 
2534838131bSGreg Clayton     return name;
25430fdc8d8SChris Lattner }
25530fdc8d8SChris Lattner 
25630fdc8d8SChris Lattner 
25730fdc8d8SChris Lattner void
25830fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
25930fdc8d8SChris Lattner {
260ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
261ceb6b139SCaroline Tice 
262ceb6b139SCaroline Tice     if (log)
26393aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", m_opaque_sp.get(),
264ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
265ceb6b139SCaroline Tice 
2666611103cSGreg Clayton     if (m_opaque_sp)
26730fdc8d8SChris Lattner     {
26830fdc8d8SChris Lattner         bool abort_other_plans = true;
2696611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
27030fdc8d8SChris Lattner 
27130fdc8d8SChris Lattner         if (frame_sp)
27230fdc8d8SChris Lattner         {
27330fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
27430fdc8d8SChris Lattner             {
27530fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
2766611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
27730fdc8d8SChris Lattner                                                           eStepTypeOver,
27830fdc8d8SChris Lattner                                                           sc.line_entry.range,
27930fdc8d8SChris Lattner                                                           sc,
280474966a4SGreg Clayton                                                           stop_other_threads,
281474966a4SGreg Clayton                                                           false);
28230fdc8d8SChris Lattner 
28330fdc8d8SChris Lattner             }
28430fdc8d8SChris Lattner             else
28530fdc8d8SChris Lattner             {
2866611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepSingleInstruction (true,
28730fdc8d8SChris Lattner                                                                       abort_other_plans,
28830fdc8d8SChris Lattner                                                                       stop_other_threads);
28930fdc8d8SChris Lattner             }
29030fdc8d8SChris Lattner         }
29130fdc8d8SChris Lattner 
2926611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
29330fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
2942976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
2955d5028b5SGreg Clayton         Error error (process.Resume());
2965d5028b5SGreg Clayton         if (error.Success())
2975d5028b5SGreg Clayton         {
2985d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
2995d5028b5SGreg Clayton             // process to stop yet again!
3005d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3015d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3025d5028b5SGreg Clayton         }
30330fdc8d8SChris Lattner     }
30430fdc8d8SChris Lattner }
30530fdc8d8SChris Lattner 
30630fdc8d8SChris Lattner void
30730fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
30830fdc8d8SChris Lattner {
309ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
310ceb6b139SCaroline Tice 
311ceb6b139SCaroline Tice     if (log)
31293aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInto (stop_other_threads='%s')", m_opaque_sp.get(),
313ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
314ceb6b139SCaroline Tice 
3156611103cSGreg Clayton     if (m_opaque_sp)
31630fdc8d8SChris Lattner     {
31730fdc8d8SChris Lattner         bool abort_other_plans = true;
31830fdc8d8SChris Lattner 
3196611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
32030fdc8d8SChris Lattner 
32130fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
32230fdc8d8SChris Lattner         {
323474966a4SGreg Clayton             bool avoid_code_without_debug_info = true;
32430fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
3256611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
32630fdc8d8SChris Lattner                                                       eStepTypeInto,
32730fdc8d8SChris Lattner                                                       sc.line_entry.range,
32830fdc8d8SChris Lattner                                                       sc,
329474966a4SGreg Clayton                                                       stop_other_threads,
330474966a4SGreg Clayton                                                       avoid_code_without_debug_info);
33130fdc8d8SChris Lattner         }
33230fdc8d8SChris Lattner         else
33330fdc8d8SChris Lattner         {
3346611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepSingleInstruction (false,
33530fdc8d8SChris Lattner                                                                   abort_other_plans,
33630fdc8d8SChris Lattner                                                                   stop_other_threads);
33730fdc8d8SChris Lattner         }
33830fdc8d8SChris Lattner 
3396611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
34030fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
3412976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3425d5028b5SGreg Clayton         Error error (process.Resume());
3435d5028b5SGreg Clayton         if (error.Success())
3445d5028b5SGreg Clayton         {
3455d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3465d5028b5SGreg Clayton             // process to stop yet again!
3475d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3485d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3495d5028b5SGreg Clayton         }
35030fdc8d8SChris Lattner     }
35130fdc8d8SChris Lattner }
35230fdc8d8SChris Lattner 
35330fdc8d8SChris Lattner void
35430fdc8d8SChris Lattner SBThread::StepOut ()
35530fdc8d8SChris Lattner {
356ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
357ceb6b139SCaroline Tice 
358ceb6b139SCaroline Tice     if (log)
3594838131bSGreg Clayton         log->Printf ("SBThread(%p)::StepOut ()", m_opaque_sp.get());
360ceb6b139SCaroline Tice 
3616611103cSGreg Clayton     if (m_opaque_sp)
36230fdc8d8SChris Lattner     {
36330fdc8d8SChris Lattner         bool abort_other_plans = true;
36430fdc8d8SChris Lattner         bool stop_other_threads = true;
36530fdc8d8SChris Lattner 
3666611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, stop_other_threads, eVoteYes, eVoteNoOpinion);
36730fdc8d8SChris Lattner 
3686611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
3692976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3705d5028b5SGreg Clayton         Error error (process.Resume());
3715d5028b5SGreg Clayton         if (error.Success())
3725d5028b5SGreg Clayton         {
3735d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3745d5028b5SGreg Clayton             // process to stop yet again!
3755d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3765d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3775d5028b5SGreg Clayton         }
37830fdc8d8SChris Lattner     }
37930fdc8d8SChris Lattner }
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner void
38230fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
38330fdc8d8SChris Lattner {
384ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
385ceb6b139SCaroline Tice 
386ceb6b139SCaroline Tice     if (log)
38793aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", m_opaque_sp.get(), step_over);
388ceb6b139SCaroline Tice 
3896611103cSGreg Clayton     if (m_opaque_sp)
39030fdc8d8SChris Lattner     {
3916611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepSingleInstruction (step_over, true, true);
3926611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
3932976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3945d5028b5SGreg Clayton         Error error (process.Resume());
3955d5028b5SGreg Clayton         if (error.Success())
3965d5028b5SGreg Clayton         {
3975d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3985d5028b5SGreg Clayton             // process to stop yet again!
3995d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4005d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4015d5028b5SGreg Clayton         }
40230fdc8d8SChris Lattner     }
40330fdc8d8SChris Lattner }
40430fdc8d8SChris Lattner 
40530fdc8d8SChris Lattner void
40630fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
40730fdc8d8SChris Lattner {
408ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
409ceb6b139SCaroline Tice 
410ceb6b139SCaroline Tice     if (log)
41193aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::RunToAddress (addr=0x%llx)", m_opaque_sp.get(), addr);
412ceb6b139SCaroline Tice 
4136611103cSGreg Clayton     if (m_opaque_sp)
41430fdc8d8SChris Lattner     {
41530fdc8d8SChris Lattner         bool abort_other_plans = true;
41630fdc8d8SChris Lattner         bool stop_other_threads = true;
41730fdc8d8SChris Lattner 
41830fdc8d8SChris Lattner         Address target_addr (NULL, addr);
41930fdc8d8SChris Lattner 
4206611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads);
4216611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
4222976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4235d5028b5SGreg Clayton         Error error (process.Resume());
4245d5028b5SGreg Clayton         if (error.Success())
4255d5028b5SGreg Clayton         {
4265d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4275d5028b5SGreg Clayton             // process to stop yet again!
4285d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4295d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4305d5028b5SGreg Clayton         }
43130fdc8d8SChris Lattner     }
43230fdc8d8SChris Lattner 
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
43530fdc8d8SChris Lattner SBProcess
43630fdc8d8SChris Lattner SBThread::GetProcess ()
43730fdc8d8SChris Lattner {
438ceb6b139SCaroline Tice 
43930fdc8d8SChris Lattner     SBProcess process;
4406611103cSGreg Clayton     if (m_opaque_sp)
44130fdc8d8SChris Lattner     {
44230fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
4436611103cSGreg Clayton         process.SetProcess(m_opaque_sp->GetProcess().GetTarget().GetProcessSP());
44430fdc8d8SChris Lattner     }
445ceb6b139SCaroline Tice 
44620ad3c40SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
447ceb6b139SCaroline Tice     if (log)
448ceb6b139SCaroline Tice     {
449ceb6b139SCaroline Tice         SBStream sstr;
450ceb6b139SCaroline Tice         process.GetDescription (sstr);
4514838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
452750cd175SCaroline Tice                      process.get(), sstr.GetData());
453ceb6b139SCaroline Tice     }
454ceb6b139SCaroline Tice 
45530fdc8d8SChris Lattner     return process;
45630fdc8d8SChris Lattner }
45730fdc8d8SChris Lattner 
45830fdc8d8SChris Lattner uint32_t
45930fdc8d8SChris Lattner SBThread::GetNumFrames ()
46030fdc8d8SChris Lattner {
461ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
462ceb6b139SCaroline Tice 
463ceb6b139SCaroline Tice     uint32_t num_frames = 0;
4646611103cSGreg Clayton     if (m_opaque_sp)
465ceb6b139SCaroline Tice         num_frames = m_opaque_sp->GetStackFrameCount();
466ceb6b139SCaroline Tice 
467ceb6b139SCaroline Tice     if (log)
4684838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetNumFrames () => %u", m_opaque_sp.get(), num_frames);
469ceb6b139SCaroline Tice 
470ceb6b139SCaroline Tice     return num_frames;
47130fdc8d8SChris Lattner }
47230fdc8d8SChris Lattner 
47330fdc8d8SChris Lattner SBFrame
47430fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
47530fdc8d8SChris Lattner {
476ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
477ceb6b139SCaroline Tice 
47830fdc8d8SChris Lattner     SBFrame sb_frame;
4796611103cSGreg Clayton     if (m_opaque_sp)
4806611103cSGreg Clayton         sb_frame.SetFrame (m_opaque_sp->GetStackFrameAtIndex (idx));
481ceb6b139SCaroline Tice 
482ceb6b139SCaroline Tice     if (log)
483ceb6b139SCaroline Tice     {
484ceb6b139SCaroline Tice         SBStream sstr;
485ceb6b139SCaroline Tice         sb_frame.GetDescription (sstr);
4864838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
487750cd175SCaroline Tice                      m_opaque_sp.get(), idx, sb_frame.get(), sstr.GetData());
488ceb6b139SCaroline Tice     }
489ceb6b139SCaroline Tice 
49030fdc8d8SChris Lattner     return sb_frame;
49130fdc8d8SChris Lattner }
49230fdc8d8SChris Lattner 
49330fdc8d8SChris Lattner const lldb::SBThread &
494*92ef5735SGreg Clayton SBThread::operator = (const SBThread &rhs)
49530fdc8d8SChris Lattner {
4964838131bSGreg Clayton     if (this != &rhs)
4976611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
49830fdc8d8SChris Lattner     return *this;
49930fdc8d8SChris Lattner }
50030fdc8d8SChris Lattner 
50130fdc8d8SChris Lattner bool
50230fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
50330fdc8d8SChris Lattner {
5046611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
50530fdc8d8SChris Lattner }
50630fdc8d8SChris Lattner 
50730fdc8d8SChris Lattner bool
50830fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
50930fdc8d8SChris Lattner {
5106611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
51130fdc8d8SChris Lattner }
51230fdc8d8SChris Lattner 
51330fdc8d8SChris Lattner lldb_private::Thread *
5144838131bSGreg Clayton SBThread::get ()
51530fdc8d8SChris Lattner {
5166611103cSGreg Clayton     return m_opaque_sp.get();
51730fdc8d8SChris Lattner }
51830fdc8d8SChris Lattner 
51930fdc8d8SChris Lattner const lldb_private::Thread *
52030fdc8d8SChris Lattner SBThread::operator->() const
52130fdc8d8SChris Lattner {
5226611103cSGreg Clayton     return m_opaque_sp.get();
52330fdc8d8SChris Lattner }
52430fdc8d8SChris Lattner 
52530fdc8d8SChris Lattner const lldb_private::Thread &
52630fdc8d8SChris Lattner SBThread::operator*() const
52730fdc8d8SChris Lattner {
5286611103cSGreg Clayton     return *m_opaque_sp;
52930fdc8d8SChris Lattner }
53030fdc8d8SChris Lattner 
53130fdc8d8SChris Lattner lldb_private::Thread *
53230fdc8d8SChris Lattner SBThread::operator->()
53330fdc8d8SChris Lattner {
5346611103cSGreg Clayton     return m_opaque_sp.get();
53530fdc8d8SChris Lattner }
53630fdc8d8SChris Lattner 
53730fdc8d8SChris Lattner lldb_private::Thread &
53830fdc8d8SChris Lattner SBThread::operator*()
53930fdc8d8SChris Lattner {
5406611103cSGreg Clayton     return *m_opaque_sp;
54130fdc8d8SChris Lattner }
542dde9cff3SCaroline Tice 
543dde9cff3SCaroline Tice bool
544ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
545ceb6b139SCaroline Tice {
546ceb6b139SCaroline Tice     if (m_opaque_sp)
547ceb6b139SCaroline Tice     {
548ceb6b139SCaroline Tice         StreamString strm;
549ceb6b139SCaroline Tice         description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID());
550ceb6b139SCaroline Tice     }
551ceb6b139SCaroline Tice     else
552ceb6b139SCaroline Tice         description.Printf ("No value");
553ceb6b139SCaroline Tice 
554ceb6b139SCaroline Tice     return true;
555ceb6b139SCaroline Tice }
556