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 {
44*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
45*ceb6b139SCaroline Tice 
46*ceb6b139SCaroline Tice     if (log)
47*ceb6b139SCaroline Tice         log->Printf ("SBThread::SBThread () ==> this = %p", this);
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner //----------------------------------------------------------------------
5130fdc8d8SChris Lattner // Thread constructor
5230fdc8d8SChris Lattner //----------------------------------------------------------------------
5330fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) :
546611103cSGreg Clayton     m_opaque_sp (lldb_object_sp)
5530fdc8d8SChris Lattner {
56*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
57*ceb6b139SCaroline Tice 
58*ceb6b139SCaroline Tice     if (log)
59*ceb6b139SCaroline Tice         log->Printf ("SBThread::SBThread (const ThreadSP &lldb_object_sp) lldb_object_sp.get() = %p ==> this = %p",
60*ceb6b139SCaroline Tice                      lldb_object_sp.get(), this);
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner SBThread::SBThread (const SBThread &rhs)
6430fdc8d8SChris Lattner {
65*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
66*ceb6b139SCaroline Tice 
67*ceb6b139SCaroline Tice     if (log)
68*ceb6b139SCaroline Tice         log->Printf ("SBThread::SBThread (const SBThread &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p",
69*ceb6b139SCaroline Tice                      rhs.m_opaque_sp.get(), this);
70*ceb6b139SCaroline Tice 
716611103cSGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
7430fdc8d8SChris Lattner //----------------------------------------------------------------------
7530fdc8d8SChris Lattner // Destructor
7630fdc8d8SChris Lattner //----------------------------------------------------------------------
7730fdc8d8SChris Lattner SBThread::~SBThread()
7830fdc8d8SChris Lattner {
7930fdc8d8SChris Lattner }
8030fdc8d8SChris Lattner 
8130fdc8d8SChris Lattner bool
8230fdc8d8SChris Lattner SBThread::IsValid() const
8330fdc8d8SChris Lattner {
846611103cSGreg Clayton     return m_opaque_sp != NULL;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8748e42549SGreg Clayton void
8848e42549SGreg Clayton SBThread::Clear ()
8948e42549SGreg Clayton {
9048e42549SGreg Clayton     m_opaque_sp.reset();
9148e42549SGreg Clayton }
9248e42549SGreg Clayton 
9348e42549SGreg Clayton 
9430fdc8d8SChris Lattner StopReason
9530fdc8d8SChris Lattner SBThread::GetStopReason()
9630fdc8d8SChris Lattner {
97*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
98*ceb6b139SCaroline Tice 
99*ceb6b139SCaroline Tice     if (log)
100*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetStopReason ()");
101*ceb6b139SCaroline Tice 
102*ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
1036611103cSGreg Clayton     if (m_opaque_sp)
10430fdc8d8SChris Lattner     {
105b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
106b15bfc75SJim Ingham         if (stop_info_sp)
107*ceb6b139SCaroline Tice             reason =  stop_info_sp->GetStopReason();
10830fdc8d8SChris Lattner     }
109*ceb6b139SCaroline Tice 
110*ceb6b139SCaroline Tice     if (log)
111*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetStopReason ==> %s", Thread::StopReasonAsCString (reason));
112*ceb6b139SCaroline Tice 
113*ceb6b139SCaroline Tice     return reason;
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
11630fdc8d8SChris Lattner size_t
11730fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
11830fdc8d8SChris Lattner {
119*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
120*ceb6b139SCaroline Tice 
121*ceb6b139SCaroline Tice     if (log)
122*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetStopDescription (char *dst, size_t dst_len)");
123*ceb6b139SCaroline Tice 
1246611103cSGreg Clayton     if (m_opaque_sp)
12530fdc8d8SChris Lattner     {
126b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
127b15bfc75SJim Ingham         if (stop_info_sp)
12830fdc8d8SChris Lattner         {
129b15bfc75SJim Ingham             const char *stop_desc = stop_info_sp->GetDescription();
13030fdc8d8SChris Lattner             if (stop_desc)
13130fdc8d8SChris Lattner             {
132*ceb6b139SCaroline Tice                 if (log)
133*ceb6b139SCaroline Tice                     log->Printf ("SBThread::GetStopDescription ==> %s", stop_desc);
13430fdc8d8SChris Lattner                 if (dst)
13530fdc8d8SChris Lattner                     return ::snprintf (dst, dst_len, "%s", stop_desc);
13630fdc8d8SChris Lattner                 else
13730fdc8d8SChris Lattner                 {
13830fdc8d8SChris Lattner                     // NULL dst passed in, return the length needed to contain the description
13930fdc8d8SChris Lattner                     return ::strlen (stop_desc) + 1; // Include the NULL byte for size
14030fdc8d8SChris Lattner                 }
14130fdc8d8SChris Lattner             }
14230fdc8d8SChris Lattner             else
14330fdc8d8SChris Lattner             {
14430fdc8d8SChris Lattner                 size_t stop_desc_len = 0;
145b15bfc75SJim Ingham                 switch (stop_info_sp->GetStopReason())
14630fdc8d8SChris Lattner                 {
14730fdc8d8SChris Lattner                 case eStopReasonTrace:
14830fdc8d8SChris Lattner                 case eStopReasonPlanComplete:
14930fdc8d8SChris Lattner                     {
15030fdc8d8SChris Lattner                         static char trace_desc[] = "step";
15130fdc8d8SChris Lattner                         stop_desc = trace_desc;
15230fdc8d8SChris Lattner                         stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
15330fdc8d8SChris Lattner                     }
15430fdc8d8SChris Lattner                     break;
15530fdc8d8SChris Lattner 
15630fdc8d8SChris Lattner                 case eStopReasonBreakpoint:
15730fdc8d8SChris Lattner                     {
15830fdc8d8SChris Lattner                         static char bp_desc[] = "breakpoint hit";
15930fdc8d8SChris Lattner                         stop_desc = bp_desc;
16030fdc8d8SChris Lattner                         stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
16130fdc8d8SChris Lattner                     }
16230fdc8d8SChris Lattner                     break;
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner                 case eStopReasonWatchpoint:
16530fdc8d8SChris Lattner                     {
16630fdc8d8SChris Lattner                         static char wp_desc[] = "watchpoint hit";
16730fdc8d8SChris Lattner                         stop_desc = wp_desc;
16830fdc8d8SChris Lattner                         stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
16930fdc8d8SChris Lattner                     }
17030fdc8d8SChris Lattner                     break;
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner                 case eStopReasonSignal:
17330fdc8d8SChris Lattner                     {
174b15bfc75SJim Ingham                         stop_desc = m_opaque_sp->GetProcess().GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
17530fdc8d8SChris Lattner                         if (stop_desc == NULL || stop_desc[0] == '\0')
17630fdc8d8SChris Lattner                         {
17730fdc8d8SChris Lattner                             static char signal_desc[] = "signal";
17830fdc8d8SChris Lattner                             stop_desc = signal_desc;
17930fdc8d8SChris Lattner                             stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
18030fdc8d8SChris Lattner                         }
18130fdc8d8SChris Lattner                     }
18230fdc8d8SChris Lattner                     break;
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner                 case eStopReasonException:
18530fdc8d8SChris Lattner                     {
18630fdc8d8SChris Lattner                         char exc_desc[] = "exception";
18730fdc8d8SChris Lattner                         stop_desc = exc_desc;
18830fdc8d8SChris Lattner                         stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
18930fdc8d8SChris Lattner                     }
19030fdc8d8SChris Lattner                     break;
191c982c768SGreg Clayton 
192c982c768SGreg Clayton                 default:
193c982c768SGreg Clayton                     break;
19430fdc8d8SChris Lattner                 }
19530fdc8d8SChris Lattner 
19630fdc8d8SChris Lattner                 if (stop_desc && stop_desc[0])
19730fdc8d8SChris Lattner                 {
198*ceb6b139SCaroline Tice                     if (log)
199*ceb6b139SCaroline Tice                         log->Printf ("SBThread::GetStopDescription ==> %s", stop_desc);
200*ceb6b139SCaroline Tice 
20130fdc8d8SChris Lattner                     if (dst)
20230fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner                     if (stop_desc_len == 0)
20530fdc8d8SChris Lattner                         stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
20630fdc8d8SChris Lattner 
20730fdc8d8SChris Lattner                     return stop_desc_len;
20830fdc8d8SChris Lattner                 }
20930fdc8d8SChris Lattner             }
21030fdc8d8SChris Lattner         }
21130fdc8d8SChris Lattner     }
21230fdc8d8SChris Lattner     if (dst)
21330fdc8d8SChris Lattner         *dst = 0;
21430fdc8d8SChris Lattner     return 0;
21530fdc8d8SChris Lattner }
21630fdc8d8SChris Lattner 
21730fdc8d8SChris Lattner void
21830fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
21930fdc8d8SChris Lattner {
2206611103cSGreg Clayton     m_opaque_sp = lldb_object_sp;
22130fdc8d8SChris Lattner }
22230fdc8d8SChris Lattner 
22330fdc8d8SChris Lattner 
22430fdc8d8SChris Lattner lldb::tid_t
22530fdc8d8SChris Lattner SBThread::GetThreadID () const
22630fdc8d8SChris Lattner {
227*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
228*ceb6b139SCaroline Tice 
229*ceb6b139SCaroline Tice     if (log)
230*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetThreadID()");
231*ceb6b139SCaroline Tice 
232*ceb6b139SCaroline Tice     lldb::tid_t id = LLDB_INVALID_THREAD_ID;
2336611103cSGreg Clayton     if (m_opaque_sp)
234*ceb6b139SCaroline Tice         id = m_opaque_sp->GetID();
235*ceb6b139SCaroline Tice 
236*ceb6b139SCaroline Tice     if (log)
237*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetThreadID ==> %d", id);
238*ceb6b139SCaroline Tice 
239*ceb6b139SCaroline Tice     return id;
24030fdc8d8SChris Lattner }
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner uint32_t
24330fdc8d8SChris Lattner SBThread::GetIndexID () const
24430fdc8d8SChris Lattner {
2456611103cSGreg Clayton     if (m_opaque_sp)
2466611103cSGreg Clayton         return m_opaque_sp->GetIndexID();
24730fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
24830fdc8d8SChris Lattner }
24930fdc8d8SChris Lattner const char *
25030fdc8d8SChris Lattner SBThread::GetName () const
25130fdc8d8SChris Lattner {
252*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
253*ceb6b139SCaroline Tice 
254*ceb6b139SCaroline Tice     if (log)
255*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetName ()");
256*ceb6b139SCaroline Tice 
2576611103cSGreg Clayton     if (m_opaque_sp)
258*ceb6b139SCaroline Tice     {
259*ceb6b139SCaroline Tice         if (log)
260*ceb6b139SCaroline Tice             log->Printf ("SBThread::GetName ==> %s", m_opaque_sp->GetName());
2616611103cSGreg Clayton         return m_opaque_sp->GetName();
262*ceb6b139SCaroline Tice     }
263*ceb6b139SCaroline Tice 
264*ceb6b139SCaroline Tice     if (log)
265*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetName ==> NULL");
266*ceb6b139SCaroline Tice 
26730fdc8d8SChris Lattner     return NULL;
26830fdc8d8SChris Lattner }
26930fdc8d8SChris Lattner 
27030fdc8d8SChris Lattner const char *
27130fdc8d8SChris Lattner SBThread::GetQueueName () const
27230fdc8d8SChris Lattner {
273*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
274*ceb6b139SCaroline Tice 
275*ceb6b139SCaroline Tice     if (log)
276*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetQueueName ()");
277*ceb6b139SCaroline Tice 
2786611103cSGreg Clayton     if (m_opaque_sp)
279*ceb6b139SCaroline Tice     {
280*ceb6b139SCaroline Tice         if (log)
281*ceb6b139SCaroline Tice             log->Printf ("SBThread::GetQueueName ==> %s", m_opaque_sp->GetQueueName());
2826611103cSGreg Clayton         return m_opaque_sp->GetQueueName();
283*ceb6b139SCaroline Tice     }
284*ceb6b139SCaroline Tice 
285*ceb6b139SCaroline Tice     if (log)
286*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetQueueName ==> NULL");
287*ceb6b139SCaroline Tice 
28830fdc8d8SChris Lattner     return NULL;
28930fdc8d8SChris Lattner }
29030fdc8d8SChris Lattner 
29130fdc8d8SChris Lattner 
29230fdc8d8SChris Lattner void
29330fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
29430fdc8d8SChris Lattner {
295*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
296*ceb6b139SCaroline Tice 
297*ceb6b139SCaroline Tice     if (log)
298*ceb6b139SCaroline Tice         log->Printf ("SBThread::StepOver (lldb::RunMode stop_other_threads) stop_other_threads = %s)",
299*ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
300*ceb6b139SCaroline Tice 
3016611103cSGreg Clayton     if (m_opaque_sp)
30230fdc8d8SChris Lattner     {
30330fdc8d8SChris Lattner         bool abort_other_plans = true;
3046611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
30530fdc8d8SChris Lattner 
30630fdc8d8SChris Lattner         if (frame_sp)
30730fdc8d8SChris Lattner         {
30830fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
30930fdc8d8SChris Lattner             {
31030fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
3116611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
31230fdc8d8SChris Lattner                                                           eStepTypeOver,
31330fdc8d8SChris Lattner                                                           sc.line_entry.range,
31430fdc8d8SChris Lattner                                                           sc,
315474966a4SGreg Clayton                                                           stop_other_threads,
316474966a4SGreg Clayton                                                           false);
31730fdc8d8SChris Lattner 
31830fdc8d8SChris Lattner             }
31930fdc8d8SChris Lattner             else
32030fdc8d8SChris Lattner             {
3216611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepSingleInstruction (true,
32230fdc8d8SChris Lattner                                                                       abort_other_plans,
32330fdc8d8SChris Lattner                                                                       stop_other_threads);
32430fdc8d8SChris Lattner             }
32530fdc8d8SChris Lattner         }
32630fdc8d8SChris Lattner 
3276611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
32830fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
3292976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3305d5028b5SGreg Clayton         Error error (process.Resume());
3315d5028b5SGreg Clayton         if (error.Success())
3325d5028b5SGreg Clayton         {
3335d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3345d5028b5SGreg Clayton             // process to stop yet again!
3355d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3365d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3375d5028b5SGreg Clayton         }
33830fdc8d8SChris Lattner     }
33930fdc8d8SChris Lattner }
34030fdc8d8SChris Lattner 
34130fdc8d8SChris Lattner void
34230fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
34330fdc8d8SChris Lattner {
344*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
345*ceb6b139SCaroline Tice 
346*ceb6b139SCaroline Tice     if (log)
347*ceb6b139SCaroline Tice         log->Printf ("SBThread::StepInto (lldb::RunMode stop_other_threads) stop_other_threads =%s",
348*ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
349*ceb6b139SCaroline Tice 
3506611103cSGreg Clayton     if (m_opaque_sp)
35130fdc8d8SChris Lattner     {
35230fdc8d8SChris Lattner         bool abort_other_plans = true;
35330fdc8d8SChris Lattner 
3546611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
35530fdc8d8SChris Lattner 
35630fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
35730fdc8d8SChris Lattner         {
358474966a4SGreg Clayton             bool avoid_code_without_debug_info = true;
35930fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
3606611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
36130fdc8d8SChris Lattner                                                       eStepTypeInto,
36230fdc8d8SChris Lattner                                                       sc.line_entry.range,
36330fdc8d8SChris Lattner                                                       sc,
364474966a4SGreg Clayton                                                       stop_other_threads,
365474966a4SGreg Clayton                                                       avoid_code_without_debug_info);
36630fdc8d8SChris Lattner         }
36730fdc8d8SChris Lattner         else
36830fdc8d8SChris Lattner         {
3696611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepSingleInstruction (false,
37030fdc8d8SChris Lattner                                                                   abort_other_plans,
37130fdc8d8SChris Lattner                                                                   stop_other_threads);
37230fdc8d8SChris Lattner         }
37330fdc8d8SChris Lattner 
3746611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
37530fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
3762976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
3775d5028b5SGreg Clayton         Error error (process.Resume());
3785d5028b5SGreg Clayton         if (error.Success())
3795d5028b5SGreg Clayton         {
3805d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
3815d5028b5SGreg Clayton             // process to stop yet again!
3825d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
3835d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
3845d5028b5SGreg Clayton         }
38530fdc8d8SChris Lattner     }
38630fdc8d8SChris Lattner }
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner void
38930fdc8d8SChris Lattner SBThread::StepOut ()
39030fdc8d8SChris Lattner {
391*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
392*ceb6b139SCaroline Tice 
393*ceb6b139SCaroline Tice     if (log)
394*ceb6b139SCaroline Tice         log->Printf ("SBThread::StepOut ()");
395*ceb6b139SCaroline Tice 
3966611103cSGreg Clayton     if (m_opaque_sp)
39730fdc8d8SChris Lattner     {
39830fdc8d8SChris Lattner         bool abort_other_plans = true;
39930fdc8d8SChris Lattner         bool stop_other_threads = true;
40030fdc8d8SChris Lattner 
4016611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, stop_other_threads, eVoteYes, eVoteNoOpinion);
40230fdc8d8SChris Lattner 
4036611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
4042976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4055d5028b5SGreg Clayton         Error error (process.Resume());
4065d5028b5SGreg Clayton         if (error.Success())
4075d5028b5SGreg Clayton         {
4085d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4095d5028b5SGreg Clayton             // process to stop yet again!
4105d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4115d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4125d5028b5SGreg Clayton         }
41330fdc8d8SChris Lattner     }
41430fdc8d8SChris Lattner }
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner void
41730fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
41830fdc8d8SChris Lattner {
419*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
420*ceb6b139SCaroline Tice 
421*ceb6b139SCaroline Tice     if (log)
422*ceb6b139SCaroline Tice         log->Printf ("SBThread::StepInstruction (bool step_over) step_over = %s", (step_over ? "true" : "false"));
423*ceb6b139SCaroline Tice 
4246611103cSGreg Clayton     if (m_opaque_sp)
42530fdc8d8SChris Lattner     {
4266611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepSingleInstruction (step_over, true, true);
4276611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
4282976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4295d5028b5SGreg Clayton         Error error (process.Resume());
4305d5028b5SGreg Clayton         if (error.Success())
4315d5028b5SGreg Clayton         {
4325d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4335d5028b5SGreg Clayton             // process to stop yet again!
4345d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4355d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4365d5028b5SGreg Clayton         }
43730fdc8d8SChris Lattner     }
43830fdc8d8SChris Lattner }
43930fdc8d8SChris Lattner 
44030fdc8d8SChris Lattner void
44130fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
44230fdc8d8SChris Lattner {
443*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
444*ceb6b139SCaroline Tice 
445*ceb6b139SCaroline Tice     if (log)
446*ceb6b139SCaroline Tice         log->Printf ("SBThread::RunToAddress (lldb:;addr_t addr) addr = %p", addr);
447*ceb6b139SCaroline Tice 
4486611103cSGreg Clayton     if (m_opaque_sp)
44930fdc8d8SChris Lattner     {
45030fdc8d8SChris Lattner         bool abort_other_plans = true;
45130fdc8d8SChris Lattner         bool stop_other_threads = true;
45230fdc8d8SChris Lattner 
45330fdc8d8SChris Lattner         Address target_addr (NULL, addr);
45430fdc8d8SChris Lattner 
4556611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads);
4566611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
4572976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4585d5028b5SGreg Clayton         Error error (process.Resume());
4595d5028b5SGreg Clayton         if (error.Success())
4605d5028b5SGreg Clayton         {
4615d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4625d5028b5SGreg Clayton             // process to stop yet again!
4635d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4645d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4655d5028b5SGreg Clayton         }
46630fdc8d8SChris Lattner     }
46730fdc8d8SChris Lattner 
46830fdc8d8SChris Lattner }
46930fdc8d8SChris Lattner 
47030fdc8d8SChris Lattner SBProcess
47130fdc8d8SChris Lattner SBThread::GetProcess ()
47230fdc8d8SChris Lattner {
473*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
474*ceb6b139SCaroline Tice 
475*ceb6b139SCaroline Tice     if (log)
476*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetProcess ()");
477*ceb6b139SCaroline Tice 
47830fdc8d8SChris Lattner     SBProcess process;
4796611103cSGreg Clayton     if (m_opaque_sp)
48030fdc8d8SChris Lattner     {
48130fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
4826611103cSGreg Clayton         process.SetProcess(m_opaque_sp->GetProcess().GetTarget().GetProcessSP());
48330fdc8d8SChris Lattner     }
484*ceb6b139SCaroline Tice 
485*ceb6b139SCaroline Tice     if (log)
486*ceb6b139SCaroline Tice     {
487*ceb6b139SCaroline Tice         SBStream sstr;
488*ceb6b139SCaroline Tice         process.GetDescription (sstr);
489*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetProcess ==> SBProcess (this = %p, '%s')", &process, sstr.GetData());
490*ceb6b139SCaroline Tice     }
491*ceb6b139SCaroline Tice 
49230fdc8d8SChris Lattner     return process;
49330fdc8d8SChris Lattner }
49430fdc8d8SChris Lattner 
49530fdc8d8SChris Lattner uint32_t
49630fdc8d8SChris Lattner SBThread::GetNumFrames ()
49730fdc8d8SChris Lattner {
498*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
499*ceb6b139SCaroline Tice 
500*ceb6b139SCaroline Tice     if (log)
501*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetNumFrames ()");
502*ceb6b139SCaroline Tice 
503*ceb6b139SCaroline Tice     uint32_t num_frames = 0;
5046611103cSGreg Clayton     if (m_opaque_sp)
505*ceb6b139SCaroline Tice         num_frames = m_opaque_sp->GetStackFrameCount();
506*ceb6b139SCaroline Tice 
507*ceb6b139SCaroline Tice     if (log)
508*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetNumFrames ==> %d", num_frames);
509*ceb6b139SCaroline Tice 
510*ceb6b139SCaroline Tice     return num_frames;
51130fdc8d8SChris Lattner }
51230fdc8d8SChris Lattner 
51330fdc8d8SChris Lattner SBFrame
51430fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
51530fdc8d8SChris Lattner {
516*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
517*ceb6b139SCaroline Tice 
518*ceb6b139SCaroline Tice     if (log)
519*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetFrameAtIndex (uint32_t idx) idx = %d", idx);
520*ceb6b139SCaroline Tice 
52130fdc8d8SChris Lattner     SBFrame sb_frame;
5226611103cSGreg Clayton     if (m_opaque_sp)
5236611103cSGreg Clayton         sb_frame.SetFrame (m_opaque_sp->GetStackFrameAtIndex (idx));
524*ceb6b139SCaroline Tice 
525*ceb6b139SCaroline Tice     if (log)
526*ceb6b139SCaroline Tice     {
527*ceb6b139SCaroline Tice         SBStream sstr;
528*ceb6b139SCaroline Tice         sb_frame.GetDescription (sstr);
529*ceb6b139SCaroline Tice         log->Printf ("SBThread::GetFrameAtIndex ==> SBFrame (this = %p, '%s')", &sb_frame, sstr.GetData());
530*ceb6b139SCaroline Tice     }
531*ceb6b139SCaroline Tice 
53230fdc8d8SChris Lattner     return sb_frame;
53330fdc8d8SChris Lattner }
53430fdc8d8SChris Lattner 
53530fdc8d8SChris Lattner const lldb::SBThread &
53630fdc8d8SChris Lattner SBThread::operator = (const lldb::SBThread &rhs)
53730fdc8d8SChris Lattner {
538*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
539*ceb6b139SCaroline Tice 
540*ceb6b139SCaroline Tice     if (log)
541*ceb6b139SCaroline Tice         log->Printf ("SBThread::operator= (const lldb::SBThread &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p",
542*ceb6b139SCaroline Tice                      rhs.m_opaque_sp.get(), this);
543*ceb6b139SCaroline Tice 
5446611103cSGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
54530fdc8d8SChris Lattner     return *this;
54630fdc8d8SChris Lattner }
54730fdc8d8SChris Lattner 
54830fdc8d8SChris Lattner bool
54930fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
55030fdc8d8SChris Lattner {
5516611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
55230fdc8d8SChris Lattner }
55330fdc8d8SChris Lattner 
55430fdc8d8SChris Lattner bool
55530fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
55630fdc8d8SChris Lattner {
5576611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
55830fdc8d8SChris Lattner }
55930fdc8d8SChris Lattner 
56030fdc8d8SChris Lattner lldb_private::Thread *
56130fdc8d8SChris Lattner SBThread::GetLLDBObjectPtr ()
56230fdc8d8SChris Lattner {
5636611103cSGreg Clayton     return m_opaque_sp.get();
56430fdc8d8SChris Lattner }
56530fdc8d8SChris Lattner 
56630fdc8d8SChris Lattner const lldb_private::Thread *
56730fdc8d8SChris Lattner SBThread::operator->() const
56830fdc8d8SChris Lattner {
5696611103cSGreg Clayton     return m_opaque_sp.get();
57030fdc8d8SChris Lattner }
57130fdc8d8SChris Lattner 
57230fdc8d8SChris Lattner const lldb_private::Thread &
57330fdc8d8SChris Lattner SBThread::operator*() const
57430fdc8d8SChris Lattner {
5756611103cSGreg Clayton     return *m_opaque_sp;
57630fdc8d8SChris Lattner }
57730fdc8d8SChris Lattner 
57830fdc8d8SChris Lattner lldb_private::Thread *
57930fdc8d8SChris Lattner SBThread::operator->()
58030fdc8d8SChris Lattner {
5816611103cSGreg Clayton     return m_opaque_sp.get();
58230fdc8d8SChris Lattner }
58330fdc8d8SChris Lattner 
58430fdc8d8SChris Lattner lldb_private::Thread &
58530fdc8d8SChris Lattner SBThread::operator*()
58630fdc8d8SChris Lattner {
5876611103cSGreg Clayton     return *m_opaque_sp;
58830fdc8d8SChris Lattner }
589dde9cff3SCaroline Tice 
590dde9cff3SCaroline Tice bool
591dde9cff3SCaroline Tice SBThread::GetDescription (SBStream &description)
592dde9cff3SCaroline Tice {
593dde9cff3SCaroline Tice     if (m_opaque_sp)
59405faeb71SGreg Clayton     {
59505faeb71SGreg Clayton         StreamString strm;
59605faeb71SGreg Clayton         description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID());
59705faeb71SGreg Clayton     }
598dde9cff3SCaroline Tice     else
599dde9cff3SCaroline Tice         description.Printf ("No value");
600dde9cff3SCaroline Tice 
601dde9cff3SCaroline Tice     return true;
602dde9cff3SCaroline Tice }
603*ceb6b139SCaroline Tice 
604*ceb6b139SCaroline Tice bool
605*ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
606*ceb6b139SCaroline Tice {
607*ceb6b139SCaroline Tice     if (m_opaque_sp)
608*ceb6b139SCaroline Tice     {
609*ceb6b139SCaroline Tice         StreamString strm;
610*ceb6b139SCaroline Tice         description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID());
611*ceb6b139SCaroline Tice     }
612*ceb6b139SCaroline Tice     else
613*ceb6b139SCaroline Tice         description.Printf ("No value");
614*ceb6b139SCaroline Tice 
615*ceb6b139SCaroline Tice     return true;
616*ceb6b139SCaroline Tice }
617