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 
1093a64300SDaniel Malea #include "lldb/lldb-python.h"
1193a64300SDaniel Malea 
124c5de699SEli Friedman #include "lldb/API/SBThread.h"
1330fdc8d8SChris Lattner 
1430fdc8d8SChris Lattner #include "lldb/API/SBSymbolContext.h"
1530fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
16dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
174e78f606SGreg Clayton #include "lldb/Breakpoint/BreakpointLocation.h"
186611103cSGreg Clayton #include "lldb/Core/Debugger.h"
19a75418dbSAndrew Kaylor #include "lldb/Core/State.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
22705b1809SJason Molenda #include "lldb/Core/StructuredData.h"
23*a78bd7ffSZachary Turner #include "lldb/Core/ValueObject.h"
246611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
2593749ab3SZachary Turner #include "lldb/Symbol/SymbolContext.h"
2693749ab3SZachary Turner #include "lldb/Symbol/CompileUnit.h"
275dd4916fSJason Molenda #include "lldb/Target/SystemRuntime.h"
2830fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
2930fdc8d8SChris Lattner #include "lldb/Target/Process.h"
30b9ffa98cSJason Molenda #include "lldb/Target/Queue.h"
3193749ab3SZachary Turner #include "lldb/Target/UnixSignals.h"
32f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3430fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h"
3530fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h"
3630fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h"
3730fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h"
3830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInRange.h"
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner 
414c5de699SEli Friedman #include "lldb/API/SBAddress.h"
424c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
434f465cffSJim Ingham #include "lldb/API/SBEvent.h"
4473ca05a2SJim Ingham #include "lldb/API/SBFrame.h"
454c5de699SEli Friedman #include "lldb/API/SBProcess.h"
462bdbfd50SJim Ingham #include "lldb/API/SBThreadPlan.h"
4773ca05a2SJim Ingham #include "lldb/API/SBValue.h"
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner using namespace lldb;
5030fdc8d8SChris Lattner using namespace lldb_private;
5130fdc8d8SChris Lattner 
524f465cffSJim Ingham const char *
534f465cffSJim Ingham SBThread::GetBroadcasterClassName ()
544f465cffSJim Ingham {
554f465cffSJim Ingham     return Thread::GetStaticBroadcasterClass().AsCString();
564f465cffSJim Ingham }
574f465cffSJim Ingham 
58cfd1acedSGreg Clayton //----------------------------------------------------------------------
59cfd1acedSGreg Clayton // Constructors
60cfd1acedSGreg Clayton //----------------------------------------------------------------------
6130fdc8d8SChris Lattner SBThread::SBThread () :
627fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
6330fdc8d8SChris Lattner {
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) :
677fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef(lldb_object_sp))
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7192ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) :
727fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp))
7330fdc8d8SChris Lattner {
747fdf9ef1SGreg Clayton 
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner //----------------------------------------------------------------------
78cfd1acedSGreg Clayton // Assignment operator
79cfd1acedSGreg Clayton //----------------------------------------------------------------------
80cfd1acedSGreg Clayton 
81cfd1acedSGreg Clayton const lldb::SBThread &
82cfd1acedSGreg Clayton SBThread::operator = (const SBThread &rhs)
83cfd1acedSGreg Clayton {
84cfd1acedSGreg Clayton     if (this != &rhs)
857fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
86cfd1acedSGreg Clayton     return *this;
87cfd1acedSGreg Clayton }
88cfd1acedSGreg Clayton 
89cfd1acedSGreg Clayton //----------------------------------------------------------------------
9030fdc8d8SChris Lattner // Destructor
9130fdc8d8SChris Lattner //----------------------------------------------------------------------
9230fdc8d8SChris Lattner SBThread::~SBThread()
9330fdc8d8SChris Lattner {
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
96b9ffa98cSJason Molenda lldb::SBQueue
97b9ffa98cSJason Molenda SBThread::GetQueue () const
98b9ffa98cSJason Molenda {
99b9ffa98cSJason Molenda     SBQueue sb_queue;
100b9ffa98cSJason Molenda     QueueSP queue_sp;
101b9ffa98cSJason Molenda     Mutex::Locker api_locker;
102b9ffa98cSJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
103b9ffa98cSJason Molenda 
104b9ffa98cSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
105b9ffa98cSJason Molenda     if (exe_ctx.HasThreadScope())
106b9ffa98cSJason Molenda     {
107b9ffa98cSJason Molenda         Process::StopLocker stop_locker;
108b9ffa98cSJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
109b9ffa98cSJason Molenda         {
110b9ffa98cSJason Molenda             queue_sp = exe_ctx.GetThreadPtr()->GetQueue();
111b9ffa98cSJason Molenda             if (queue_sp)
112b9ffa98cSJason Molenda             {
113b9ffa98cSJason Molenda                 sb_queue.SetQueue (queue_sp);
114b9ffa98cSJason Molenda             }
115b9ffa98cSJason Molenda         }
116b9ffa98cSJason Molenda         else
117b9ffa98cSJason Molenda         {
118b9ffa98cSJason Molenda             if (log)
119b9ffa98cSJason Molenda                 log->Printf ("SBThread(%p)::GetQueueKind() => error: process is running",
120b9ffa98cSJason Molenda                              static_cast<void*>(exe_ctx.GetThreadPtr()));
121b9ffa98cSJason Molenda         }
122b9ffa98cSJason Molenda     }
123b9ffa98cSJason Molenda 
124b9ffa98cSJason Molenda     if (log)
125b9ffa98cSJason Molenda         log->Printf ("SBThread(%p)::GetQueueKind () => SBQueue(%p)",
126b9ffa98cSJason Molenda                      static_cast<void*>(exe_ctx.GetThreadPtr()), static_cast<void*>(queue_sp.get()));
127b9ffa98cSJason Molenda 
128b9ffa98cSJason Molenda     return sb_queue;
129b9ffa98cSJason Molenda }
130b9ffa98cSJason Molenda 
131b9ffa98cSJason Molenda 
13230fdc8d8SChris Lattner bool
13330fdc8d8SChris Lattner SBThread::IsValid() const
13430fdc8d8SChris Lattner {
1357fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() != NULL;
13630fdc8d8SChris Lattner }
13730fdc8d8SChris Lattner 
13848e42549SGreg Clayton void
13948e42549SGreg Clayton SBThread::Clear ()
14048e42549SGreg Clayton {
1417fdf9ef1SGreg Clayton     m_opaque_sp->Clear();
14248e42549SGreg Clayton }
14348e42549SGreg Clayton 
14448e42549SGreg Clayton 
14530fdc8d8SChris Lattner StopReason
14630fdc8d8SChris Lattner SBThread::GetStopReason()
14730fdc8d8SChris Lattner {
1485160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
149ceb6b139SCaroline Tice 
150ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
1514fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1524fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1534fc6cb9cSJim Ingham 
1541ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
15530fdc8d8SChris Lattner     {
1567fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1577fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1587fdf9ef1SGreg Clayton         {
15997d5cf05SGreg Clayton             return exe_ctx.GetThreadPtr()->GetStopReason();
16030fdc8d8SChris Lattner         }
161c9858e4dSGreg Clayton         else
162c9858e4dSGreg Clayton         {
163c9858e4dSGreg Clayton             if (log)
164324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReason() => error: process is running",
165324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
166c9858e4dSGreg Clayton         }
1677fdf9ef1SGreg Clayton     }
168ceb6b139SCaroline Tice 
169ceb6b139SCaroline Tice     if (log)
170324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetStopReason () => %s",
171324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
172750cd175SCaroline Tice                      Thread::StopReasonAsCString (reason));
173ceb6b139SCaroline Tice 
174ceb6b139SCaroline Tice     return reason;
17530fdc8d8SChris Lattner }
17630fdc8d8SChris Lattner 
17730fdc8d8SChris Lattner size_t
1784e78f606SGreg Clayton SBThread::GetStopReasonDataCount ()
1794e78f606SGreg Clayton {
1804fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1814fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1824fc6cb9cSJim Ingham 
1831ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1844e78f606SGreg Clayton     {
1857fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1867fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1877fdf9ef1SGreg Clayton         {
1881ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
1894e78f606SGreg Clayton             if (stop_info_sp)
1904e78f606SGreg Clayton             {
1914e78f606SGreg Clayton                 StopReason reason = stop_info_sp->GetStopReason();
1924e78f606SGreg Clayton                 switch (reason)
1934e78f606SGreg Clayton                 {
1944e78f606SGreg Clayton                 case eStopReasonInvalid:
1954e78f606SGreg Clayton                 case eStopReasonNone:
1964e78f606SGreg Clayton                 case eStopReasonTrace:
19790ba8115SGreg Clayton                 case eStopReasonExec:
1984e78f606SGreg Clayton                 case eStopReasonPlanComplete:
199f85defaeSAndrew Kaylor                 case eStopReasonThreadExiting:
200afdf842bSKuba Brecka                 case eStopReasonInstrumentation:
2014e78f606SGreg Clayton                     // There is no data for these stop reasons.
2024e78f606SGreg Clayton                     return 0;
2034e78f606SGreg Clayton 
2044e78f606SGreg Clayton                 case eStopReasonBreakpoint:
2054e78f606SGreg Clayton                     {
2064e78f606SGreg Clayton                         break_id_t site_id = stop_info_sp->GetValue();
2071ac04c30SGreg Clayton                         lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
2084e78f606SGreg Clayton                         if (bp_site_sp)
2094e78f606SGreg Clayton                             return bp_site_sp->GetNumberOfOwners () * 2;
2104e78f606SGreg Clayton                         else
2114e78f606SGreg Clayton                             return 0; // Breakpoint must have cleared itself...
2124e78f606SGreg Clayton                     }
2134e78f606SGreg Clayton                     break;
2144e78f606SGreg Clayton 
2154e78f606SGreg Clayton                 case eStopReasonWatchpoint:
216290fa41bSJohnny Chen                     return 1;
2174e78f606SGreg Clayton 
2184e78f606SGreg Clayton                 case eStopReasonSignal:
2194e78f606SGreg Clayton                     return 1;
2204e78f606SGreg Clayton 
2214e78f606SGreg Clayton                 case eStopReasonException:
2224e78f606SGreg Clayton                     return 1;
2234e78f606SGreg Clayton                 }
2244e78f606SGreg Clayton             }
2254e78f606SGreg Clayton         }
226c9858e4dSGreg Clayton         else
227c9858e4dSGreg Clayton         {
2285160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
229c9858e4dSGreg Clayton             if (log)
230324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running",
231324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
232c9858e4dSGreg Clayton         }
2337fdf9ef1SGreg Clayton     }
2344e78f606SGreg Clayton     return 0;
2354e78f606SGreg Clayton }
2364e78f606SGreg Clayton 
2374e78f606SGreg Clayton uint64_t
2384e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx)
2394e78f606SGreg Clayton {
2404fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2414fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2424fc6cb9cSJim Ingham 
2431ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
2444e78f606SGreg Clayton     {
2457fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2467fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2477fdf9ef1SGreg Clayton         {
2481ac04c30SGreg Clayton             Thread *thread = exe_ctx.GetThreadPtr();
2491ac04c30SGreg Clayton             StopInfoSP stop_info_sp = thread->GetStopInfo ();
2504e78f606SGreg Clayton             if (stop_info_sp)
2514e78f606SGreg Clayton             {
2524e78f606SGreg Clayton                 StopReason reason = stop_info_sp->GetStopReason();
2534e78f606SGreg Clayton                 switch (reason)
2544e78f606SGreg Clayton                 {
2554e78f606SGreg Clayton                 case eStopReasonInvalid:
2564e78f606SGreg Clayton                 case eStopReasonNone:
2574e78f606SGreg Clayton                 case eStopReasonTrace:
25890ba8115SGreg Clayton                 case eStopReasonExec:
2594e78f606SGreg Clayton                 case eStopReasonPlanComplete:
260f85defaeSAndrew Kaylor                 case eStopReasonThreadExiting:
261afdf842bSKuba Brecka                 case eStopReasonInstrumentation:
2624e78f606SGreg Clayton                     // There is no data for these stop reasons.
2634e78f606SGreg Clayton                     return 0;
2644e78f606SGreg Clayton 
2654e78f606SGreg Clayton                 case eStopReasonBreakpoint:
2664e78f606SGreg Clayton                     {
2674e78f606SGreg Clayton                         break_id_t site_id = stop_info_sp->GetValue();
2681ac04c30SGreg Clayton                         lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
2694e78f606SGreg Clayton                         if (bp_site_sp)
2704e78f606SGreg Clayton                         {
2714e78f606SGreg Clayton                             uint32_t bp_index = idx / 2;
2724e78f606SGreg Clayton                             BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
2734e78f606SGreg Clayton                             if (bp_loc_sp)
2744e78f606SGreg Clayton                             {
2758334e14eSGreg Clayton                                 if (idx & 1)
2764e78f606SGreg Clayton                                 {
2774e78f606SGreg Clayton                                     // Odd idx, return the breakpoint location ID
2784e78f606SGreg Clayton                                     return bp_loc_sp->GetID();
2794e78f606SGreg Clayton                                 }
2804e78f606SGreg Clayton                                 else
2814e78f606SGreg Clayton                                 {
2824e78f606SGreg Clayton                                     // Even idx, return the breakpoint ID
2834e78f606SGreg Clayton                                     return bp_loc_sp->GetBreakpoint().GetID();
2844e78f606SGreg Clayton                                 }
2854e78f606SGreg Clayton                             }
2864e78f606SGreg Clayton                         }
2874e78f606SGreg Clayton                         return LLDB_INVALID_BREAK_ID;
2884e78f606SGreg Clayton                     }
2894e78f606SGreg Clayton                     break;
2904e78f606SGreg Clayton 
2914e78f606SGreg Clayton                 case eStopReasonWatchpoint:
292290fa41bSJohnny Chen                     return stop_info_sp->GetValue();
2934e78f606SGreg Clayton 
2944e78f606SGreg Clayton                 case eStopReasonSignal:
2954e78f606SGreg Clayton                     return stop_info_sp->GetValue();
2964e78f606SGreg Clayton 
2974e78f606SGreg Clayton                 case eStopReasonException:
2984e78f606SGreg Clayton                     return stop_info_sp->GetValue();
2994e78f606SGreg Clayton                 }
3004e78f606SGreg Clayton             }
3014e78f606SGreg Clayton         }
302c9858e4dSGreg Clayton         else
303c9858e4dSGreg Clayton         {
3045160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
305c9858e4dSGreg Clayton             if (log)
306324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running",
307324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
308c9858e4dSGreg Clayton         }
3097fdf9ef1SGreg Clayton     }
3104e78f606SGreg Clayton     return 0;
3114e78f606SGreg Clayton }
3124e78f606SGreg Clayton 
313afdf842bSKuba Brecka bool
314afdf842bSKuba Brecka SBThread::GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream)
315afdf842bSKuba Brecka {
316afdf842bSKuba Brecka     Stream &strm = stream.ref();
317afdf842bSKuba Brecka 
318afdf842bSKuba Brecka     ExecutionContext exe_ctx (m_opaque_sp.get());
319afdf842bSKuba Brecka     if (! exe_ctx.HasThreadScope())
320afdf842bSKuba Brecka         return false;
321afdf842bSKuba Brecka 
322afdf842bSKuba Brecka 
323afdf842bSKuba Brecka     StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo();
324afdf842bSKuba Brecka     StructuredData::ObjectSP info = stop_info->GetExtendedInfo();
325afdf842bSKuba Brecka     if (! info)
326afdf842bSKuba Brecka         return false;
327afdf842bSKuba Brecka 
328afdf842bSKuba Brecka     info->Dump(strm);
329afdf842bSKuba Brecka 
330afdf842bSKuba Brecka     return true;
331afdf842bSKuba Brecka }
332afdf842bSKuba Brecka 
3334e78f606SGreg Clayton size_t
33430fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
33530fdc8d8SChris Lattner {
3365160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
337ceb6b139SCaroline Tice 
3384fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3394fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3404fc6cb9cSJim Ingham 
3411ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
34230fdc8d8SChris Lattner     {
3437fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3447fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3457fdf9ef1SGreg Clayton         {
3467fdf9ef1SGreg Clayton 
3471ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
348b15bfc75SJim Ingham             if (stop_info_sp)
34930fdc8d8SChris Lattner             {
350b15bfc75SJim Ingham                 const char *stop_desc = stop_info_sp->GetDescription();
35130fdc8d8SChris Lattner                 if (stop_desc)
35230fdc8d8SChris Lattner                 {
353ceb6b139SCaroline Tice                     if (log)
3544838131bSGreg Clayton                         log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
355324a1036SSaleem Abdulrasool                                      static_cast<void*>(exe_ctx.GetThreadPtr()),
356324a1036SSaleem Abdulrasool                                      stop_desc);
35730fdc8d8SChris Lattner                     if (dst)
35830fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc);
35930fdc8d8SChris Lattner                     else
36030fdc8d8SChris Lattner                     {
36130fdc8d8SChris Lattner                         // NULL dst passed in, return the length needed to contain the description
36230fdc8d8SChris Lattner                         return ::strlen (stop_desc) + 1; // Include the NULL byte for size
36330fdc8d8SChris Lattner                     }
36430fdc8d8SChris Lattner                 }
36530fdc8d8SChris Lattner                 else
36630fdc8d8SChris Lattner                 {
36730fdc8d8SChris Lattner                     size_t stop_desc_len = 0;
368b15bfc75SJim Ingham                     switch (stop_info_sp->GetStopReason())
36930fdc8d8SChris Lattner                     {
37030fdc8d8SChris Lattner                     case eStopReasonTrace:
37130fdc8d8SChris Lattner                     case eStopReasonPlanComplete:
37230fdc8d8SChris Lattner                         {
37330fdc8d8SChris Lattner                             static char trace_desc[] = "step";
37430fdc8d8SChris Lattner                             stop_desc = trace_desc;
37530fdc8d8SChris Lattner                             stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
37630fdc8d8SChris Lattner                         }
37730fdc8d8SChris Lattner                         break;
37830fdc8d8SChris Lattner 
37930fdc8d8SChris Lattner                     case eStopReasonBreakpoint:
38030fdc8d8SChris Lattner                         {
38130fdc8d8SChris Lattner                             static char bp_desc[] = "breakpoint hit";
38230fdc8d8SChris Lattner                             stop_desc = bp_desc;
38330fdc8d8SChris Lattner                             stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
38430fdc8d8SChris Lattner                         }
38530fdc8d8SChris Lattner                         break;
38630fdc8d8SChris Lattner 
38730fdc8d8SChris Lattner                     case eStopReasonWatchpoint:
38830fdc8d8SChris Lattner                         {
38930fdc8d8SChris Lattner                             static char wp_desc[] = "watchpoint hit";
39030fdc8d8SChris Lattner                             stop_desc = wp_desc;
39130fdc8d8SChris Lattner                             stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
39230fdc8d8SChris Lattner                         }
39330fdc8d8SChris Lattner                         break;
39430fdc8d8SChris Lattner 
39530fdc8d8SChris Lattner                     case eStopReasonSignal:
39630fdc8d8SChris Lattner                         {
3971ac04c30SGreg Clayton                             stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
39830fdc8d8SChris Lattner                             if (stop_desc == NULL || stop_desc[0] == '\0')
39930fdc8d8SChris Lattner                             {
40030fdc8d8SChris Lattner                                 static char signal_desc[] = "signal";
40130fdc8d8SChris Lattner                                 stop_desc = signal_desc;
40230fdc8d8SChris Lattner                                 stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
40330fdc8d8SChris Lattner                             }
40430fdc8d8SChris Lattner                         }
40530fdc8d8SChris Lattner                         break;
40630fdc8d8SChris Lattner 
40730fdc8d8SChris Lattner                     case eStopReasonException:
40830fdc8d8SChris Lattner                         {
40930fdc8d8SChris Lattner                             char exc_desc[] = "exception";
41030fdc8d8SChris Lattner                             stop_desc = exc_desc;
41130fdc8d8SChris Lattner                             stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
41230fdc8d8SChris Lattner                         }
41330fdc8d8SChris Lattner                         break;
414c982c768SGreg Clayton 
41590ba8115SGreg Clayton                     case eStopReasonExec:
41690ba8115SGreg Clayton                         {
41790ba8115SGreg Clayton                             char exc_desc[] = "exec";
41890ba8115SGreg Clayton                             stop_desc = exc_desc;
41990ba8115SGreg Clayton                             stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
42090ba8115SGreg Clayton                         }
42190ba8115SGreg Clayton                         break;
42290ba8115SGreg Clayton 
423f85defaeSAndrew Kaylor                     case eStopReasonThreadExiting:
424f85defaeSAndrew Kaylor                         {
425f85defaeSAndrew Kaylor                             char limbo_desc[] = "thread exiting";
426f85defaeSAndrew Kaylor                             stop_desc = limbo_desc;
427f85defaeSAndrew Kaylor                             stop_desc_len = sizeof(limbo_desc);
428f85defaeSAndrew Kaylor                         }
429f85defaeSAndrew Kaylor                         break;
430c982c768SGreg Clayton                     default:
431c982c768SGreg Clayton                         break;
43230fdc8d8SChris Lattner                     }
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner                     if (stop_desc && stop_desc[0])
43530fdc8d8SChris Lattner                     {
436ceb6b139SCaroline Tice                         if (log)
43793aa84e8SGreg Clayton                             log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
438324a1036SSaleem Abdulrasool                                          static_cast<void*>(exe_ctx.GetThreadPtr()),
439324a1036SSaleem Abdulrasool                                          stop_desc);
440ceb6b139SCaroline Tice 
44130fdc8d8SChris Lattner                         if (dst)
44230fdc8d8SChris Lattner                             return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner                         if (stop_desc_len == 0)
44530fdc8d8SChris Lattner                             stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner                         return stop_desc_len;
44830fdc8d8SChris Lattner                     }
44930fdc8d8SChris Lattner                 }
45030fdc8d8SChris Lattner             }
45130fdc8d8SChris Lattner         }
452c9858e4dSGreg Clayton         else
453c9858e4dSGreg Clayton         {
4545160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
455c9858e4dSGreg Clayton             if (log)
456324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running",
457324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
458c9858e4dSGreg Clayton         }
4597fdf9ef1SGreg Clayton     }
46030fdc8d8SChris Lattner     if (dst)
46130fdc8d8SChris Lattner         *dst = 0;
46230fdc8d8SChris Lattner     return 0;
46330fdc8d8SChris Lattner }
46430fdc8d8SChris Lattner 
46573ca05a2SJim Ingham SBValue
46673ca05a2SJim Ingham SBThread::GetStopReturnValue ()
46773ca05a2SJim Ingham {
4685160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
46973ca05a2SJim Ingham     ValueObjectSP return_valobj_sp;
4704fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4714fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4724fc6cb9cSJim Ingham 
4731ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
47473ca05a2SJim Ingham     {
4757fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4767fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4777fdf9ef1SGreg Clayton         {
4781ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
47973ca05a2SJim Ingham             if (stop_info_sp)
48073ca05a2SJim Ingham             {
48173ca05a2SJim Ingham                 return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
48273ca05a2SJim Ingham             }
48373ca05a2SJim Ingham         }
484c9858e4dSGreg Clayton         else
485c9858e4dSGreg Clayton         {
486c9858e4dSGreg Clayton             if (log)
487324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running",
488324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
489c9858e4dSGreg Clayton         }
4907fdf9ef1SGreg Clayton     }
49173ca05a2SJim Ingham 
49273ca05a2SJim Ingham     if (log)
493324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetStopReturnValue () => %s",
494324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
49573ca05a2SJim Ingham                      return_valobj_sp.get()
49673ca05a2SJim Ingham                         ? return_valobj_sp->GetValueAsCString()
49773ca05a2SJim Ingham                         : "<no return value>");
49873ca05a2SJim Ingham 
49973ca05a2SJim Ingham     return SBValue (return_valobj_sp);
50073ca05a2SJim Ingham }
50173ca05a2SJim Ingham 
50230fdc8d8SChris Lattner void
50330fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
50430fdc8d8SChris Lattner {
5057fdf9ef1SGreg Clayton     m_opaque_sp->SetThreadSP (lldb_object_sp);
50630fdc8d8SChris Lattner }
50730fdc8d8SChris Lattner 
50830fdc8d8SChris Lattner lldb::tid_t
50930fdc8d8SChris Lattner SBThread::GetThreadID () const
51030fdc8d8SChris Lattner {
5117fdf9ef1SGreg Clayton     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
51217a6ad05SGreg Clayton     if (thread_sp)
5131ac04c30SGreg Clayton         return thread_sp->GetID();
5141ac04c30SGreg Clayton     return LLDB_INVALID_THREAD_ID;
51530fdc8d8SChris Lattner }
51630fdc8d8SChris Lattner 
51730fdc8d8SChris Lattner uint32_t
51830fdc8d8SChris Lattner SBThread::GetIndexID () const
51930fdc8d8SChris Lattner {
5207fdf9ef1SGreg Clayton     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
52117a6ad05SGreg Clayton     if (thread_sp)
52217a6ad05SGreg Clayton         return thread_sp->GetIndexID();
52330fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
52430fdc8d8SChris Lattner }
5251ac04c30SGreg Clayton 
52630fdc8d8SChris Lattner const char *
52730fdc8d8SChris Lattner SBThread::GetName () const
52830fdc8d8SChris Lattner {
5295160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5304838131bSGreg Clayton     const char *name = NULL;
5314fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5324fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5334fc6cb9cSJim Ingham 
5341ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
535af67cecdSGreg Clayton     {
5367fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5377fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5387fdf9ef1SGreg Clayton         {
5391ac04c30SGreg Clayton             name = exe_ctx.GetThreadPtr()->GetName();
540af67cecdSGreg Clayton         }
541c9858e4dSGreg Clayton         else
542c9858e4dSGreg Clayton         {
543c9858e4dSGreg Clayton             if (log)
544324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetName() => error: process is running",
545324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
546c9858e4dSGreg Clayton         }
5477fdf9ef1SGreg Clayton     }
548ceb6b139SCaroline Tice 
549ceb6b139SCaroline Tice     if (log)
550324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetName () => %s",
551324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
552324a1036SSaleem Abdulrasool                      name ? name : "NULL");
553ceb6b139SCaroline Tice 
5544838131bSGreg Clayton     return name;
55530fdc8d8SChris Lattner }
55630fdc8d8SChris Lattner 
55730fdc8d8SChris Lattner const char *
55830fdc8d8SChris Lattner SBThread::GetQueueName () const
55930fdc8d8SChris Lattner {
5604838131bSGreg Clayton     const char *name = NULL;
5614fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5624fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5634fc6cb9cSJim Ingham 
5645160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5651ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
566af67cecdSGreg Clayton     {
5677fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5687fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5697fdf9ef1SGreg Clayton         {
5701ac04c30SGreg Clayton             name = exe_ctx.GetThreadPtr()->GetQueueName();
571af67cecdSGreg Clayton         }
572c9858e4dSGreg Clayton         else
573c9858e4dSGreg Clayton         {
574c9858e4dSGreg Clayton             if (log)
575324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetQueueName() => error: process is running",
576324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
577c9858e4dSGreg Clayton         }
5787fdf9ef1SGreg Clayton     }
579ceb6b139SCaroline Tice 
580ceb6b139SCaroline Tice     if (log)
581324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetQueueName () => %s",
582324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
583324a1036SSaleem Abdulrasool                      name ? name : "NULL");
584ceb6b139SCaroline Tice 
5854838131bSGreg Clayton     return name;
58630fdc8d8SChris Lattner }
58730fdc8d8SChris Lattner 
5884fdb5863SJason Molenda lldb::queue_id_t
5894fdb5863SJason Molenda SBThread::GetQueueID () const
5904fdb5863SJason Molenda {
5914fdb5863SJason Molenda     queue_id_t id = LLDB_INVALID_QUEUE_ID;
5924fdb5863SJason Molenda     Mutex::Locker api_locker;
5934fdb5863SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5944fdb5863SJason Molenda 
5954fdb5863SJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5964fdb5863SJason Molenda     if (exe_ctx.HasThreadScope())
5974fdb5863SJason Molenda     {
5984fdb5863SJason Molenda         Process::StopLocker stop_locker;
5994fdb5863SJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6004fdb5863SJason Molenda         {
6014fdb5863SJason Molenda             id = exe_ctx.GetThreadPtr()->GetQueueID();
6024fdb5863SJason Molenda         }
6034fdb5863SJason Molenda         else
6044fdb5863SJason Molenda         {
6054fdb5863SJason Molenda             if (log)
606324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetQueueID() => error: process is running",
607324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
6084fdb5863SJason Molenda         }
6094fdb5863SJason Molenda     }
6104fdb5863SJason Molenda 
6114fdb5863SJason Molenda     if (log)
612324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64,
613324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), id);
6144fdb5863SJason Molenda 
6154fdb5863SJason Molenda     return id;
6164fdb5863SJason Molenda }
6174fdb5863SJason Molenda 
618705b1809SJason Molenda bool
619705b1809SJason Molenda SBThread::GetInfoItemByPathAsString (const char *path, SBStream &strm)
620705b1809SJason Molenda {
621705b1809SJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
622705b1809SJason Molenda     bool success = false;
623705b1809SJason Molenda     Mutex::Locker api_locker;
624705b1809SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
625705b1809SJason Molenda 
626705b1809SJason Molenda     if (exe_ctx.HasThreadScope())
627705b1809SJason Molenda     {
628705b1809SJason Molenda         Process::StopLocker stop_locker;
629705b1809SJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
630705b1809SJason Molenda         {
631705b1809SJason Molenda             Thread *thread = exe_ctx.GetThreadPtr();
632705b1809SJason Molenda             StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo();
633705b1809SJason Molenda             if (info_root_sp)
634705b1809SJason Molenda             {
635705b1809SJason Molenda                 StructuredData::ObjectSP node = info_root_sp->GetObjectForDotSeparatedPath (path);
636705b1809SJason Molenda                 if (node)
637705b1809SJason Molenda                 {
638705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeString)
639705b1809SJason Molenda                     {
640705b1809SJason Molenda                         strm.Printf ("%s", node->GetAsString()->GetValue().c_str());
641705b1809SJason Molenda                         success = true;
642705b1809SJason Molenda                     }
643705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeInteger)
644705b1809SJason Molenda                     {
645705b1809SJason Molenda                         strm.Printf ("0x%" PRIx64, node->GetAsInteger()->GetValue());
646705b1809SJason Molenda                         success = true;
647705b1809SJason Molenda                     }
648705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeFloat)
649705b1809SJason Molenda                     {
650705b1809SJason Molenda                         strm.Printf ("0x%f", node->GetAsFloat()->GetValue());
651705b1809SJason Molenda                         success = true;
652705b1809SJason Molenda                     }
653705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeBoolean)
654705b1809SJason Molenda                     {
655705b1809SJason Molenda                         if (node->GetAsBoolean()->GetValue() == true)
656705b1809SJason Molenda                             strm.Printf ("true");
657705b1809SJason Molenda                         else
658705b1809SJason Molenda                             strm.Printf ("false");
659705b1809SJason Molenda                         success = true;
660705b1809SJason Molenda                     }
661705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeNull)
662705b1809SJason Molenda                     {
663705b1809SJason Molenda                         strm.Printf ("null");
664705b1809SJason Molenda                         success = true;
665705b1809SJason Molenda                     }
666705b1809SJason Molenda                 }
667705b1809SJason Molenda             }
668705b1809SJason Molenda         }
669705b1809SJason Molenda         else
670705b1809SJason Molenda         {
671705b1809SJason Molenda             if (log)
672705b1809SJason Molenda                 log->Printf ("SBThread(%p)::GetInfoItemByPathAsString() => error: process is running",
673705b1809SJason Molenda                              static_cast<void*>(exe_ctx.GetThreadPtr()));
674705b1809SJason Molenda         }
675705b1809SJason Molenda     }
676705b1809SJason Molenda 
677705b1809SJason Molenda     if (log)
678705b1809SJason Molenda         log->Printf ("SBThread(%p)::GetInfoItemByPathAsString () => %s",
679705b1809SJason Molenda                      static_cast<void*>(exe_ctx.GetThreadPtr()),
680705b1809SJason Molenda                      strm.GetData());
681705b1809SJason Molenda 
682705b1809SJason Molenda     return success;
683705b1809SJason Molenda }
684705b1809SJason Molenda 
685705b1809SJason Molenda 
68664e7ead1SJim Ingham SBError
68764e7ead1SJim Ingham SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
68864e7ead1SJim Ingham {
68964e7ead1SJim Ingham     SBError sb_error;
69064e7ead1SJim Ingham 
69164e7ead1SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
69264e7ead1SJim Ingham     if (!process)
69364e7ead1SJim Ingham     {
69464e7ead1SJim Ingham         sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
69564e7ead1SJim Ingham         return sb_error;
69664e7ead1SJim Ingham     }
69764e7ead1SJim Ingham 
69864e7ead1SJim Ingham     Thread *thread = exe_ctx.GetThreadPtr();
69964e7ead1SJim Ingham     if (!thread)
70064e7ead1SJim Ingham     {
70164e7ead1SJim Ingham         sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
70264e7ead1SJim Ingham         return sb_error;
70364e7ead1SJim Ingham     }
70464e7ead1SJim Ingham 
70564e7ead1SJim Ingham     // User level plans should be Master Plans so they can be interrupted, other plans executed, and
70664e7ead1SJim Ingham     // then a "continue" will resume the plan.
70764e7ead1SJim Ingham     if (new_plan != NULL)
70864e7ead1SJim Ingham     {
70964e7ead1SJim Ingham         new_plan->SetIsMasterPlan(true);
71064e7ead1SJim Ingham         new_plan->SetOkayToDiscard(false);
71164e7ead1SJim Ingham     }
71264e7ead1SJim Ingham 
71364e7ead1SJim Ingham     // Why do we need to set the current thread by ID here???
71464e7ead1SJim Ingham     process->GetThreadList().SetSelectedThreadByID (thread->GetID());
71564e7ead1SJim Ingham 
716dc6224e0SGreg Clayton     if (process->GetTarget().GetDebugger().GetAsyncExecution ())
717dc6224e0SGreg Clayton         sb_error.ref() = process->Resume ();
718dc6224e0SGreg Clayton     else
719dc6224e0SGreg Clayton         sb_error.ref() = process->ResumeSynchronous (NULL);
72064e7ead1SJim Ingham 
72164e7ead1SJim Ingham     return sb_error;
72264e7ead1SJim Ingham }
72330fdc8d8SChris Lattner 
72430fdc8d8SChris Lattner void
72530fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
72630fdc8d8SChris Lattner {
7275160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
728ceb6b139SCaroline Tice 
7294fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7304fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7314fc6cb9cSJim Ingham 
73217a6ad05SGreg Clayton 
733ceb6b139SCaroline Tice     if (log)
734324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')",
735324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
736ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
737ceb6b139SCaroline Tice 
7381ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
73930fdc8d8SChris Lattner     {
7401ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
7417ba6e991SJim Ingham         bool abort_other_plans = false;
742b57e4a1bSJason Molenda         StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
74330fdc8d8SChris Lattner 
7444d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp;
74530fdc8d8SChris Lattner         if (frame_sp)
74630fdc8d8SChris Lattner         {
74730fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
74830fdc8d8SChris Lattner             {
7494b4b2478SJim Ingham                 const LazyBool avoid_no_debug = eLazyBoolCalculate;
75030fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
7514d56e9c1SJim Ingham                 new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
75230fdc8d8SChris Lattner                                                                     sc.line_entry.range,
75330fdc8d8SChris Lattner                                                                     sc,
7544b4b2478SJim Ingham                                                                     stop_other_threads,
7554b4b2478SJim Ingham                                                                     avoid_no_debug);
75630fdc8d8SChris Lattner             }
75730fdc8d8SChris Lattner             else
75830fdc8d8SChris Lattner             {
7594d56e9c1SJim Ingham                 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
76030fdc8d8SChris Lattner                                                                                abort_other_plans,
76130fdc8d8SChris Lattner                                                                                stop_other_threads);
76230fdc8d8SChris Lattner             }
76330fdc8d8SChris Lattner         }
76430fdc8d8SChris Lattner 
76564e7ead1SJim Ingham         // This returns an error, we should use it!
7664d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
76730fdc8d8SChris Lattner     }
76830fdc8d8SChris Lattner }
76930fdc8d8SChris Lattner 
77030fdc8d8SChris Lattner void
77130fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
77230fdc8d8SChris Lattner {
773c627682eSJim Ingham     StepInto (NULL, stop_other_threads);
774c627682eSJim Ingham }
775c627682eSJim Ingham 
776c627682eSJim Ingham void
777c627682eSJim Ingham SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
778c627682eSJim Ingham {
7795160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
780ceb6b139SCaroline Tice 
7814fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7824fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
78317a6ad05SGreg Clayton 
78417a6ad05SGreg Clayton     if (log)
785c627682eSJim Ingham         log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
786324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
787c627682eSJim Ingham                      target_name? target_name: "<NULL>",
78817a6ad05SGreg Clayton                      Thread::RunModeAsCString (stop_other_threads));
789c627682eSJim Ingham 
7901ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
79130fdc8d8SChris Lattner     {
7927ba6e991SJim Ingham         bool abort_other_plans = false;
79330fdc8d8SChris Lattner 
7941ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
795b57e4a1bSJason Molenda         StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
7964d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp;
79730fdc8d8SChris Lattner 
79830fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
79930fdc8d8SChris Lattner         {
8004b4b2478SJim Ingham             const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate;
8014b4b2478SJim Ingham             const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate;
80230fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
8034d56e9c1SJim Ingham             new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
80430fdc8d8SChris Lattner                                                               sc.line_entry.range,
80530fdc8d8SChris Lattner                                                               sc,
806c627682eSJim Ingham                                                               target_name,
807474966a4SGreg Clayton                                                               stop_other_threads,
8084b4b2478SJim Ingham                                                               step_in_avoids_code_without_debug_info,
8094b4b2478SJim Ingham                                                               step_out_avoids_code_without_debug_info);
81030fdc8d8SChris Lattner         }
81130fdc8d8SChris Lattner         else
81230fdc8d8SChris Lattner         {
8134d56e9c1SJim Ingham             new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
81430fdc8d8SChris Lattner                                                                            abort_other_plans,
81530fdc8d8SChris Lattner                                                                            stop_other_threads);
81630fdc8d8SChris Lattner         }
81730fdc8d8SChris Lattner 
81864e7ead1SJim Ingham         // This returns an error, we should use it!
8194d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
82030fdc8d8SChris Lattner     }
82130fdc8d8SChris Lattner }
82230fdc8d8SChris Lattner 
82330fdc8d8SChris Lattner void
82430fdc8d8SChris Lattner SBThread::StepOut ()
82530fdc8d8SChris Lattner {
8265160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
827ceb6b139SCaroline Tice 
8284fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8294fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8304fc6cb9cSJim Ingham 
831ceb6b139SCaroline Tice 
83217a6ad05SGreg Clayton     if (log)
833324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOut ()",
834324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()));
83517a6ad05SGreg Clayton 
8361ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
83730fdc8d8SChris Lattner     {
8387ba6e991SJim Ingham         bool abort_other_plans = false;
83994b09246SJim Ingham         bool stop_other_threads = false;
84030fdc8d8SChris Lattner 
8411ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
8421ac04c30SGreg Clayton 
8434b4b2478SJim Ingham         const LazyBool avoid_no_debug = eLazyBoolCalculate;
8444d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
845481cef25SGreg Clayton                                                                     NULL,
846481cef25SGreg Clayton                                                                     false,
847481cef25SGreg Clayton                                                                     stop_other_threads,
848481cef25SGreg Clayton                                                                     eVoteYes,
849481cef25SGreg Clayton                                                                     eVoteNoOpinion,
8504b4b2478SJim Ingham                                                                     0,
8514b4b2478SJim Ingham                                                                     avoid_no_debug));
852481cef25SGreg Clayton 
85364e7ead1SJim Ingham         // This returns an error, we should use it!
8544d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
855481cef25SGreg Clayton     }
856481cef25SGreg Clayton }
857481cef25SGreg Clayton 
858481cef25SGreg Clayton void
859481cef25SGreg Clayton SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
860481cef25SGreg Clayton {
8615160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
862481cef25SGreg Clayton 
8634fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8644fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8654fc6cb9cSJim Ingham 
866b57e4a1bSJason Molenda     StackFrameSP frame_sp (sb_frame.GetFrameSP());
867481cef25SGreg Clayton     if (log)
868481cef25SGreg Clayton     {
869481cef25SGreg Clayton         SBStream frame_desc_strm;
870481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
871324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)",
872324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
873324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
874324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
875481cef25SGreg Clayton     }
876481cef25SGreg Clayton 
8771ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
878481cef25SGreg Clayton     {
8797ba6e991SJim Ingham         bool abort_other_plans = false;
88094b09246SJim Ingham         bool stop_other_threads = false;
8811ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
882481cef25SGreg Clayton 
8834d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
884481cef25SGreg Clayton                                                                     NULL,
885481cef25SGreg Clayton                                                                     false,
886481cef25SGreg Clayton                                                                     stop_other_threads,
887481cef25SGreg Clayton                                                                     eVoteYes,
888481cef25SGreg Clayton                                                                     eVoteNoOpinion,
8894d56e9c1SJim Ingham                                                                     frame_sp->GetFrameIndex()));
89030fdc8d8SChris Lattner 
89164e7ead1SJim Ingham         // This returns an error, we should use it!
8924d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
89330fdc8d8SChris Lattner     }
89430fdc8d8SChris Lattner }
89530fdc8d8SChris Lattner 
89630fdc8d8SChris Lattner void
89730fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
89830fdc8d8SChris Lattner {
8995160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
900ceb6b139SCaroline Tice 
9014fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9024fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9034fc6cb9cSJim Ingham 
9041ac04c30SGreg Clayton 
905ceb6b139SCaroline Tice 
90617a6ad05SGreg Clayton     if (log)
907324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)",
908324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), step_over);
90917a6ad05SGreg Clayton 
9101ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
91130fdc8d8SChris Lattner     {
9121ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
9134d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
91464e7ead1SJim Ingham 
91564e7ead1SJim Ingham         // This returns an error, we should use it!
9164d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
91730fdc8d8SChris Lattner     }
91830fdc8d8SChris Lattner }
91930fdc8d8SChris Lattner 
92030fdc8d8SChris Lattner void
92130fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
92230fdc8d8SChris Lattner {
9235160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
924ceb6b139SCaroline Tice 
9254fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9264fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9274fc6cb9cSJim Ingham 
928ceb6b139SCaroline Tice 
92917a6ad05SGreg Clayton     if (log)
930324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")",
931324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), addr);
93217a6ad05SGreg Clayton 
9331ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
93430fdc8d8SChris Lattner     {
9357ba6e991SJim Ingham         bool abort_other_plans = false;
93630fdc8d8SChris Lattner         bool stop_other_threads = true;
93730fdc8d8SChris Lattner 
938e72dfb32SGreg Clayton         Address target_addr (addr);
93930fdc8d8SChris Lattner 
9401ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
9411ac04c30SGreg Clayton 
9422bdbfd50SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans,
9432bdbfd50SJim Ingham                                                                          target_addr,
9442bdbfd50SJim Ingham                                                                          stop_other_threads));
94564e7ead1SJim Ingham 
94664e7ead1SJim Ingham         // This returns an error, we should use it!
9474d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
94830fdc8d8SChris Lattner     }
94930fdc8d8SChris Lattner }
95030fdc8d8SChris Lattner 
951481cef25SGreg Clayton SBError
952481cef25SGreg Clayton SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
953481cef25SGreg Clayton                          lldb::SBFileSpec &sb_file_spec,
954481cef25SGreg Clayton                          uint32_t line)
955481cef25SGreg Clayton {
956481cef25SGreg Clayton     SBError sb_error;
9575160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
958481cef25SGreg Clayton     char path[PATH_MAX];
959481cef25SGreg Clayton 
9604fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9614fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9624fc6cb9cSJim Ingham 
963b57e4a1bSJason Molenda     StackFrameSP frame_sp (sb_frame.GetFrameSP());
96417a6ad05SGreg Clayton 
965481cef25SGreg Clayton     if (log)
966481cef25SGreg Clayton     {
967481cef25SGreg Clayton         SBStream frame_desc_strm;
968481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
969481cef25SGreg Clayton         sb_file_spec->GetPath (path, sizeof(path));
970481cef25SGreg Clayton         log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
971324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
972324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
973324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData(), path, line);
974481cef25SGreg Clayton     }
975481cef25SGreg Clayton 
9761ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
977481cef25SGreg Clayton     {
9781ac04c30SGreg Clayton         Target *target = exe_ctx.GetTargetPtr();
9791ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
980481cef25SGreg Clayton 
981481cef25SGreg Clayton         if (line == 0)
982481cef25SGreg Clayton         {
983481cef25SGreg Clayton             sb_error.SetErrorString("invalid line argument");
984481cef25SGreg Clayton             return sb_error;
985481cef25SGreg Clayton         }
986481cef25SGreg Clayton 
987b9556accSGreg Clayton         if (!frame_sp)
988481cef25SGreg Clayton         {
9891ac04c30SGreg Clayton             frame_sp = thread->GetSelectedFrame ();
990481cef25SGreg Clayton             if (!frame_sp)
9911ac04c30SGreg Clayton                 frame_sp = thread->GetStackFrameAtIndex (0);
992481cef25SGreg Clayton         }
993481cef25SGreg Clayton 
994481cef25SGreg Clayton         SymbolContext frame_sc;
995481cef25SGreg Clayton         if (!frame_sp)
996481cef25SGreg Clayton         {
997481cef25SGreg Clayton             sb_error.SetErrorString("no valid frames in thread to step");
998481cef25SGreg Clayton             return sb_error;
999481cef25SGreg Clayton         }
1000481cef25SGreg Clayton 
1001481cef25SGreg Clayton         // If we have a frame, get its line
1002481cef25SGreg Clayton         frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit  |
1003481cef25SGreg Clayton                                                eSymbolContextFunction  |
1004481cef25SGreg Clayton                                                eSymbolContextLineEntry |
1005481cef25SGreg Clayton                                                eSymbolContextSymbol    );
1006481cef25SGreg Clayton 
1007481cef25SGreg Clayton         if (frame_sc.comp_unit == NULL)
1008481cef25SGreg Clayton         {
1009481cef25SGreg Clayton             sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
1010481cef25SGreg Clayton             return sb_error;
1011481cef25SGreg Clayton         }
1012481cef25SGreg Clayton 
1013481cef25SGreg Clayton         FileSpec step_file_spec;
1014481cef25SGreg Clayton         if (sb_file_spec.IsValid())
1015481cef25SGreg Clayton         {
1016481cef25SGreg Clayton             // The file spec passed in was valid, so use it
1017481cef25SGreg Clayton             step_file_spec = sb_file_spec.ref();
1018481cef25SGreg Clayton         }
1019481cef25SGreg Clayton         else
1020481cef25SGreg Clayton         {
1021481cef25SGreg Clayton             if (frame_sc.line_entry.IsValid())
1022481cef25SGreg Clayton                 step_file_spec = frame_sc.line_entry.file;
1023481cef25SGreg Clayton             else
1024481cef25SGreg Clayton             {
1025481cef25SGreg Clayton                 sb_error.SetErrorString("invalid file argument or no file for frame");
1026481cef25SGreg Clayton                 return sb_error;
1027481cef25SGreg Clayton             }
1028481cef25SGreg Clayton         }
1029481cef25SGreg Clayton 
10309b70ddb3SJim Ingham         // Grab the current function, then we will make sure the "until" address is
10319b70ddb3SJim Ingham         // within the function.  We discard addresses that are out of the current
10329b70ddb3SJim Ingham         // function, and then if there are no addresses remaining, give an appropriate
10339b70ddb3SJim Ingham         // error message.
10349b70ddb3SJim Ingham 
10359b70ddb3SJim Ingham         bool all_in_function = true;
10369b70ddb3SJim Ingham         AddressRange fun_range = frame_sc.function->GetAddressRange();
10379b70ddb3SJim Ingham 
1038481cef25SGreg Clayton         std::vector<addr_t> step_over_until_addrs;
10397ba6e991SJim Ingham         const bool abort_other_plans = false;
1040c02e3344SJim Ingham         const bool stop_other_threads = false;
1041481cef25SGreg Clayton         const bool check_inlines = true;
1042481cef25SGreg Clayton         const bool exact = false;
1043481cef25SGreg Clayton 
1044481cef25SGreg Clayton         SymbolContextList sc_list;
10459b70ddb3SJim Ingham         const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
10469b70ddb3SJim Ingham                                                                                line,
10479b70ddb3SJim Ingham                                                                                check_inlines,
10489b70ddb3SJim Ingham                                                                                exact,
10499b70ddb3SJim Ingham                                                                                eSymbolContextLineEntry,
10509b70ddb3SJim Ingham                                                                                sc_list);
1051481cef25SGreg Clayton         if (num_matches > 0)
1052481cef25SGreg Clayton         {
1053481cef25SGreg Clayton             SymbolContext sc;
1054481cef25SGreg Clayton             for (uint32_t i=0; i<num_matches; ++i)
1055481cef25SGreg Clayton             {
1056481cef25SGreg Clayton                 if (sc_list.GetContextAtIndex(i, sc))
1057481cef25SGreg Clayton                 {
10589b70ddb3SJim Ingham                     addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
1059481cef25SGreg Clayton                     if (step_addr != LLDB_INVALID_ADDRESS)
1060481cef25SGreg Clayton                     {
10619b70ddb3SJim Ingham                         if (fun_range.ContainsLoadAddress(step_addr, target))
1062481cef25SGreg Clayton                             step_over_until_addrs.push_back(step_addr);
10639b70ddb3SJim Ingham                         else
10649b70ddb3SJim Ingham                             all_in_function = false;
1065481cef25SGreg Clayton                     }
1066481cef25SGreg Clayton                 }
1067481cef25SGreg Clayton             }
1068481cef25SGreg Clayton         }
1069481cef25SGreg Clayton 
1070481cef25SGreg Clayton         if (step_over_until_addrs.empty())
1071481cef25SGreg Clayton         {
10729b70ddb3SJim Ingham             if (all_in_function)
10739b70ddb3SJim Ingham             {
1074481cef25SGreg Clayton                 step_file_spec.GetPath (path, sizeof(path));
1075fd54b368SJason Molenda                 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
1076481cef25SGreg Clayton             }
1077481cef25SGreg Clayton             else
107886edbf41SGreg Clayton                 sb_error.SetErrorString ("step until target not in current function");
10799b70ddb3SJim Ingham         }
10809b70ddb3SJim Ingham         else
1081481cef25SGreg Clayton         {
10824d56e9c1SJim Ingham             ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
1083481cef25SGreg Clayton                                                                         &step_over_until_addrs[0],
1084481cef25SGreg Clayton                                                                         step_over_until_addrs.size(),
1085481cef25SGreg Clayton                                                                         stop_other_threads,
10864d56e9c1SJim Ingham                                                                         frame_sp->GetFrameIndex()));
1087481cef25SGreg Clayton 
10884d56e9c1SJim Ingham             sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
1089481cef25SGreg Clayton         }
1090481cef25SGreg Clayton     }
1091481cef25SGreg Clayton     else
1092481cef25SGreg Clayton     {
1093481cef25SGreg Clayton         sb_error.SetErrorString("this SBThread object is invalid");
1094481cef25SGreg Clayton     }
1095481cef25SGreg Clayton     return sb_error;
1096481cef25SGreg Clayton }
1097481cef25SGreg Clayton 
10984413758cSJim Ingham SBError
10992bdbfd50SJim Ingham SBThread::StepUsingScriptedThreadPlan (const char *script_class_name)
11002bdbfd50SJim Ingham {
11012bdbfd50SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11022bdbfd50SJim Ingham     SBError sb_error;
11032bdbfd50SJim Ingham 
11042bdbfd50SJim Ingham     Mutex::Locker api_locker;
11052bdbfd50SJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11062bdbfd50SJim Ingham 
11072bdbfd50SJim Ingham     if (log)
11082bdbfd50SJim Ingham     {
11092bdbfd50SJim Ingham         log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s",
11102bdbfd50SJim Ingham                      static_cast<void*>(exe_ctx.GetThreadPtr()),
11112bdbfd50SJim Ingham                      script_class_name);
11122bdbfd50SJim Ingham     }
11132bdbfd50SJim Ingham 
11142bdbfd50SJim Ingham 
11152bdbfd50SJim Ingham     if (!exe_ctx.HasThreadScope())
11162bdbfd50SJim Ingham     {
11172bdbfd50SJim Ingham         sb_error.SetErrorString("this SBThread object is invalid");
11182bdbfd50SJim Ingham         return sb_error;
11192bdbfd50SJim Ingham     }
11202bdbfd50SJim Ingham 
11212bdbfd50SJim Ingham     Thread *thread = exe_ctx.GetThreadPtr();
11222bdbfd50SJim Ingham     ThreadPlanSP thread_plan_sp = thread->QueueThreadPlanForStepScripted(false, script_class_name, false);
11232bdbfd50SJim Ingham 
11242bdbfd50SJim Ingham     if (thread_plan_sp)
11252bdbfd50SJim Ingham         sb_error = ResumeNewPlan(exe_ctx, thread_plan_sp.get());
11262bdbfd50SJim Ingham     else
11272bdbfd50SJim Ingham     {
11282bdbfd50SJim Ingham         sb_error.SetErrorStringWithFormat("Error queuing thread plan for class: %s.", script_class_name);
11292bdbfd50SJim Ingham         if (log)
11302bdbfd50SJim Ingham         log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: Error queuing thread plan for class: %s",
11312bdbfd50SJim Ingham                      static_cast<void*>(exe_ctx.GetThreadPtr()),
11322bdbfd50SJim Ingham                      script_class_name);
11332bdbfd50SJim Ingham     }
11342bdbfd50SJim Ingham 
11352bdbfd50SJim Ingham     return sb_error;
11362bdbfd50SJim Ingham }
11372bdbfd50SJim Ingham 
11382bdbfd50SJim Ingham SBError
1139f86248d9SRichard Mitton SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line)
1140f86248d9SRichard Mitton {
1141f86248d9SRichard Mitton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1142f86248d9SRichard Mitton     SBError sb_error;
1143f86248d9SRichard Mitton 
1144f86248d9SRichard Mitton     Mutex::Locker api_locker;
1145f86248d9SRichard Mitton     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1146f86248d9SRichard Mitton 
1147f86248d9SRichard Mitton     if (log)
1148324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)",
1149324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1150324a1036SSaleem Abdulrasool                      file_spec->GetPath().c_str(), line);
1151f86248d9SRichard Mitton 
1152f86248d9SRichard Mitton     if (!exe_ctx.HasThreadScope())
1153f86248d9SRichard Mitton     {
1154f86248d9SRichard Mitton         sb_error.SetErrorString("this SBThread object is invalid");
1155f86248d9SRichard Mitton         return sb_error;
1156f86248d9SRichard Mitton     }
1157f86248d9SRichard Mitton 
1158f86248d9SRichard Mitton     Thread *thread = exe_ctx.GetThreadPtr();
1159f86248d9SRichard Mitton 
1160f86248d9SRichard Mitton     Error err = thread->JumpToLine (file_spec.get(), line, true);
1161f86248d9SRichard Mitton     sb_error.SetError (err);
1162f86248d9SRichard Mitton     return sb_error;
1163f86248d9SRichard Mitton }
1164f86248d9SRichard Mitton 
1165f86248d9SRichard Mitton SBError
1166cb640dd8SJim Ingham SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
11674413758cSJim Ingham {
11684413758cSJim Ingham     SBError sb_error;
11694413758cSJim Ingham 
11705160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11714413758cSJim Ingham 
11724413758cSJim Ingham     Mutex::Locker api_locker;
11734413758cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11744413758cSJim Ingham 
11754413758cSJim Ingham 
11764413758cSJim Ingham     if (log)
1177324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)",
1178324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1179324a1036SSaleem Abdulrasool                      frame.GetFrameID());
11804413758cSJim Ingham 
11814413758cSJim Ingham     if (exe_ctx.HasThreadScope())
11824413758cSJim Ingham     {
11834413758cSJim Ingham         Thread *thread = exe_ctx.GetThreadPtr();
1184cb640dd8SJim Ingham         sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
11854413758cSJim Ingham     }
11864413758cSJim Ingham 
11874413758cSJim Ingham     return sb_error;
11884413758cSJim Ingham }
11894413758cSJim Ingham 
1190481cef25SGreg Clayton 
1191722a0cdcSGreg Clayton bool
1192722a0cdcSGreg Clayton SBThread::Suspend()
1193722a0cdcSGreg Clayton {
11945160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11957fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
1196c9858e4dSGreg Clayton     bool result = false;
11971ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1198722a0cdcSGreg Clayton     {
1199c9858e4dSGreg Clayton         Process::StopLocker stop_locker;
1200c9858e4dSGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1201c9858e4dSGreg Clayton         {
12021ac04c30SGreg Clayton             exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
1203c9858e4dSGreg Clayton             result = true;
1204722a0cdcSGreg Clayton         }
1205c9858e4dSGreg Clayton         else
1206c9858e4dSGreg Clayton         {
1207c9858e4dSGreg Clayton             if (log)
1208324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::Suspend() => error: process is running",
1209324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1210c9858e4dSGreg Clayton         }
1211c9858e4dSGreg Clayton     }
1212c9858e4dSGreg Clayton     if (log)
1213324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::Suspend() => %i",
1214324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), result);
1215c9858e4dSGreg Clayton     return result;
1216722a0cdcSGreg Clayton }
1217722a0cdcSGreg Clayton 
1218722a0cdcSGreg Clayton bool
1219722a0cdcSGreg Clayton SBThread::Resume ()
1220722a0cdcSGreg Clayton {
12215160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
12227fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
1223c9858e4dSGreg Clayton     bool result = false;
12241ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1225722a0cdcSGreg Clayton     {
1226c9858e4dSGreg Clayton         Process::StopLocker stop_locker;
1227c9858e4dSGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1228c9858e4dSGreg Clayton         {
12296c9ed91cSJim Ingham             const bool override_suspend = true;
12306c9ed91cSJim Ingham             exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend);
1231c9858e4dSGreg Clayton             result = true;
1232722a0cdcSGreg Clayton         }
1233c9858e4dSGreg Clayton         else
1234c9858e4dSGreg Clayton         {
1235c9858e4dSGreg Clayton             if (log)
1236324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::Resume() => error: process is running",
1237324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1238c9858e4dSGreg Clayton         }
1239c9858e4dSGreg Clayton     }
1240c9858e4dSGreg Clayton     if (log)
1241324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::Resume() => %i",
1242324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), result);
1243c9858e4dSGreg Clayton     return result;
1244722a0cdcSGreg Clayton }
1245722a0cdcSGreg Clayton 
1246722a0cdcSGreg Clayton bool
1247722a0cdcSGreg Clayton SBThread::IsSuspended()
1248722a0cdcSGreg Clayton {
12497fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
12501ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
12511ac04c30SGreg Clayton         return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
1252722a0cdcSGreg Clayton     return false;
1253722a0cdcSGreg Clayton }
1254722a0cdcSGreg Clayton 
1255a75418dbSAndrew Kaylor bool
1256a75418dbSAndrew Kaylor SBThread::IsStopped()
1257a75418dbSAndrew Kaylor {
1258a75418dbSAndrew Kaylor     ExecutionContext exe_ctx (m_opaque_sp.get());
1259a75418dbSAndrew Kaylor     if (exe_ctx.HasThreadScope())
1260a75418dbSAndrew Kaylor         return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1261a75418dbSAndrew Kaylor     return false;
1262a75418dbSAndrew Kaylor }
1263a75418dbSAndrew Kaylor 
126430fdc8d8SChris Lattner SBProcess
126530fdc8d8SChris Lattner SBThread::GetProcess ()
126630fdc8d8SChris Lattner {
1267b9556accSGreg Clayton     SBProcess sb_process;
12687fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
12691ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
127030fdc8d8SChris Lattner     {
127130fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
12721ac04c30SGreg Clayton         sb_process.SetSP (exe_ctx.GetProcessSP());
127330fdc8d8SChris Lattner     }
1274ceb6b139SCaroline Tice 
12755160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1276ceb6b139SCaroline Tice     if (log)
1277ceb6b139SCaroline Tice     {
1278481cef25SGreg Clayton         SBStream frame_desc_strm;
1279b9556accSGreg Clayton         sb_process.GetDescription (frame_desc_strm);
1280324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s",
1281324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1282324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_process.GetSP().get()),
1283324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1284ceb6b139SCaroline Tice     }
1285ceb6b139SCaroline Tice 
1286b9556accSGreg Clayton     return sb_process;
128730fdc8d8SChris Lattner }
128830fdc8d8SChris Lattner 
128930fdc8d8SChris Lattner uint32_t
129030fdc8d8SChris Lattner SBThread::GetNumFrames ()
129130fdc8d8SChris Lattner {
12925160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1293ceb6b139SCaroline Tice 
1294ceb6b139SCaroline Tice     uint32_t num_frames = 0;
12954fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12964fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12974fc6cb9cSJim Ingham 
12981ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1299af67cecdSGreg Clayton     {
13007fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13017fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13027fdf9ef1SGreg Clayton         {
13031ac04c30SGreg Clayton             num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1304af67cecdSGreg Clayton         }
1305c9858e4dSGreg Clayton         else
1306c9858e4dSGreg Clayton         {
1307c9858e4dSGreg Clayton             if (log)
1308324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running",
1309324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1310c9858e4dSGreg Clayton         }
13117fdf9ef1SGreg Clayton     }
1312ceb6b139SCaroline Tice 
1313ceb6b139SCaroline Tice     if (log)
1314324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetNumFrames () => %u",
1315324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames);
1316ceb6b139SCaroline Tice 
1317ceb6b139SCaroline Tice     return num_frames;
131830fdc8d8SChris Lattner }
131930fdc8d8SChris Lattner 
132030fdc8d8SChris Lattner SBFrame
132130fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
132230fdc8d8SChris Lattner {
13235160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1324ceb6b139SCaroline Tice 
132530fdc8d8SChris Lattner     SBFrame sb_frame;
1326b57e4a1bSJason Molenda     StackFrameSP frame_sp;
13274fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13284fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13294fc6cb9cSJim Ingham 
13301ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1331af67cecdSGreg Clayton     {
13327fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13337fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13347fdf9ef1SGreg Clayton         {
13351ac04c30SGreg Clayton             frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1336b9556accSGreg Clayton             sb_frame.SetFrameSP (frame_sp);
1337af67cecdSGreg Clayton         }
1338c9858e4dSGreg Clayton         else
1339c9858e4dSGreg Clayton         {
1340c9858e4dSGreg Clayton             if (log)
1341324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running",
1342324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1343c9858e4dSGreg Clayton         }
13447fdf9ef1SGreg Clayton     }
1345ceb6b139SCaroline Tice 
1346ceb6b139SCaroline Tice     if (log)
1347ceb6b139SCaroline Tice     {
1348481cef25SGreg Clayton         SBStream frame_desc_strm;
1349481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
13504838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
1351324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1352324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1353324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1354ceb6b139SCaroline Tice     }
1355ceb6b139SCaroline Tice 
135630fdc8d8SChris Lattner     return sb_frame;
135730fdc8d8SChris Lattner }
135830fdc8d8SChris Lattner 
1359f028a1fbSGreg Clayton lldb::SBFrame
1360f028a1fbSGreg Clayton SBThread::GetSelectedFrame ()
1361f028a1fbSGreg Clayton {
13625160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1363f028a1fbSGreg Clayton 
1364f028a1fbSGreg Clayton     SBFrame sb_frame;
1365b57e4a1bSJason Molenda     StackFrameSP frame_sp;
13664fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13674fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13684fc6cb9cSJim Ingham 
13691ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1370af67cecdSGreg Clayton     {
13717fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13727fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13737fdf9ef1SGreg Clayton         {
13741ac04c30SGreg Clayton             frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1375b9556accSGreg Clayton             sb_frame.SetFrameSP (frame_sp);
1376af67cecdSGreg Clayton         }
1377c9858e4dSGreg Clayton         else
1378c9858e4dSGreg Clayton         {
1379c9858e4dSGreg Clayton             if (log)
1380324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running",
1381324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1382c9858e4dSGreg Clayton         }
13837fdf9ef1SGreg Clayton     }
1384f028a1fbSGreg Clayton 
1385f028a1fbSGreg Clayton     if (log)
1386f028a1fbSGreg Clayton     {
1387481cef25SGreg Clayton         SBStream frame_desc_strm;
1388481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
1389f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
1390324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1391324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1392324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1393f028a1fbSGreg Clayton     }
1394f028a1fbSGreg Clayton 
1395f028a1fbSGreg Clayton     return sb_frame;
1396f028a1fbSGreg Clayton }
1397f028a1fbSGreg Clayton 
1398f028a1fbSGreg Clayton lldb::SBFrame
1399f028a1fbSGreg Clayton SBThread::SetSelectedFrame (uint32_t idx)
1400f028a1fbSGreg Clayton {
14015160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1402f028a1fbSGreg Clayton 
1403f028a1fbSGreg Clayton     SBFrame sb_frame;
1404b57e4a1bSJason Molenda     StackFrameSP frame_sp;
14054fc6cb9cSJim Ingham     Mutex::Locker api_locker;
14064fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14074fc6cb9cSJim Ingham 
14081ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1409f028a1fbSGreg Clayton     {
14107fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14117fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
14127fdf9ef1SGreg Clayton         {
14131ac04c30SGreg Clayton             Thread *thread = exe_ctx.GetThreadPtr();
14141ac04c30SGreg Clayton             frame_sp = thread->GetStackFrameAtIndex (idx);
1415f028a1fbSGreg Clayton             if (frame_sp)
1416f028a1fbSGreg Clayton             {
14171ac04c30SGreg Clayton                 thread->SetSelectedFrame (frame_sp.get());
1418b9556accSGreg Clayton                 sb_frame.SetFrameSP (frame_sp);
1419f028a1fbSGreg Clayton             }
1420f028a1fbSGreg Clayton         }
1421c9858e4dSGreg Clayton         else
1422c9858e4dSGreg Clayton         {
1423c9858e4dSGreg Clayton             if (log)
1424324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running",
1425324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1426c9858e4dSGreg Clayton         }
14277fdf9ef1SGreg Clayton     }
1428f028a1fbSGreg Clayton 
1429f028a1fbSGreg Clayton     if (log)
1430f028a1fbSGreg Clayton     {
1431481cef25SGreg Clayton         SBStream frame_desc_strm;
1432481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
1433f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
1434324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1435324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1436324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1437f028a1fbSGreg Clayton     }
1438f028a1fbSGreg Clayton     return sb_frame;
1439f028a1fbSGreg Clayton }
1440f028a1fbSGreg Clayton 
14414f465cffSJim Ingham bool
14424f465cffSJim Ingham SBThread::EventIsThreadEvent (const SBEvent &event)
14434f465cffSJim Ingham {
14444f465cffSJim Ingham     return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
14454f465cffSJim Ingham }
14464f465cffSJim Ingham 
14474f465cffSJim Ingham SBFrame
14484f465cffSJim Ingham SBThread::GetStackFrameFromEvent (const SBEvent &event)
14494f465cffSJim Ingham {
14504f465cffSJim Ingham     return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
14514f465cffSJim Ingham 
14524f465cffSJim Ingham }
14534f465cffSJim Ingham 
14544f465cffSJim Ingham SBThread
14554f465cffSJim Ingham SBThread::GetThreadFromEvent (const SBEvent &event)
14564f465cffSJim Ingham {
14574f465cffSJim Ingham     return Thread::ThreadEventData::GetThreadFromEvent (event.get());
14584f465cffSJim Ingham }
1459f028a1fbSGreg Clayton 
146030fdc8d8SChris Lattner bool
146130fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
146230fdc8d8SChris Lattner {
14637fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
146430fdc8d8SChris Lattner }
146530fdc8d8SChris Lattner 
146630fdc8d8SChris Lattner bool
146730fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
146830fdc8d8SChris Lattner {
14697fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
147030fdc8d8SChris Lattner }
1471dde9cff3SCaroline Tice 
1472dde9cff3SCaroline Tice bool
14734f465cffSJim Ingham SBThread::GetStatus (SBStream &status) const
14744f465cffSJim Ingham {
14754f465cffSJim Ingham     Stream &strm = status.ref();
14764f465cffSJim Ingham 
14774f465cffSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get());
14784f465cffSJim Ingham     if (exe_ctx.HasThreadScope())
14794f465cffSJim Ingham     {
14804f465cffSJim Ingham         exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
14814f465cffSJim Ingham     }
14824f465cffSJim Ingham     else
14834f465cffSJim Ingham         strm.PutCString ("No status");
14844f465cffSJim Ingham 
14854f465cffSJim Ingham     return true;
14864f465cffSJim Ingham }
14874f465cffSJim Ingham 
14884f465cffSJim Ingham bool
1489ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
1490ceb6b139SCaroline Tice {
1491da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1492da7bc7d0SGreg Clayton 
14937fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
14941ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1495ceb6b139SCaroline Tice     {
1496603985fcSJim Ingham         exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, LLDB_INVALID_THREAD_ID);
1497603985fcSJim Ingham         //strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
1498ceb6b139SCaroline Tice     }
1499ceb6b139SCaroline Tice     else
1500da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1501ceb6b139SCaroline Tice 
1502ceb6b139SCaroline Tice     return true;
1503ceb6b139SCaroline Tice }
15045dd4916fSJason Molenda 
15055dd4916fSJason Molenda SBThread
1506008c45f1SJason Molenda SBThread::GetExtendedBacktraceThread (const char *type)
15075dd4916fSJason Molenda {
15085dd4916fSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15095dd4916fSJason Molenda     Mutex::Locker api_locker;
15105dd4916fSJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
15115dd4916fSJason Molenda     SBThread sb_origin_thread;
15125dd4916fSJason Molenda 
15135dd4916fSJason Molenda     if (exe_ctx.HasThreadScope())
15145dd4916fSJason Molenda     {
15155dd4916fSJason Molenda         Process::StopLocker stop_locker;
15165dd4916fSJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
15175dd4916fSJason Molenda         {
15187a2f7904SJason Molenda             ThreadSP real_thread(exe_ctx.GetThreadSP());
15195dd4916fSJason Molenda             if (real_thread)
15205dd4916fSJason Molenda             {
15215dd4916fSJason Molenda                 ConstString type_const (type);
15227a2f7904SJason Molenda                 Process *process = exe_ctx.GetProcessPtr();
15237a2f7904SJason Molenda                 if (process)
15247a2f7904SJason Molenda                 {
15257a2f7904SJason Molenda                     SystemRuntime *runtime = process->GetSystemRuntime();
15265dd4916fSJason Molenda                     if (runtime)
15275dd4916fSJason Molenda                     {
1528008c45f1SJason Molenda                         ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const));
1529a6e9130dSJason Molenda                         if (new_thread_sp)
1530a6e9130dSJason Molenda                         {
15317a2f7904SJason Molenda                             // Save this in the Process' ExtendedThreadList so a strong pointer retains the
15327a2f7904SJason Molenda                             // object.
15337a2f7904SJason Molenda                             process->GetExtendedThreadList().AddThread (new_thread_sp);
15347a2f7904SJason Molenda                             sb_origin_thread.SetThread (new_thread_sp);
1535a6e9130dSJason Molenda                             if (log)
1536a6e9130dSJason Molenda                             {
1537a6e9130dSJason Molenda                                 const char *queue_name = new_thread_sp->GetQueueName();
1538a6e9130dSJason Molenda                                 if (queue_name == NULL)
1539a6e9130dSJason Molenda                                     queue_name = "";
15402bdbfd50SJim Ingham                                 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread "
15412bdbfd50SJim Ingham                                              "created (%p) with queue_id 0x%" PRIx64 " queue name '%s'",
1542324a1036SSaleem Abdulrasool                                              static_cast<void*>(exe_ctx.GetThreadPtr()),
1543324a1036SSaleem Abdulrasool                                              static_cast<void*>(new_thread_sp.get()),
1544324a1036SSaleem Abdulrasool                                              new_thread_sp->GetQueueID(),
1545324a1036SSaleem Abdulrasool                                              queue_name);
1546a6e9130dSJason Molenda                             }
1547a6e9130dSJason Molenda                         }
15487a2f7904SJason Molenda                     }
15495dd4916fSJason Molenda                 }
15505dd4916fSJason Molenda             }
15515dd4916fSJason Molenda         }
15525dd4916fSJason Molenda         else
15535dd4916fSJason Molenda         {
15545dd4916fSJason Molenda             if (log)
1555324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running",
1556324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
15575dd4916fSJason Molenda         }
15585dd4916fSJason Molenda     }
15595dd4916fSJason Molenda 
1560ac605f4aSJason Molenda     if (log && sb_origin_thread.IsValid() == false)
1561324a1036SSaleem Abdulrasool         log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread",
1562324a1036SSaleem Abdulrasool                     static_cast<void*>(exe_ctx.GetThreadPtr()));
15635dd4916fSJason Molenda     return sb_origin_thread;
15645dd4916fSJason Molenda }
15658ee9cb58SJason Molenda 
15668ee9cb58SJason Molenda uint32_t
15678ee9cb58SJason Molenda SBThread::GetExtendedBacktraceOriginatingIndexID ()
15688ee9cb58SJason Molenda {
15698ee9cb58SJason Molenda     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
15708ee9cb58SJason Molenda     if (thread_sp)
15718ee9cb58SJason Molenda         return thread_sp->GetExtendedBacktraceOriginatingIndexID();
15728ee9cb58SJason Molenda     return LLDB_INVALID_INDEX32;
15738ee9cb58SJason Molenda }
1574b4892cd2SJason Molenda 
1575b4892cd2SJason Molenda bool
1576b4892cd2SJason Molenda SBThread::SafeToCallFunctions ()
1577b4892cd2SJason Molenda {
1578b4892cd2SJason Molenda     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1579b4892cd2SJason Molenda     if (thread_sp)
1580b4892cd2SJason Molenda         return thread_sp->SafeToCallFunctions();
1581b4892cd2SJason Molenda     return true;
1582b4892cd2SJason Molenda }
15832bdbfd50SJim Ingham 
15842bdbfd50SJim Ingham lldb_private::Thread *
15852bdbfd50SJim Ingham SBThread::operator->()
15862bdbfd50SJim Ingham {
15872bdbfd50SJim Ingham     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
15882bdbfd50SJim Ingham     if (thread_sp)
15892bdbfd50SJim Ingham         return thread_sp.get();
15902bdbfd50SJim Ingham     else
15912bdbfd50SJim Ingham         return NULL;
15922bdbfd50SJim Ingham }
15932bdbfd50SJim Ingham 
15942bdbfd50SJim Ingham lldb_private::Thread *
15952bdbfd50SJim Ingham SBThread::get()
15962bdbfd50SJim Ingham {
15972bdbfd50SJim Ingham     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
15982bdbfd50SJim Ingham     if (thread_sp)
15992bdbfd50SJim Ingham         return thread_sp.get();
16002bdbfd50SJim Ingham     else
16012bdbfd50SJim Ingham         return NULL;
16022bdbfd50SJim Ingham }
16032bdbfd50SJim Ingham 
1604