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 
5430fdc8d8SChris Lattner SBThread::SBThread (const SBThread &rhs)
5530fdc8d8SChris Lattner {
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner //----------------------------------------------------------------------
5930fdc8d8SChris Lattner // Destructor
6030fdc8d8SChris Lattner //----------------------------------------------------------------------
6130fdc8d8SChris Lattner SBThread::~SBThread()
6230fdc8d8SChris Lattner {
6330fdc8d8SChris Lattner }
6430fdc8d8SChris Lattner 
6530fdc8d8SChris Lattner bool
6630fdc8d8SChris Lattner SBThread::IsValid() const
6730fdc8d8SChris Lattner {
686611103cSGreg Clayton     return m_opaque_sp != NULL;
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7148e42549SGreg Clayton void
7248e42549SGreg Clayton SBThread::Clear ()
7348e42549SGreg Clayton {
7448e42549SGreg Clayton     m_opaque_sp.reset();
7548e42549SGreg Clayton }
7648e42549SGreg Clayton 
7748e42549SGreg Clayton 
7830fdc8d8SChris Lattner StopReason
7930fdc8d8SChris Lattner SBThread::GetStopReason()
8030fdc8d8SChris Lattner {
81ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
82ceb6b139SCaroline Tice 
83ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
846611103cSGreg Clayton     if (m_opaque_sp)
8530fdc8d8SChris Lattner     {
86b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
87b15bfc75SJim Ingham         if (stop_info_sp)
88ceb6b139SCaroline Tice             reason =  stop_info_sp->GetStopReason();
8930fdc8d8SChris Lattner     }
90ceb6b139SCaroline Tice 
91ceb6b139SCaroline Tice     if (log)
92*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetStopReason () => %s", m_opaque_sp.get(),
93750cd175SCaroline Tice                      Thread::StopReasonAsCString (reason));
94ceb6b139SCaroline Tice 
95ceb6b139SCaroline Tice     return reason;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner size_t
9930fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
10030fdc8d8SChris Lattner {
101ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
102ceb6b139SCaroline Tice 
1036611103cSGreg Clayton     if (m_opaque_sp)
10430fdc8d8SChris Lattner     {
105b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
106b15bfc75SJim Ingham         if (stop_info_sp)
10730fdc8d8SChris Lattner         {
108b15bfc75SJim Ingham             const char *stop_desc = stop_info_sp->GetDescription();
10930fdc8d8SChris Lattner             if (stop_desc)
11030fdc8d8SChris Lattner             {
111ceb6b139SCaroline Tice                 if (log)
112*4838131bSGreg Clayton                     log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
113750cd175SCaroline Tice                                  m_opaque_sp.get(), stop_desc);
11430fdc8d8SChris Lattner                 if (dst)
11530fdc8d8SChris Lattner                     return ::snprintf (dst, dst_len, "%s", stop_desc);
11630fdc8d8SChris Lattner                 else
11730fdc8d8SChris Lattner                 {
11830fdc8d8SChris Lattner                     // NULL dst passed in, return the length needed to contain the description
11930fdc8d8SChris Lattner                     return ::strlen (stop_desc) + 1; // Include the NULL byte for size
12030fdc8d8SChris Lattner                 }
12130fdc8d8SChris Lattner             }
12230fdc8d8SChris Lattner             else
12330fdc8d8SChris Lattner             {
12430fdc8d8SChris Lattner                 size_t stop_desc_len = 0;
125b15bfc75SJim Ingham                 switch (stop_info_sp->GetStopReason())
12630fdc8d8SChris Lattner                 {
12730fdc8d8SChris Lattner                 case eStopReasonTrace:
12830fdc8d8SChris Lattner                 case eStopReasonPlanComplete:
12930fdc8d8SChris Lattner                     {
13030fdc8d8SChris Lattner                         static char trace_desc[] = "step";
13130fdc8d8SChris Lattner                         stop_desc = trace_desc;
13230fdc8d8SChris Lattner                         stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
13330fdc8d8SChris Lattner                     }
13430fdc8d8SChris Lattner                     break;
13530fdc8d8SChris Lattner 
13630fdc8d8SChris Lattner                 case eStopReasonBreakpoint:
13730fdc8d8SChris Lattner                     {
13830fdc8d8SChris Lattner                         static char bp_desc[] = "breakpoint hit";
13930fdc8d8SChris Lattner                         stop_desc = bp_desc;
14030fdc8d8SChris Lattner                         stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
14130fdc8d8SChris Lattner                     }
14230fdc8d8SChris Lattner                     break;
14330fdc8d8SChris Lattner 
14430fdc8d8SChris Lattner                 case eStopReasonWatchpoint:
14530fdc8d8SChris Lattner                     {
14630fdc8d8SChris Lattner                         static char wp_desc[] = "watchpoint hit";
14730fdc8d8SChris Lattner                         stop_desc = wp_desc;
14830fdc8d8SChris Lattner                         stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
14930fdc8d8SChris Lattner                     }
15030fdc8d8SChris Lattner                     break;
15130fdc8d8SChris Lattner 
15230fdc8d8SChris Lattner                 case eStopReasonSignal:
15330fdc8d8SChris Lattner                     {
154b15bfc75SJim Ingham                         stop_desc = m_opaque_sp->GetProcess().GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
15530fdc8d8SChris Lattner                         if (stop_desc == NULL || stop_desc[0] == '\0')
15630fdc8d8SChris Lattner                         {
15730fdc8d8SChris Lattner                             static char signal_desc[] = "signal";
15830fdc8d8SChris Lattner                             stop_desc = signal_desc;
15930fdc8d8SChris Lattner                             stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
16030fdc8d8SChris Lattner                         }
16130fdc8d8SChris Lattner                     }
16230fdc8d8SChris Lattner                     break;
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner                 case eStopReasonException:
16530fdc8d8SChris Lattner                     {
16630fdc8d8SChris Lattner                         char exc_desc[] = "exception";
16730fdc8d8SChris Lattner                         stop_desc = exc_desc;
16830fdc8d8SChris Lattner                         stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
16930fdc8d8SChris Lattner                     }
17030fdc8d8SChris Lattner                     break;
171c982c768SGreg Clayton 
172c982c768SGreg Clayton                 default:
173c982c768SGreg Clayton                     break;
17430fdc8d8SChris Lattner                 }
17530fdc8d8SChris Lattner 
17630fdc8d8SChris Lattner                 if (stop_desc && stop_desc[0])
17730fdc8d8SChris Lattner                 {
178ceb6b139SCaroline Tice                     if (log)
17993aa84e8SGreg Clayton                         log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
180750cd175SCaroline Tice                                      m_opaque_sp.get(), stop_desc);
181ceb6b139SCaroline Tice 
18230fdc8d8SChris Lattner                     if (dst)
18330fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner                     if (stop_desc_len == 0)
18630fdc8d8SChris Lattner                         stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
18730fdc8d8SChris Lattner 
18830fdc8d8SChris Lattner                     return stop_desc_len;
18930fdc8d8SChris Lattner                 }
19030fdc8d8SChris Lattner             }
19130fdc8d8SChris Lattner         }
19230fdc8d8SChris Lattner     }
19330fdc8d8SChris Lattner     if (dst)
19430fdc8d8SChris Lattner         *dst = 0;
19530fdc8d8SChris Lattner     return 0;
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner void
19930fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
20030fdc8d8SChris Lattner {
2016611103cSGreg Clayton     m_opaque_sp = lldb_object_sp;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner 
20530fdc8d8SChris Lattner lldb::tid_t
20630fdc8d8SChris Lattner SBThread::GetThreadID () const
20730fdc8d8SChris Lattner {
208ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
209ceb6b139SCaroline Tice 
210ceb6b139SCaroline Tice     lldb::tid_t id = LLDB_INVALID_THREAD_ID;
2116611103cSGreg Clayton     if (m_opaque_sp)
212ceb6b139SCaroline Tice         id = m_opaque_sp->GetID();
213ceb6b139SCaroline Tice 
214ceb6b139SCaroline Tice     if (log)
215*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetThreadID () => 0x%4.4x", m_opaque_sp.get(), id);
216ceb6b139SCaroline Tice 
217ceb6b139SCaroline Tice     return id;
21830fdc8d8SChris Lattner }
21930fdc8d8SChris Lattner 
22030fdc8d8SChris Lattner uint32_t
22130fdc8d8SChris Lattner SBThread::GetIndexID () const
22230fdc8d8SChris Lattner {
2236611103cSGreg Clayton     if (m_opaque_sp)
2246611103cSGreg Clayton         return m_opaque_sp->GetIndexID();
22530fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
22630fdc8d8SChris Lattner }
22730fdc8d8SChris Lattner const char *
22830fdc8d8SChris Lattner SBThread::GetName () const
22930fdc8d8SChris Lattner {
230*4838131bSGreg Clayton     const char *name = NULL;
2316611103cSGreg Clayton     if (m_opaque_sp)
232*4838131bSGreg Clayton         name = m_opaque_sp->GetName();
233ceb6b139SCaroline Tice 
234*4838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
235ceb6b139SCaroline Tice     if (log)
236*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetName () => %s", m_opaque_sp.get(), name ? name : "NULL");
237ceb6b139SCaroline Tice 
238*4838131bSGreg Clayton     return name;
23930fdc8d8SChris Lattner }
24030fdc8d8SChris Lattner 
24130fdc8d8SChris Lattner const char *
24230fdc8d8SChris Lattner SBThread::GetQueueName () const
24330fdc8d8SChris Lattner {
244*4838131bSGreg Clayton     const char *name = NULL;
2456611103cSGreg Clayton     if (m_opaque_sp)
246*4838131bSGreg Clayton         name = m_opaque_sp->GetQueueName();
247ceb6b139SCaroline Tice 
248*4838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
249ceb6b139SCaroline Tice     if (log)
250*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetQueueName () => %s", m_opaque_sp.get(), name ? name : "NULL");
251ceb6b139SCaroline Tice 
252*4838131bSGreg Clayton     return name;
25330fdc8d8SChris Lattner }
25430fdc8d8SChris Lattner 
25530fdc8d8SChris Lattner 
25630fdc8d8SChris Lattner void
25730fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
25830fdc8d8SChris Lattner {
259ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
260ceb6b139SCaroline Tice 
261ceb6b139SCaroline Tice     if (log)
26293aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", m_opaque_sp.get(),
263ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
264ceb6b139SCaroline Tice 
2656611103cSGreg Clayton     if (m_opaque_sp)
26630fdc8d8SChris Lattner     {
26730fdc8d8SChris Lattner         bool abort_other_plans = true;
2686611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
26930fdc8d8SChris Lattner 
27030fdc8d8SChris Lattner         if (frame_sp)
27130fdc8d8SChris Lattner         {
27230fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
27330fdc8d8SChris Lattner             {
27430fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
2756611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
27630fdc8d8SChris Lattner                                                           eStepTypeOver,
27730fdc8d8SChris Lattner                                                           sc.line_entry.range,
27830fdc8d8SChris Lattner                                                           sc,
279474966a4SGreg Clayton                                                           stop_other_threads,
280474966a4SGreg Clayton                                                           false);
28130fdc8d8SChris Lattner 
28230fdc8d8SChris Lattner             }
28330fdc8d8SChris Lattner             else
28430fdc8d8SChris Lattner             {
2856611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepSingleInstruction (true,
28630fdc8d8SChris Lattner                                                                       abort_other_plans,
28730fdc8d8SChris Lattner                                                                       stop_other_threads);
28830fdc8d8SChris Lattner             }
28930fdc8d8SChris Lattner         }
29030fdc8d8SChris Lattner 
2916611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
29230fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
2932976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
2945d5028b5SGreg Clayton         Error error (process.Resume());
2955d5028b5SGreg Clayton         if (error.Success())
2965d5028b5SGreg Clayton         {
2975d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
2985d5028b5SGreg Clayton             // process to stop yet again!
2995d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3005d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3015d5028b5SGreg Clayton         }
30230fdc8d8SChris Lattner     }
30330fdc8d8SChris Lattner }
30430fdc8d8SChris Lattner 
30530fdc8d8SChris Lattner void
30630fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
30730fdc8d8SChris Lattner {
308ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
309ceb6b139SCaroline Tice 
310ceb6b139SCaroline Tice     if (log)
31193aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInto (stop_other_threads='%s')", m_opaque_sp.get(),
312ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
313ceb6b139SCaroline Tice 
3146611103cSGreg Clayton     if (m_opaque_sp)
31530fdc8d8SChris Lattner     {
31630fdc8d8SChris Lattner         bool abort_other_plans = true;
31730fdc8d8SChris Lattner 
3186611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
31930fdc8d8SChris Lattner 
32030fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
32130fdc8d8SChris Lattner         {
322474966a4SGreg Clayton             bool avoid_code_without_debug_info = true;
32330fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
3246611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
32530fdc8d8SChris Lattner                                                       eStepTypeInto,
32630fdc8d8SChris Lattner                                                       sc.line_entry.range,
32730fdc8d8SChris Lattner                                                       sc,
328474966a4SGreg Clayton                                                       stop_other_threads,
329474966a4SGreg Clayton                                                       avoid_code_without_debug_info);
33030fdc8d8SChris Lattner         }
33130fdc8d8SChris Lattner         else
33230fdc8d8SChris Lattner         {
3336611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepSingleInstruction (false,
33430fdc8d8SChris Lattner                                                                   abort_other_plans,
33530fdc8d8SChris Lattner                                                                   stop_other_threads);
33630fdc8d8SChris Lattner         }
33730fdc8d8SChris Lattner 
3386611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
33930fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
3402976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3415d5028b5SGreg Clayton         Error error (process.Resume());
3425d5028b5SGreg Clayton         if (error.Success())
3435d5028b5SGreg Clayton         {
3445d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3455d5028b5SGreg Clayton             // process to stop yet again!
3465d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3475d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3485d5028b5SGreg Clayton         }
34930fdc8d8SChris Lattner     }
35030fdc8d8SChris Lattner }
35130fdc8d8SChris Lattner 
35230fdc8d8SChris Lattner void
35330fdc8d8SChris Lattner SBThread::StepOut ()
35430fdc8d8SChris Lattner {
355ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
356ceb6b139SCaroline Tice 
357ceb6b139SCaroline Tice     if (log)
358*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::StepOut ()", m_opaque_sp.get());
359ceb6b139SCaroline Tice 
3606611103cSGreg Clayton     if (m_opaque_sp)
36130fdc8d8SChris Lattner     {
36230fdc8d8SChris Lattner         bool abort_other_plans = true;
36330fdc8d8SChris Lattner         bool stop_other_threads = true;
36430fdc8d8SChris Lattner 
3656611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, stop_other_threads, eVoteYes, eVoteNoOpinion);
36630fdc8d8SChris Lattner 
3676611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
3682976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3695d5028b5SGreg Clayton         Error error (process.Resume());
3705d5028b5SGreg Clayton         if (error.Success())
3715d5028b5SGreg Clayton         {
3725d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3735d5028b5SGreg Clayton             // process to stop yet again!
3745d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3755d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3765d5028b5SGreg Clayton         }
37730fdc8d8SChris Lattner     }
37830fdc8d8SChris Lattner }
37930fdc8d8SChris Lattner 
38030fdc8d8SChris Lattner void
38130fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
38230fdc8d8SChris Lattner {
383ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
384ceb6b139SCaroline Tice 
385ceb6b139SCaroline Tice     if (log)
38693aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", m_opaque_sp.get(), step_over);
387ceb6b139SCaroline Tice 
3886611103cSGreg Clayton     if (m_opaque_sp)
38930fdc8d8SChris Lattner     {
3906611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepSingleInstruction (step_over, true, true);
3916611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
3922976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3935d5028b5SGreg Clayton         Error error (process.Resume());
3945d5028b5SGreg Clayton         if (error.Success())
3955d5028b5SGreg Clayton         {
3965d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3975d5028b5SGreg Clayton             // process to stop yet again!
3985d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3995d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4005d5028b5SGreg Clayton         }
40130fdc8d8SChris Lattner     }
40230fdc8d8SChris Lattner }
40330fdc8d8SChris Lattner 
40430fdc8d8SChris Lattner void
40530fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
40630fdc8d8SChris Lattner {
407ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
408ceb6b139SCaroline Tice 
409ceb6b139SCaroline Tice     if (log)
41093aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::RunToAddress (addr=0x%llx)", m_opaque_sp.get(), addr);
411ceb6b139SCaroline Tice 
4126611103cSGreg Clayton     if (m_opaque_sp)
41330fdc8d8SChris Lattner     {
41430fdc8d8SChris Lattner         bool abort_other_plans = true;
41530fdc8d8SChris Lattner         bool stop_other_threads = true;
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner         Address target_addr (NULL, addr);
41830fdc8d8SChris Lattner 
4196611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads);
4206611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
4212976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4225d5028b5SGreg Clayton         Error error (process.Resume());
4235d5028b5SGreg Clayton         if (error.Success())
4245d5028b5SGreg Clayton         {
4255d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4265d5028b5SGreg Clayton             // process to stop yet again!
4275d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4285d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4295d5028b5SGreg Clayton         }
43030fdc8d8SChris Lattner     }
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner }
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner SBProcess
43530fdc8d8SChris Lattner SBThread::GetProcess ()
43630fdc8d8SChris Lattner {
437ceb6b139SCaroline Tice 
43830fdc8d8SChris Lattner     SBProcess process;
4396611103cSGreg Clayton     if (m_opaque_sp)
44030fdc8d8SChris Lattner     {
44130fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
4426611103cSGreg Clayton         process.SetProcess(m_opaque_sp->GetProcess().GetTarget().GetProcessSP());
44330fdc8d8SChris Lattner     }
444ceb6b139SCaroline Tice 
44520ad3c40SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
446ceb6b139SCaroline Tice     if (log)
447ceb6b139SCaroline Tice     {
448ceb6b139SCaroline Tice         SBStream sstr;
449ceb6b139SCaroline Tice         process.GetDescription (sstr);
450*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
451750cd175SCaroline Tice                      process.get(), sstr.GetData());
452ceb6b139SCaroline Tice     }
453ceb6b139SCaroline Tice 
45430fdc8d8SChris Lattner     return process;
45530fdc8d8SChris Lattner }
45630fdc8d8SChris Lattner 
45730fdc8d8SChris Lattner uint32_t
45830fdc8d8SChris Lattner SBThread::GetNumFrames ()
45930fdc8d8SChris Lattner {
460ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
461ceb6b139SCaroline Tice 
462ceb6b139SCaroline Tice     uint32_t num_frames = 0;
4636611103cSGreg Clayton     if (m_opaque_sp)
464ceb6b139SCaroline Tice         num_frames = m_opaque_sp->GetStackFrameCount();
465ceb6b139SCaroline Tice 
466ceb6b139SCaroline Tice     if (log)
467*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetNumFrames () => %u", m_opaque_sp.get(), num_frames);
468ceb6b139SCaroline Tice 
469ceb6b139SCaroline Tice     return num_frames;
47030fdc8d8SChris Lattner }
47130fdc8d8SChris Lattner 
47230fdc8d8SChris Lattner SBFrame
47330fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
47430fdc8d8SChris Lattner {
475ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
476ceb6b139SCaroline Tice 
47730fdc8d8SChris Lattner     SBFrame sb_frame;
4786611103cSGreg Clayton     if (m_opaque_sp)
4796611103cSGreg Clayton         sb_frame.SetFrame (m_opaque_sp->GetStackFrameAtIndex (idx));
480ceb6b139SCaroline Tice 
481ceb6b139SCaroline Tice     if (log)
482ceb6b139SCaroline Tice     {
483ceb6b139SCaroline Tice         SBStream sstr;
484ceb6b139SCaroline Tice         sb_frame.GetDescription (sstr);
485*4838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
486750cd175SCaroline Tice                      m_opaque_sp.get(), idx, sb_frame.get(), sstr.GetData());
487ceb6b139SCaroline Tice     }
488ceb6b139SCaroline Tice 
48930fdc8d8SChris Lattner     return sb_frame;
49030fdc8d8SChris Lattner }
49130fdc8d8SChris Lattner 
49230fdc8d8SChris Lattner const lldb::SBThread &
49330fdc8d8SChris Lattner SBThread::operator = (const lldb::SBThread &rhs)
49430fdc8d8SChris Lattner {
495*4838131bSGreg Clayton     if (this != &rhs)
4966611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
49730fdc8d8SChris Lattner     return *this;
49830fdc8d8SChris Lattner }
49930fdc8d8SChris Lattner 
50030fdc8d8SChris Lattner bool
50130fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
50230fdc8d8SChris Lattner {
5036611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
50430fdc8d8SChris Lattner }
50530fdc8d8SChris Lattner 
50630fdc8d8SChris Lattner bool
50730fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
50830fdc8d8SChris Lattner {
5096611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
51030fdc8d8SChris Lattner }
51130fdc8d8SChris Lattner 
51230fdc8d8SChris Lattner lldb_private::Thread *
513*4838131bSGreg Clayton SBThread::get ()
51430fdc8d8SChris Lattner {
5156611103cSGreg Clayton     return m_opaque_sp.get();
51630fdc8d8SChris Lattner }
51730fdc8d8SChris Lattner 
51830fdc8d8SChris Lattner const lldb_private::Thread *
51930fdc8d8SChris Lattner SBThread::operator->() const
52030fdc8d8SChris Lattner {
5216611103cSGreg Clayton     return m_opaque_sp.get();
52230fdc8d8SChris Lattner }
52330fdc8d8SChris Lattner 
52430fdc8d8SChris Lattner const lldb_private::Thread &
52530fdc8d8SChris Lattner SBThread::operator*() const
52630fdc8d8SChris Lattner {
5276611103cSGreg Clayton     return *m_opaque_sp;
52830fdc8d8SChris Lattner }
52930fdc8d8SChris Lattner 
53030fdc8d8SChris Lattner lldb_private::Thread *
53130fdc8d8SChris Lattner SBThread::operator->()
53230fdc8d8SChris Lattner {
5336611103cSGreg Clayton     return m_opaque_sp.get();
53430fdc8d8SChris Lattner }
53530fdc8d8SChris Lattner 
53630fdc8d8SChris Lattner lldb_private::Thread &
53730fdc8d8SChris Lattner SBThread::operator*()
53830fdc8d8SChris Lattner {
5396611103cSGreg Clayton     return *m_opaque_sp;
54030fdc8d8SChris Lattner }
541dde9cff3SCaroline Tice 
542dde9cff3SCaroline Tice bool
543ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
544ceb6b139SCaroline Tice {
545ceb6b139SCaroline Tice     if (m_opaque_sp)
546ceb6b139SCaroline Tice     {
547ceb6b139SCaroline Tice         StreamString strm;
548ceb6b139SCaroline Tice         description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID());
549ceb6b139SCaroline Tice     }
550ceb6b139SCaroline Tice     else
551ceb6b139SCaroline Tice         description.Printf ("No value");
552ceb6b139SCaroline Tice 
553ceb6b139SCaroline Tice     return true;
554ceb6b139SCaroline Tice }
555