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"
15*4e78f606SGreg Clayton #include "lldb/Breakpoint/BreakpointLocation.h"
166611103cSGreg Clayton #include "lldb/Core/Debugger.h"
1730fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
1830fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
196611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
2030fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
2130fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2230fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2330fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
24f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h"
2530fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2630fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h"
2730fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h"
2830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h"
2930fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h"
3030fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInRange.h"
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner 
334c5de699SEli Friedman #include "lldb/API/SBAddress.h"
344c5de699SEli Friedman #include "lldb/API/SBFrame.h"
354c5de699SEli Friedman #include "lldb/API/SBSourceManager.h"
364c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
374c5de699SEli Friedman #include "lldb/API/SBProcess.h"
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner using namespace lldb;
4030fdc8d8SChris Lattner using namespace lldb_private;
4130fdc8d8SChris Lattner 
42cfd1acedSGreg Clayton //----------------------------------------------------------------------
43cfd1acedSGreg Clayton // Constructors
44cfd1acedSGreg Clayton //----------------------------------------------------------------------
4530fdc8d8SChris Lattner SBThread::SBThread () :
466611103cSGreg Clayton     m_opaque_sp ()
4730fdc8d8SChris Lattner {
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) :
516611103cSGreg Clayton     m_opaque_sp (lldb_object_sp)
5230fdc8d8SChris Lattner {
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
5592ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) :
5692ef5735SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5730fdc8d8SChris Lattner {
5830fdc8d8SChris Lattner }
5930fdc8d8SChris Lattner 
6030fdc8d8SChris Lattner //----------------------------------------------------------------------
61cfd1acedSGreg Clayton // Assignment operator
62cfd1acedSGreg Clayton //----------------------------------------------------------------------
63cfd1acedSGreg Clayton 
64cfd1acedSGreg Clayton const lldb::SBThread &
65cfd1acedSGreg Clayton SBThread::operator = (const SBThread &rhs)
66cfd1acedSGreg Clayton {
67cfd1acedSGreg Clayton     if (this != &rhs)
68cfd1acedSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
69cfd1acedSGreg Clayton     return *this;
70cfd1acedSGreg Clayton }
71cfd1acedSGreg Clayton 
72cfd1acedSGreg Clayton //----------------------------------------------------------------------
7330fdc8d8SChris Lattner // Destructor
7430fdc8d8SChris Lattner //----------------------------------------------------------------------
7530fdc8d8SChris Lattner SBThread::~SBThread()
7630fdc8d8SChris Lattner {
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner bool
8030fdc8d8SChris Lattner SBThread::IsValid() const
8130fdc8d8SChris Lattner {
826611103cSGreg Clayton     return m_opaque_sp != NULL;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
8548e42549SGreg Clayton void
8648e42549SGreg Clayton SBThread::Clear ()
8748e42549SGreg Clayton {
8848e42549SGreg Clayton     m_opaque_sp.reset();
8948e42549SGreg Clayton }
9048e42549SGreg Clayton 
9148e42549SGreg Clayton 
9230fdc8d8SChris Lattner StopReason
9330fdc8d8SChris Lattner SBThread::GetStopReason()
9430fdc8d8SChris Lattner {
952d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
96ceb6b139SCaroline Tice 
97ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
986611103cSGreg Clayton     if (m_opaque_sp)
9930fdc8d8SChris Lattner     {
100b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
101b15bfc75SJim Ingham         if (stop_info_sp)
102ceb6b139SCaroline Tice             reason =  stop_info_sp->GetStopReason();
10330fdc8d8SChris Lattner     }
104ceb6b139SCaroline Tice 
105ceb6b139SCaroline Tice     if (log)
1064838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetStopReason () => %s", m_opaque_sp.get(),
107750cd175SCaroline Tice                      Thread::StopReasonAsCString (reason));
108ceb6b139SCaroline Tice 
109ceb6b139SCaroline Tice     return reason;
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
11230fdc8d8SChris Lattner size_t
113*4e78f606SGreg Clayton SBThread::GetStopReasonDataCount ()
114*4e78f606SGreg Clayton {
115*4e78f606SGreg Clayton     if (m_opaque_sp)
116*4e78f606SGreg Clayton     {
117*4e78f606SGreg Clayton         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
118*4e78f606SGreg Clayton         if (stop_info_sp)
119*4e78f606SGreg Clayton         {
120*4e78f606SGreg Clayton             StopReason reason = stop_info_sp->GetStopReason();
121*4e78f606SGreg Clayton             switch (reason)
122*4e78f606SGreg Clayton             {
123*4e78f606SGreg Clayton             case eStopReasonInvalid:
124*4e78f606SGreg Clayton             case eStopReasonNone:
125*4e78f606SGreg Clayton             case eStopReasonTrace:
126*4e78f606SGreg Clayton             case eStopReasonPlanComplete:
127*4e78f606SGreg Clayton                 // There is no data for these stop reasons.
128*4e78f606SGreg Clayton                 return 0;
129*4e78f606SGreg Clayton 
130*4e78f606SGreg Clayton             case eStopReasonBreakpoint:
131*4e78f606SGreg Clayton                 {
132*4e78f606SGreg Clayton                     break_id_t site_id = stop_info_sp->GetValue();
133*4e78f606SGreg Clayton                     lldb::BreakpointSiteSP bp_site_sp (m_opaque_sp->GetProcess().GetBreakpointSiteList().FindByID (site_id));
134*4e78f606SGreg Clayton                     if (bp_site_sp)
135*4e78f606SGreg Clayton                         return bp_site_sp->GetNumberOfOwners () * 2;
136*4e78f606SGreg Clayton                     else
137*4e78f606SGreg Clayton                         return 0; // Breakpoint must have cleared itself...
138*4e78f606SGreg Clayton                 }
139*4e78f606SGreg Clayton                 break;
140*4e78f606SGreg Clayton 
141*4e78f606SGreg Clayton             case eStopReasonWatchpoint:
142*4e78f606SGreg Clayton                 assert (!"implement watchpoint support in SBThread::GetStopReasonDataCount ()");
143*4e78f606SGreg Clayton                 return 0; // We don't have watchpoint support yet...
144*4e78f606SGreg Clayton 
145*4e78f606SGreg Clayton             case eStopReasonSignal:
146*4e78f606SGreg Clayton                 return 1;
147*4e78f606SGreg Clayton 
148*4e78f606SGreg Clayton             case eStopReasonException:
149*4e78f606SGreg Clayton                 return 1;
150*4e78f606SGreg Clayton             }
151*4e78f606SGreg Clayton         }
152*4e78f606SGreg Clayton     }
153*4e78f606SGreg Clayton     return 0;
154*4e78f606SGreg Clayton }
155*4e78f606SGreg Clayton 
156*4e78f606SGreg Clayton uint64_t
157*4e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx)
158*4e78f606SGreg Clayton {
159*4e78f606SGreg Clayton     if (m_opaque_sp)
160*4e78f606SGreg Clayton     {
161*4e78f606SGreg Clayton         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
162*4e78f606SGreg Clayton         if (stop_info_sp)
163*4e78f606SGreg Clayton         {
164*4e78f606SGreg Clayton             StopReason reason = stop_info_sp->GetStopReason();
165*4e78f606SGreg Clayton             switch (reason)
166*4e78f606SGreg Clayton             {
167*4e78f606SGreg Clayton             case eStopReasonInvalid:
168*4e78f606SGreg Clayton             case eStopReasonNone:
169*4e78f606SGreg Clayton             case eStopReasonTrace:
170*4e78f606SGreg Clayton             case eStopReasonPlanComplete:
171*4e78f606SGreg Clayton                 // There is no data for these stop reasons.
172*4e78f606SGreg Clayton                 return 0;
173*4e78f606SGreg Clayton 
174*4e78f606SGreg Clayton             case eStopReasonBreakpoint:
175*4e78f606SGreg Clayton                 {
176*4e78f606SGreg Clayton                     break_id_t site_id = stop_info_sp->GetValue();
177*4e78f606SGreg Clayton                     lldb::BreakpointSiteSP bp_site_sp (m_opaque_sp->GetProcess().GetBreakpointSiteList().FindByID (site_id));
178*4e78f606SGreg Clayton                     if (bp_site_sp)
179*4e78f606SGreg Clayton                     {
180*4e78f606SGreg Clayton                         uint32_t bp_index = idx / 2;
181*4e78f606SGreg Clayton                         BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
182*4e78f606SGreg Clayton                         if (bp_loc_sp)
183*4e78f606SGreg Clayton                         {
184*4e78f606SGreg Clayton                             if (bp_index & 1)
185*4e78f606SGreg Clayton                             {
186*4e78f606SGreg Clayton                                 // Odd idx, return the breakpoint location ID
187*4e78f606SGreg Clayton                                 return bp_loc_sp->GetID();
188*4e78f606SGreg Clayton                             }
189*4e78f606SGreg Clayton                             else
190*4e78f606SGreg Clayton                             {
191*4e78f606SGreg Clayton                                 // Even idx, return the breakpoint ID
192*4e78f606SGreg Clayton                                 return bp_loc_sp->GetBreakpoint().GetID();
193*4e78f606SGreg Clayton                             }
194*4e78f606SGreg Clayton                         }
195*4e78f606SGreg Clayton                     }
196*4e78f606SGreg Clayton                     return LLDB_INVALID_BREAK_ID;
197*4e78f606SGreg Clayton                 }
198*4e78f606SGreg Clayton                 break;
199*4e78f606SGreg Clayton 
200*4e78f606SGreg Clayton             case eStopReasonWatchpoint:
201*4e78f606SGreg Clayton                 assert (!"implement watchpoint support in SBThread::GetStopReasonDataCount ()");
202*4e78f606SGreg Clayton                 return 0; // We don't have watchpoint support yet...
203*4e78f606SGreg Clayton 
204*4e78f606SGreg Clayton             case eStopReasonSignal:
205*4e78f606SGreg Clayton                 return stop_info_sp->GetValue();
206*4e78f606SGreg Clayton 
207*4e78f606SGreg Clayton             case eStopReasonException:
208*4e78f606SGreg Clayton                 return stop_info_sp->GetValue();
209*4e78f606SGreg Clayton             }
210*4e78f606SGreg Clayton         }
211*4e78f606SGreg Clayton     }
212*4e78f606SGreg Clayton     return 0;
213*4e78f606SGreg Clayton }
214*4e78f606SGreg Clayton 
215*4e78f606SGreg Clayton size_t
21630fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
21730fdc8d8SChris Lattner {
2182d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
219ceb6b139SCaroline Tice 
2206611103cSGreg Clayton     if (m_opaque_sp)
22130fdc8d8SChris Lattner     {
222b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
223b15bfc75SJim Ingham         if (stop_info_sp)
22430fdc8d8SChris Lattner         {
225b15bfc75SJim Ingham             const char *stop_desc = stop_info_sp->GetDescription();
22630fdc8d8SChris Lattner             if (stop_desc)
22730fdc8d8SChris Lattner             {
228ceb6b139SCaroline Tice                 if (log)
2294838131bSGreg Clayton                     log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
230750cd175SCaroline Tice                                  m_opaque_sp.get(), stop_desc);
23130fdc8d8SChris Lattner                 if (dst)
23230fdc8d8SChris Lattner                     return ::snprintf (dst, dst_len, "%s", stop_desc);
23330fdc8d8SChris Lattner                 else
23430fdc8d8SChris Lattner                 {
23530fdc8d8SChris Lattner                     // NULL dst passed in, return the length needed to contain the description
23630fdc8d8SChris Lattner                     return ::strlen (stop_desc) + 1; // Include the NULL byte for size
23730fdc8d8SChris Lattner                 }
23830fdc8d8SChris Lattner             }
23930fdc8d8SChris Lattner             else
24030fdc8d8SChris Lattner             {
24130fdc8d8SChris Lattner                 size_t stop_desc_len = 0;
242b15bfc75SJim Ingham                 switch (stop_info_sp->GetStopReason())
24330fdc8d8SChris Lattner                 {
24430fdc8d8SChris Lattner                 case eStopReasonTrace:
24530fdc8d8SChris Lattner                 case eStopReasonPlanComplete:
24630fdc8d8SChris Lattner                     {
24730fdc8d8SChris Lattner                         static char trace_desc[] = "step";
24830fdc8d8SChris Lattner                         stop_desc = trace_desc;
24930fdc8d8SChris Lattner                         stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
25030fdc8d8SChris Lattner                     }
25130fdc8d8SChris Lattner                     break;
25230fdc8d8SChris Lattner 
25330fdc8d8SChris Lattner                 case eStopReasonBreakpoint:
25430fdc8d8SChris Lattner                     {
25530fdc8d8SChris Lattner                         static char bp_desc[] = "breakpoint hit";
25630fdc8d8SChris Lattner                         stop_desc = bp_desc;
25730fdc8d8SChris Lattner                         stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
25830fdc8d8SChris Lattner                     }
25930fdc8d8SChris Lattner                     break;
26030fdc8d8SChris Lattner 
26130fdc8d8SChris Lattner                 case eStopReasonWatchpoint:
26230fdc8d8SChris Lattner                     {
26330fdc8d8SChris Lattner                         static char wp_desc[] = "watchpoint hit";
26430fdc8d8SChris Lattner                         stop_desc = wp_desc;
26530fdc8d8SChris Lattner                         stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
26630fdc8d8SChris Lattner                     }
26730fdc8d8SChris Lattner                     break;
26830fdc8d8SChris Lattner 
26930fdc8d8SChris Lattner                 case eStopReasonSignal:
27030fdc8d8SChris Lattner                     {
271b15bfc75SJim Ingham                         stop_desc = m_opaque_sp->GetProcess().GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
27230fdc8d8SChris Lattner                         if (stop_desc == NULL || stop_desc[0] == '\0')
27330fdc8d8SChris Lattner                         {
27430fdc8d8SChris Lattner                             static char signal_desc[] = "signal";
27530fdc8d8SChris Lattner                             stop_desc = signal_desc;
27630fdc8d8SChris Lattner                             stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
27730fdc8d8SChris Lattner                         }
27830fdc8d8SChris Lattner                     }
27930fdc8d8SChris Lattner                     break;
28030fdc8d8SChris Lattner 
28130fdc8d8SChris Lattner                 case eStopReasonException:
28230fdc8d8SChris Lattner                     {
28330fdc8d8SChris Lattner                         char exc_desc[] = "exception";
28430fdc8d8SChris Lattner                         stop_desc = exc_desc;
28530fdc8d8SChris Lattner                         stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
28630fdc8d8SChris Lattner                     }
28730fdc8d8SChris Lattner                     break;
288c982c768SGreg Clayton 
289c982c768SGreg Clayton                 default:
290c982c768SGreg Clayton                     break;
29130fdc8d8SChris Lattner                 }
29230fdc8d8SChris Lattner 
29330fdc8d8SChris Lattner                 if (stop_desc && stop_desc[0])
29430fdc8d8SChris Lattner                 {
295ceb6b139SCaroline Tice                     if (log)
29693aa84e8SGreg Clayton                         log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
297750cd175SCaroline Tice                                      m_opaque_sp.get(), stop_desc);
298ceb6b139SCaroline Tice 
29930fdc8d8SChris Lattner                     if (dst)
30030fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
30130fdc8d8SChris Lattner 
30230fdc8d8SChris Lattner                     if (stop_desc_len == 0)
30330fdc8d8SChris Lattner                         stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
30430fdc8d8SChris Lattner 
30530fdc8d8SChris Lattner                     return stop_desc_len;
30630fdc8d8SChris Lattner                 }
30730fdc8d8SChris Lattner             }
30830fdc8d8SChris Lattner         }
30930fdc8d8SChris Lattner     }
31030fdc8d8SChris Lattner     if (dst)
31130fdc8d8SChris Lattner         *dst = 0;
31230fdc8d8SChris Lattner     return 0;
31330fdc8d8SChris Lattner }
31430fdc8d8SChris Lattner 
31530fdc8d8SChris Lattner void
31630fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
31730fdc8d8SChris Lattner {
3186611103cSGreg Clayton     m_opaque_sp = lldb_object_sp;
31930fdc8d8SChris Lattner }
32030fdc8d8SChris Lattner 
32130fdc8d8SChris Lattner 
32230fdc8d8SChris Lattner lldb::tid_t
32330fdc8d8SChris Lattner SBThread::GetThreadID () const
32430fdc8d8SChris Lattner {
3252d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
326ceb6b139SCaroline Tice 
327ceb6b139SCaroline Tice     lldb::tid_t id = LLDB_INVALID_THREAD_ID;
3286611103cSGreg Clayton     if (m_opaque_sp)
329ceb6b139SCaroline Tice         id = m_opaque_sp->GetID();
330ceb6b139SCaroline Tice 
331ceb6b139SCaroline Tice     if (log)
3324838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetThreadID () => 0x%4.4x", m_opaque_sp.get(), id);
333ceb6b139SCaroline Tice 
334ceb6b139SCaroline Tice     return id;
33530fdc8d8SChris Lattner }
33630fdc8d8SChris Lattner 
33730fdc8d8SChris Lattner uint32_t
33830fdc8d8SChris Lattner SBThread::GetIndexID () const
33930fdc8d8SChris Lattner {
3406611103cSGreg Clayton     if (m_opaque_sp)
3416611103cSGreg Clayton         return m_opaque_sp->GetIndexID();
34230fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
34330fdc8d8SChris Lattner }
34430fdc8d8SChris Lattner const char *
34530fdc8d8SChris Lattner SBThread::GetName () const
34630fdc8d8SChris Lattner {
3474838131bSGreg Clayton     const char *name = NULL;
3486611103cSGreg Clayton     if (m_opaque_sp)
3494838131bSGreg Clayton         name = m_opaque_sp->GetName();
350ceb6b139SCaroline Tice 
3512d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
352ceb6b139SCaroline Tice     if (log)
3534838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetName () => %s", m_opaque_sp.get(), name ? name : "NULL");
354ceb6b139SCaroline Tice 
3554838131bSGreg Clayton     return name;
35630fdc8d8SChris Lattner }
35730fdc8d8SChris Lattner 
35830fdc8d8SChris Lattner const char *
35930fdc8d8SChris Lattner SBThread::GetQueueName () const
36030fdc8d8SChris Lattner {
3614838131bSGreg Clayton     const char *name = NULL;
3626611103cSGreg Clayton     if (m_opaque_sp)
3634838131bSGreg Clayton         name = m_opaque_sp->GetQueueName();
364ceb6b139SCaroline Tice 
3652d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
366ceb6b139SCaroline Tice     if (log)
3674838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetQueueName () => %s", m_opaque_sp.get(), name ? name : "NULL");
368ceb6b139SCaroline Tice 
3694838131bSGreg Clayton     return name;
37030fdc8d8SChris Lattner }
37130fdc8d8SChris Lattner 
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner void
37430fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
37530fdc8d8SChris Lattner {
3762d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
377ceb6b139SCaroline Tice 
378ceb6b139SCaroline Tice     if (log)
37993aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", m_opaque_sp.get(),
380ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
381ceb6b139SCaroline Tice 
3826611103cSGreg Clayton     if (m_opaque_sp)
38330fdc8d8SChris Lattner     {
38430fdc8d8SChris Lattner         bool abort_other_plans = true;
3856611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
38630fdc8d8SChris Lattner 
38730fdc8d8SChris Lattner         if (frame_sp)
38830fdc8d8SChris Lattner         {
38930fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
39030fdc8d8SChris Lattner             {
39130fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
3926611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
39330fdc8d8SChris Lattner                                                           eStepTypeOver,
39430fdc8d8SChris Lattner                                                           sc.line_entry.range,
39530fdc8d8SChris Lattner                                                           sc,
396474966a4SGreg Clayton                                                           stop_other_threads,
397474966a4SGreg Clayton                                                           false);
39830fdc8d8SChris Lattner 
39930fdc8d8SChris Lattner             }
40030fdc8d8SChris Lattner             else
40130fdc8d8SChris Lattner             {
4026611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepSingleInstruction (true,
40330fdc8d8SChris Lattner                                                                       abort_other_plans,
40430fdc8d8SChris Lattner                                                                       stop_other_threads);
40530fdc8d8SChris Lattner             }
40630fdc8d8SChris Lattner         }
40730fdc8d8SChris Lattner 
4086611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
40930fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
4102976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4115d5028b5SGreg Clayton         Error error (process.Resume());
4125d5028b5SGreg Clayton         if (error.Success())
4135d5028b5SGreg Clayton         {
4145d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4155d5028b5SGreg Clayton             // process to stop yet again!
4165d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4175d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4185d5028b5SGreg Clayton         }
41930fdc8d8SChris Lattner     }
42030fdc8d8SChris Lattner }
42130fdc8d8SChris Lattner 
42230fdc8d8SChris Lattner void
42330fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
42430fdc8d8SChris Lattner {
4252d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
426ceb6b139SCaroline Tice 
427ceb6b139SCaroline Tice     if (log)
42893aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInto (stop_other_threads='%s')", m_opaque_sp.get(),
429ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
430ceb6b139SCaroline Tice 
4316611103cSGreg Clayton     if (m_opaque_sp)
43230fdc8d8SChris Lattner     {
43330fdc8d8SChris Lattner         bool abort_other_plans = true;
43430fdc8d8SChris Lattner 
4356611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
43630fdc8d8SChris Lattner 
43730fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
43830fdc8d8SChris Lattner         {
439474966a4SGreg Clayton             bool avoid_code_without_debug_info = true;
44030fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
4416611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
44230fdc8d8SChris Lattner                                                       eStepTypeInto,
44330fdc8d8SChris Lattner                                                       sc.line_entry.range,
44430fdc8d8SChris Lattner                                                       sc,
445474966a4SGreg Clayton                                                       stop_other_threads,
446474966a4SGreg Clayton                                                       avoid_code_without_debug_info);
44730fdc8d8SChris Lattner         }
44830fdc8d8SChris Lattner         else
44930fdc8d8SChris Lattner         {
4506611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepSingleInstruction (false,
45130fdc8d8SChris Lattner                                                                   abort_other_plans,
45230fdc8d8SChris Lattner                                                                   stop_other_threads);
45330fdc8d8SChris Lattner         }
45430fdc8d8SChris Lattner 
4556611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
45630fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
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 void
47030fdc8d8SChris Lattner SBThread::StepOut ()
47130fdc8d8SChris Lattner {
4722d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
473ceb6b139SCaroline Tice 
474ceb6b139SCaroline Tice     if (log)
4754838131bSGreg Clayton         log->Printf ("SBThread(%p)::StepOut ()", m_opaque_sp.get());
476ceb6b139SCaroline Tice 
4776611103cSGreg Clayton     if (m_opaque_sp)
47830fdc8d8SChris Lattner     {
47930fdc8d8SChris Lattner         bool abort_other_plans = true;
48030fdc8d8SChris Lattner         bool stop_other_threads = true;
48130fdc8d8SChris Lattner 
4826611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, stop_other_threads, eVoteYes, eVoteNoOpinion);
48330fdc8d8SChris Lattner 
4846611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
4852976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4865d5028b5SGreg Clayton         Error error (process.Resume());
4875d5028b5SGreg Clayton         if (error.Success())
4885d5028b5SGreg Clayton         {
4895d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4905d5028b5SGreg Clayton             // process to stop yet again!
4915d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4925d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4935d5028b5SGreg Clayton         }
49430fdc8d8SChris Lattner     }
49530fdc8d8SChris Lattner }
49630fdc8d8SChris Lattner 
49730fdc8d8SChris Lattner void
49830fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
49930fdc8d8SChris Lattner {
5002d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
501ceb6b139SCaroline Tice 
502ceb6b139SCaroline Tice     if (log)
50393aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", m_opaque_sp.get(), step_over);
504ceb6b139SCaroline Tice 
5056611103cSGreg Clayton     if (m_opaque_sp)
50630fdc8d8SChris Lattner     {
5076611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepSingleInstruction (step_over, true, true);
5086611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
5092976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
5105d5028b5SGreg Clayton         Error error (process.Resume());
5115d5028b5SGreg Clayton         if (error.Success())
5125d5028b5SGreg Clayton         {
5135d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
5145d5028b5SGreg Clayton             // process to stop yet again!
5155d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
5165d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
5175d5028b5SGreg Clayton         }
51830fdc8d8SChris Lattner     }
51930fdc8d8SChris Lattner }
52030fdc8d8SChris Lattner 
52130fdc8d8SChris Lattner void
52230fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
52330fdc8d8SChris Lattner {
5242d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
525ceb6b139SCaroline Tice 
526ceb6b139SCaroline Tice     if (log)
52793aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::RunToAddress (addr=0x%llx)", m_opaque_sp.get(), addr);
528ceb6b139SCaroline Tice 
5296611103cSGreg Clayton     if (m_opaque_sp)
53030fdc8d8SChris Lattner     {
53130fdc8d8SChris Lattner         bool abort_other_plans = true;
53230fdc8d8SChris Lattner         bool stop_other_threads = true;
53330fdc8d8SChris Lattner 
53430fdc8d8SChris Lattner         Address target_addr (NULL, addr);
53530fdc8d8SChris Lattner 
5366611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads);
5376611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
5382976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
5395d5028b5SGreg Clayton         Error error (process.Resume());
5405d5028b5SGreg Clayton         if (error.Success())
5415d5028b5SGreg Clayton         {
5425d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
5435d5028b5SGreg Clayton             // process to stop yet again!
5445d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
5455d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
5465d5028b5SGreg Clayton         }
54730fdc8d8SChris Lattner     }
54830fdc8d8SChris Lattner 
54930fdc8d8SChris Lattner }
55030fdc8d8SChris Lattner 
55130fdc8d8SChris Lattner SBProcess
55230fdc8d8SChris Lattner SBThread::GetProcess ()
55330fdc8d8SChris Lattner {
554ceb6b139SCaroline Tice 
55530fdc8d8SChris Lattner     SBProcess process;
5566611103cSGreg Clayton     if (m_opaque_sp)
55730fdc8d8SChris Lattner     {
55830fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
5596611103cSGreg Clayton         process.SetProcess(m_opaque_sp->GetProcess().GetTarget().GetProcessSP());
56030fdc8d8SChris Lattner     }
561ceb6b139SCaroline Tice 
5622d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
563ceb6b139SCaroline Tice     if (log)
564ceb6b139SCaroline Tice     {
565ceb6b139SCaroline Tice         SBStream sstr;
566ceb6b139SCaroline Tice         process.GetDescription (sstr);
5674838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
568750cd175SCaroline Tice                      process.get(), sstr.GetData());
569ceb6b139SCaroline Tice     }
570ceb6b139SCaroline Tice 
57130fdc8d8SChris Lattner     return process;
57230fdc8d8SChris Lattner }
57330fdc8d8SChris Lattner 
57430fdc8d8SChris Lattner uint32_t
57530fdc8d8SChris Lattner SBThread::GetNumFrames ()
57630fdc8d8SChris Lattner {
5772d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
578ceb6b139SCaroline Tice 
579ceb6b139SCaroline Tice     uint32_t num_frames = 0;
5806611103cSGreg Clayton     if (m_opaque_sp)
581ceb6b139SCaroline Tice         num_frames = m_opaque_sp->GetStackFrameCount();
582ceb6b139SCaroline Tice 
583ceb6b139SCaroline Tice     if (log)
5844838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetNumFrames () => %u", m_opaque_sp.get(), num_frames);
585ceb6b139SCaroline Tice 
586ceb6b139SCaroline Tice     return num_frames;
58730fdc8d8SChris Lattner }
58830fdc8d8SChris Lattner 
58930fdc8d8SChris Lattner SBFrame
59030fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
59130fdc8d8SChris Lattner {
5922d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
593ceb6b139SCaroline Tice 
59430fdc8d8SChris Lattner     SBFrame sb_frame;
5956611103cSGreg Clayton     if (m_opaque_sp)
5966611103cSGreg Clayton         sb_frame.SetFrame (m_opaque_sp->GetStackFrameAtIndex (idx));
597ceb6b139SCaroline Tice 
598ceb6b139SCaroline Tice     if (log)
599ceb6b139SCaroline Tice     {
600ceb6b139SCaroline Tice         SBStream sstr;
601ceb6b139SCaroline Tice         sb_frame.GetDescription (sstr);
6024838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
603750cd175SCaroline Tice                      m_opaque_sp.get(), idx, sb_frame.get(), sstr.GetData());
604ceb6b139SCaroline Tice     }
605ceb6b139SCaroline Tice 
60630fdc8d8SChris Lattner     return sb_frame;
60730fdc8d8SChris Lattner }
60830fdc8d8SChris Lattner 
60930fdc8d8SChris Lattner bool
61030fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
61130fdc8d8SChris Lattner {
6126611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
61330fdc8d8SChris Lattner }
61430fdc8d8SChris Lattner 
61530fdc8d8SChris Lattner bool
61630fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
61730fdc8d8SChris Lattner {
6186611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
61930fdc8d8SChris Lattner }
62030fdc8d8SChris Lattner 
62130fdc8d8SChris Lattner lldb_private::Thread *
6224838131bSGreg Clayton SBThread::get ()
62330fdc8d8SChris Lattner {
6246611103cSGreg Clayton     return m_opaque_sp.get();
62530fdc8d8SChris Lattner }
62630fdc8d8SChris Lattner 
62730fdc8d8SChris Lattner const lldb_private::Thread *
62830fdc8d8SChris Lattner SBThread::operator->() const
62930fdc8d8SChris Lattner {
6306611103cSGreg Clayton     return m_opaque_sp.get();
63130fdc8d8SChris Lattner }
63230fdc8d8SChris Lattner 
63330fdc8d8SChris Lattner const lldb_private::Thread &
63430fdc8d8SChris Lattner SBThread::operator*() const
63530fdc8d8SChris Lattner {
6366611103cSGreg Clayton     return *m_opaque_sp;
63730fdc8d8SChris Lattner }
63830fdc8d8SChris Lattner 
63930fdc8d8SChris Lattner lldb_private::Thread *
64030fdc8d8SChris Lattner SBThread::operator->()
64130fdc8d8SChris Lattner {
6426611103cSGreg Clayton     return m_opaque_sp.get();
64330fdc8d8SChris Lattner }
64430fdc8d8SChris Lattner 
64530fdc8d8SChris Lattner lldb_private::Thread &
64630fdc8d8SChris Lattner SBThread::operator*()
64730fdc8d8SChris Lattner {
6486611103cSGreg Clayton     return *m_opaque_sp;
64930fdc8d8SChris Lattner }
650dde9cff3SCaroline Tice 
651dde9cff3SCaroline Tice bool
652ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
653ceb6b139SCaroline Tice {
654ceb6b139SCaroline Tice     if (m_opaque_sp)
655ceb6b139SCaroline Tice     {
656ceb6b139SCaroline Tice         StreamString strm;
657ceb6b139SCaroline Tice         description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID());
658ceb6b139SCaroline Tice     }
659ceb6b139SCaroline Tice     else
660ceb6b139SCaroline Tice         description.Printf ("No value");
661ceb6b139SCaroline Tice 
662ceb6b139SCaroline Tice     return true;
663ceb6b139SCaroline Tice }
664