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"
236611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
245dd4916fSJason Molenda #include "lldb/Target/SystemRuntime.h"
2530fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
2630fdc8d8SChris Lattner #include "lldb/Target/Process.h"
27b9ffa98cSJason Molenda #include "lldb/Target/Queue.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
30f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h"
3130fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3230fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h"
3330fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h"
3430fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h"
3530fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h"
3630fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInRange.h"
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner 
394c5de699SEli Friedman #include "lldb/API/SBAddress.h"
404c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
414f465cffSJim Ingham #include "lldb/API/SBEvent.h"
4273ca05a2SJim Ingham #include "lldb/API/SBFrame.h"
434c5de699SEli Friedman #include "lldb/API/SBProcess.h"
44*2bdbfd50SJim Ingham #include "lldb/API/SBThreadPlan.h"
4573ca05a2SJim Ingham #include "lldb/API/SBValue.h"
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner using namespace lldb;
4830fdc8d8SChris Lattner using namespace lldb_private;
4930fdc8d8SChris Lattner 
504f465cffSJim Ingham const char *
514f465cffSJim Ingham SBThread::GetBroadcasterClassName ()
524f465cffSJim Ingham {
534f465cffSJim Ingham     return Thread::GetStaticBroadcasterClass().AsCString();
544f465cffSJim Ingham }
554f465cffSJim Ingham 
56cfd1acedSGreg Clayton //----------------------------------------------------------------------
57cfd1acedSGreg Clayton // Constructors
58cfd1acedSGreg Clayton //----------------------------------------------------------------------
5930fdc8d8SChris Lattner SBThread::SBThread () :
607fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
6130fdc8d8SChris Lattner {
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) :
657fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef(lldb_object_sp))
6630fdc8d8SChris Lattner {
6730fdc8d8SChris Lattner }
6830fdc8d8SChris Lattner 
6992ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) :
707fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp))
7130fdc8d8SChris Lattner {
727fdf9ef1SGreg Clayton 
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
7530fdc8d8SChris Lattner //----------------------------------------------------------------------
76cfd1acedSGreg Clayton // Assignment operator
77cfd1acedSGreg Clayton //----------------------------------------------------------------------
78cfd1acedSGreg Clayton 
79cfd1acedSGreg Clayton const lldb::SBThread &
80cfd1acedSGreg Clayton SBThread::operator = (const SBThread &rhs)
81cfd1acedSGreg Clayton {
82cfd1acedSGreg Clayton     if (this != &rhs)
837fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
84cfd1acedSGreg Clayton     return *this;
85cfd1acedSGreg Clayton }
86cfd1acedSGreg Clayton 
87cfd1acedSGreg Clayton //----------------------------------------------------------------------
8830fdc8d8SChris Lattner // Destructor
8930fdc8d8SChris Lattner //----------------------------------------------------------------------
9030fdc8d8SChris Lattner SBThread::~SBThread()
9130fdc8d8SChris Lattner {
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
94b9ffa98cSJason Molenda lldb::SBQueue
95b9ffa98cSJason Molenda SBThread::GetQueue () const
96b9ffa98cSJason Molenda {
97b9ffa98cSJason Molenda     SBQueue sb_queue;
98b9ffa98cSJason Molenda     QueueSP queue_sp;
99b9ffa98cSJason Molenda     Mutex::Locker api_locker;
100b9ffa98cSJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
101b9ffa98cSJason Molenda 
102b9ffa98cSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
103b9ffa98cSJason Molenda     if (exe_ctx.HasThreadScope())
104b9ffa98cSJason Molenda     {
105b9ffa98cSJason Molenda         Process::StopLocker stop_locker;
106b9ffa98cSJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
107b9ffa98cSJason Molenda         {
108b9ffa98cSJason Molenda             queue_sp = exe_ctx.GetThreadPtr()->GetQueue();
109b9ffa98cSJason Molenda             if (queue_sp)
110b9ffa98cSJason Molenda             {
111b9ffa98cSJason Molenda                 sb_queue.SetQueue (queue_sp);
112b9ffa98cSJason Molenda             }
113b9ffa98cSJason Molenda         }
114b9ffa98cSJason Molenda         else
115b9ffa98cSJason Molenda         {
116b9ffa98cSJason Molenda             if (log)
117b9ffa98cSJason Molenda                 log->Printf ("SBThread(%p)::GetQueueKind() => error: process is running",
118b9ffa98cSJason Molenda                              static_cast<void*>(exe_ctx.GetThreadPtr()));
119b9ffa98cSJason Molenda         }
120b9ffa98cSJason Molenda     }
121b9ffa98cSJason Molenda 
122b9ffa98cSJason Molenda     if (log)
123b9ffa98cSJason Molenda         log->Printf ("SBThread(%p)::GetQueueKind () => SBQueue(%p)",
124b9ffa98cSJason Molenda                      static_cast<void*>(exe_ctx.GetThreadPtr()), static_cast<void*>(queue_sp.get()));
125b9ffa98cSJason Molenda 
126b9ffa98cSJason Molenda     return sb_queue;
127b9ffa98cSJason Molenda }
128b9ffa98cSJason Molenda 
129b9ffa98cSJason Molenda 
13030fdc8d8SChris Lattner bool
13130fdc8d8SChris Lattner SBThread::IsValid() const
13230fdc8d8SChris Lattner {
1337fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() != NULL;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13648e42549SGreg Clayton void
13748e42549SGreg Clayton SBThread::Clear ()
13848e42549SGreg Clayton {
1397fdf9ef1SGreg Clayton     m_opaque_sp->Clear();
14048e42549SGreg Clayton }
14148e42549SGreg Clayton 
14248e42549SGreg Clayton 
14330fdc8d8SChris Lattner StopReason
14430fdc8d8SChris Lattner SBThread::GetStopReason()
14530fdc8d8SChris Lattner {
1465160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
147ceb6b139SCaroline Tice 
148ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
1494fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1504fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1514fc6cb9cSJim Ingham 
1521ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
15330fdc8d8SChris Lattner     {
1547fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1557fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1567fdf9ef1SGreg Clayton         {
15797d5cf05SGreg Clayton             return exe_ctx.GetThreadPtr()->GetStopReason();
15830fdc8d8SChris Lattner         }
159c9858e4dSGreg Clayton         else
160c9858e4dSGreg Clayton         {
161c9858e4dSGreg Clayton             if (log)
162324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReason() => error: process is running",
163324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
164c9858e4dSGreg Clayton         }
1657fdf9ef1SGreg Clayton     }
166ceb6b139SCaroline Tice 
167ceb6b139SCaroline Tice     if (log)
168324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetStopReason () => %s",
169324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
170750cd175SCaroline Tice                      Thread::StopReasonAsCString (reason));
171ceb6b139SCaroline Tice 
172ceb6b139SCaroline Tice     return reason;
17330fdc8d8SChris Lattner }
17430fdc8d8SChris Lattner 
17530fdc8d8SChris Lattner size_t
1764e78f606SGreg Clayton SBThread::GetStopReasonDataCount ()
1774e78f606SGreg Clayton {
1784fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1794fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1804fc6cb9cSJim Ingham 
1811ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1824e78f606SGreg Clayton     {
1837fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1847fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1857fdf9ef1SGreg Clayton         {
1861ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
1874e78f606SGreg Clayton             if (stop_info_sp)
1884e78f606SGreg Clayton             {
1894e78f606SGreg Clayton                 StopReason reason = stop_info_sp->GetStopReason();
1904e78f606SGreg Clayton                 switch (reason)
1914e78f606SGreg Clayton                 {
1924e78f606SGreg Clayton                 case eStopReasonInvalid:
1934e78f606SGreg Clayton                 case eStopReasonNone:
1944e78f606SGreg Clayton                 case eStopReasonTrace:
19590ba8115SGreg Clayton                 case eStopReasonExec:
1964e78f606SGreg Clayton                 case eStopReasonPlanComplete:
197f85defaeSAndrew Kaylor                 case eStopReasonThreadExiting:
1984e78f606SGreg Clayton                     // There is no data for these stop reasons.
1994e78f606SGreg Clayton                     return 0;
2004e78f606SGreg Clayton 
2014e78f606SGreg Clayton                 case eStopReasonBreakpoint:
2024e78f606SGreg Clayton                     {
2034e78f606SGreg Clayton                         break_id_t site_id = stop_info_sp->GetValue();
2041ac04c30SGreg Clayton                         lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
2054e78f606SGreg Clayton                         if (bp_site_sp)
2064e78f606SGreg Clayton                             return bp_site_sp->GetNumberOfOwners () * 2;
2074e78f606SGreg Clayton                         else
2084e78f606SGreg Clayton                             return 0; // Breakpoint must have cleared itself...
2094e78f606SGreg Clayton                     }
2104e78f606SGreg Clayton                     break;
2114e78f606SGreg Clayton 
2124e78f606SGreg Clayton                 case eStopReasonWatchpoint:
213290fa41bSJohnny Chen                     return 1;
2144e78f606SGreg Clayton 
2154e78f606SGreg Clayton                 case eStopReasonSignal:
2164e78f606SGreg Clayton                     return 1;
2174e78f606SGreg Clayton 
2184e78f606SGreg Clayton                 case eStopReasonException:
2194e78f606SGreg Clayton                     return 1;
2204e78f606SGreg Clayton                 }
2214e78f606SGreg Clayton             }
2224e78f606SGreg Clayton         }
223c9858e4dSGreg Clayton         else
224c9858e4dSGreg Clayton         {
2255160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
226c9858e4dSGreg Clayton             if (log)
227324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running",
228324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
229c9858e4dSGreg Clayton         }
2307fdf9ef1SGreg Clayton     }
2314e78f606SGreg Clayton     return 0;
2324e78f606SGreg Clayton }
2334e78f606SGreg Clayton 
2344e78f606SGreg Clayton uint64_t
2354e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx)
2364e78f606SGreg Clayton {
2374fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2384fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2394fc6cb9cSJim Ingham 
2401ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
2414e78f606SGreg Clayton     {
2427fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2437fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2447fdf9ef1SGreg Clayton         {
2451ac04c30SGreg Clayton             Thread *thread = exe_ctx.GetThreadPtr();
2461ac04c30SGreg Clayton             StopInfoSP stop_info_sp = thread->GetStopInfo ();
2474e78f606SGreg Clayton             if (stop_info_sp)
2484e78f606SGreg Clayton             {
2494e78f606SGreg Clayton                 StopReason reason = stop_info_sp->GetStopReason();
2504e78f606SGreg Clayton                 switch (reason)
2514e78f606SGreg Clayton                 {
2524e78f606SGreg Clayton                 case eStopReasonInvalid:
2534e78f606SGreg Clayton                 case eStopReasonNone:
2544e78f606SGreg Clayton                 case eStopReasonTrace:
25590ba8115SGreg Clayton                 case eStopReasonExec:
2564e78f606SGreg Clayton                 case eStopReasonPlanComplete:
257f85defaeSAndrew Kaylor                 case eStopReasonThreadExiting:
2584e78f606SGreg Clayton                     // There is no data for these stop reasons.
2594e78f606SGreg Clayton                     return 0;
2604e78f606SGreg Clayton 
2614e78f606SGreg Clayton                 case eStopReasonBreakpoint:
2624e78f606SGreg Clayton                     {
2634e78f606SGreg Clayton                         break_id_t site_id = stop_info_sp->GetValue();
2641ac04c30SGreg Clayton                         lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
2654e78f606SGreg Clayton                         if (bp_site_sp)
2664e78f606SGreg Clayton                         {
2674e78f606SGreg Clayton                             uint32_t bp_index = idx / 2;
2684e78f606SGreg Clayton                             BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
2694e78f606SGreg Clayton                             if (bp_loc_sp)
2704e78f606SGreg Clayton                             {
2718334e14eSGreg Clayton                                 if (idx & 1)
2724e78f606SGreg Clayton                                 {
2734e78f606SGreg Clayton                                     // Odd idx, return the breakpoint location ID
2744e78f606SGreg Clayton                                     return bp_loc_sp->GetID();
2754e78f606SGreg Clayton                                 }
2764e78f606SGreg Clayton                                 else
2774e78f606SGreg Clayton                                 {
2784e78f606SGreg Clayton                                     // Even idx, return the breakpoint ID
2794e78f606SGreg Clayton                                     return bp_loc_sp->GetBreakpoint().GetID();
2804e78f606SGreg Clayton                                 }
2814e78f606SGreg Clayton                             }
2824e78f606SGreg Clayton                         }
2834e78f606SGreg Clayton                         return LLDB_INVALID_BREAK_ID;
2844e78f606SGreg Clayton                     }
2854e78f606SGreg Clayton                     break;
2864e78f606SGreg Clayton 
2874e78f606SGreg Clayton                 case eStopReasonWatchpoint:
288290fa41bSJohnny Chen                     return stop_info_sp->GetValue();
2894e78f606SGreg Clayton 
2904e78f606SGreg Clayton                 case eStopReasonSignal:
2914e78f606SGreg Clayton                     return stop_info_sp->GetValue();
2924e78f606SGreg Clayton 
2934e78f606SGreg Clayton                 case eStopReasonException:
2944e78f606SGreg Clayton                     return stop_info_sp->GetValue();
2954e78f606SGreg Clayton                 }
2964e78f606SGreg Clayton             }
2974e78f606SGreg Clayton         }
298c9858e4dSGreg Clayton         else
299c9858e4dSGreg Clayton         {
3005160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
301c9858e4dSGreg Clayton             if (log)
302324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running",
303324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
304c9858e4dSGreg Clayton         }
3057fdf9ef1SGreg Clayton     }
3064e78f606SGreg Clayton     return 0;
3074e78f606SGreg Clayton }
3084e78f606SGreg Clayton 
3094e78f606SGreg Clayton size_t
31030fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
31130fdc8d8SChris Lattner {
3125160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
313ceb6b139SCaroline Tice 
3144fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3154fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3164fc6cb9cSJim Ingham 
3171ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
31830fdc8d8SChris Lattner     {
3197fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3207fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3217fdf9ef1SGreg Clayton         {
3227fdf9ef1SGreg Clayton 
3231ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
324b15bfc75SJim Ingham             if (stop_info_sp)
32530fdc8d8SChris Lattner             {
326b15bfc75SJim Ingham                 const char *stop_desc = stop_info_sp->GetDescription();
32730fdc8d8SChris Lattner                 if (stop_desc)
32830fdc8d8SChris Lattner                 {
329ceb6b139SCaroline Tice                     if (log)
3304838131bSGreg Clayton                         log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
331324a1036SSaleem Abdulrasool                                      static_cast<void*>(exe_ctx.GetThreadPtr()),
332324a1036SSaleem Abdulrasool                                      stop_desc);
33330fdc8d8SChris Lattner                     if (dst)
33430fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc);
33530fdc8d8SChris Lattner                     else
33630fdc8d8SChris Lattner                     {
33730fdc8d8SChris Lattner                         // NULL dst passed in, return the length needed to contain the description
33830fdc8d8SChris Lattner                         return ::strlen (stop_desc) + 1; // Include the NULL byte for size
33930fdc8d8SChris Lattner                     }
34030fdc8d8SChris Lattner                 }
34130fdc8d8SChris Lattner                 else
34230fdc8d8SChris Lattner                 {
34330fdc8d8SChris Lattner                     size_t stop_desc_len = 0;
344b15bfc75SJim Ingham                     switch (stop_info_sp->GetStopReason())
34530fdc8d8SChris Lattner                     {
34630fdc8d8SChris Lattner                     case eStopReasonTrace:
34730fdc8d8SChris Lattner                     case eStopReasonPlanComplete:
34830fdc8d8SChris Lattner                         {
34930fdc8d8SChris Lattner                             static char trace_desc[] = "step";
35030fdc8d8SChris Lattner                             stop_desc = trace_desc;
35130fdc8d8SChris Lattner                             stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
35230fdc8d8SChris Lattner                         }
35330fdc8d8SChris Lattner                         break;
35430fdc8d8SChris Lattner 
35530fdc8d8SChris Lattner                     case eStopReasonBreakpoint:
35630fdc8d8SChris Lattner                         {
35730fdc8d8SChris Lattner                             static char bp_desc[] = "breakpoint hit";
35830fdc8d8SChris Lattner                             stop_desc = bp_desc;
35930fdc8d8SChris Lattner                             stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
36030fdc8d8SChris Lattner                         }
36130fdc8d8SChris Lattner                         break;
36230fdc8d8SChris Lattner 
36330fdc8d8SChris Lattner                     case eStopReasonWatchpoint:
36430fdc8d8SChris Lattner                         {
36530fdc8d8SChris Lattner                             static char wp_desc[] = "watchpoint hit";
36630fdc8d8SChris Lattner                             stop_desc = wp_desc;
36730fdc8d8SChris Lattner                             stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
36830fdc8d8SChris Lattner                         }
36930fdc8d8SChris Lattner                         break;
37030fdc8d8SChris Lattner 
37130fdc8d8SChris Lattner                     case eStopReasonSignal:
37230fdc8d8SChris Lattner                         {
3731ac04c30SGreg Clayton                             stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
37430fdc8d8SChris Lattner                             if (stop_desc == NULL || stop_desc[0] == '\0')
37530fdc8d8SChris Lattner                             {
37630fdc8d8SChris Lattner                                 static char signal_desc[] = "signal";
37730fdc8d8SChris Lattner                                 stop_desc = signal_desc;
37830fdc8d8SChris Lattner                                 stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
37930fdc8d8SChris Lattner                             }
38030fdc8d8SChris Lattner                         }
38130fdc8d8SChris Lattner                         break;
38230fdc8d8SChris Lattner 
38330fdc8d8SChris Lattner                     case eStopReasonException:
38430fdc8d8SChris Lattner                         {
38530fdc8d8SChris Lattner                             char exc_desc[] = "exception";
38630fdc8d8SChris Lattner                             stop_desc = exc_desc;
38730fdc8d8SChris Lattner                             stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
38830fdc8d8SChris Lattner                         }
38930fdc8d8SChris Lattner                         break;
390c982c768SGreg Clayton 
39190ba8115SGreg Clayton                     case eStopReasonExec:
39290ba8115SGreg Clayton                         {
39390ba8115SGreg Clayton                             char exc_desc[] = "exec";
39490ba8115SGreg Clayton                             stop_desc = exc_desc;
39590ba8115SGreg Clayton                             stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
39690ba8115SGreg Clayton                         }
39790ba8115SGreg Clayton                         break;
39890ba8115SGreg Clayton 
399f85defaeSAndrew Kaylor                     case eStopReasonThreadExiting:
400f85defaeSAndrew Kaylor                         {
401f85defaeSAndrew Kaylor                             char limbo_desc[] = "thread exiting";
402f85defaeSAndrew Kaylor                             stop_desc = limbo_desc;
403f85defaeSAndrew Kaylor                             stop_desc_len = sizeof(limbo_desc);
404f85defaeSAndrew Kaylor                         }
405f85defaeSAndrew Kaylor                         break;
406c982c768SGreg Clayton                     default:
407c982c768SGreg Clayton                         break;
40830fdc8d8SChris Lattner                     }
40930fdc8d8SChris Lattner 
41030fdc8d8SChris Lattner                     if (stop_desc && stop_desc[0])
41130fdc8d8SChris Lattner                     {
412ceb6b139SCaroline Tice                         if (log)
41393aa84e8SGreg Clayton                             log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
414324a1036SSaleem Abdulrasool                                          static_cast<void*>(exe_ctx.GetThreadPtr()),
415324a1036SSaleem Abdulrasool                                          stop_desc);
416ceb6b139SCaroline Tice 
41730fdc8d8SChris Lattner                         if (dst)
41830fdc8d8SChris Lattner                             return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
41930fdc8d8SChris Lattner 
42030fdc8d8SChris Lattner                         if (stop_desc_len == 0)
42130fdc8d8SChris Lattner                             stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner                         return stop_desc_len;
42430fdc8d8SChris Lattner                     }
42530fdc8d8SChris Lattner                 }
42630fdc8d8SChris Lattner             }
42730fdc8d8SChris Lattner         }
428c9858e4dSGreg Clayton         else
429c9858e4dSGreg Clayton         {
4305160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
431c9858e4dSGreg Clayton             if (log)
432324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running",
433324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
434c9858e4dSGreg Clayton         }
4357fdf9ef1SGreg Clayton     }
43630fdc8d8SChris Lattner     if (dst)
43730fdc8d8SChris Lattner         *dst = 0;
43830fdc8d8SChris Lattner     return 0;
43930fdc8d8SChris Lattner }
44030fdc8d8SChris Lattner 
44173ca05a2SJim Ingham SBValue
44273ca05a2SJim Ingham SBThread::GetStopReturnValue ()
44373ca05a2SJim Ingham {
4445160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
44573ca05a2SJim Ingham     ValueObjectSP return_valobj_sp;
4464fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4474fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4484fc6cb9cSJim Ingham 
4491ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
45073ca05a2SJim Ingham     {
4517fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4527fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4537fdf9ef1SGreg Clayton         {
4541ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
45573ca05a2SJim Ingham             if (stop_info_sp)
45673ca05a2SJim Ingham             {
45773ca05a2SJim Ingham                 return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
45873ca05a2SJim Ingham             }
45973ca05a2SJim Ingham         }
460c9858e4dSGreg Clayton         else
461c9858e4dSGreg Clayton         {
462c9858e4dSGreg Clayton             if (log)
463324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running",
464324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
465c9858e4dSGreg Clayton         }
4667fdf9ef1SGreg Clayton     }
46773ca05a2SJim Ingham 
46873ca05a2SJim Ingham     if (log)
469324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetStopReturnValue () => %s",
470324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
47173ca05a2SJim Ingham                      return_valobj_sp.get()
47273ca05a2SJim Ingham                         ? return_valobj_sp->GetValueAsCString()
47373ca05a2SJim Ingham                         : "<no return value>");
47473ca05a2SJim Ingham 
47573ca05a2SJim Ingham     return SBValue (return_valobj_sp);
47673ca05a2SJim Ingham }
47773ca05a2SJim Ingham 
47830fdc8d8SChris Lattner void
47930fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
48030fdc8d8SChris Lattner {
4817fdf9ef1SGreg Clayton     m_opaque_sp->SetThreadSP (lldb_object_sp);
48230fdc8d8SChris Lattner }
48330fdc8d8SChris Lattner 
48430fdc8d8SChris Lattner lldb::tid_t
48530fdc8d8SChris Lattner SBThread::GetThreadID () const
48630fdc8d8SChris Lattner {
4877fdf9ef1SGreg Clayton     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
48817a6ad05SGreg Clayton     if (thread_sp)
4891ac04c30SGreg Clayton         return thread_sp->GetID();
4901ac04c30SGreg Clayton     return LLDB_INVALID_THREAD_ID;
49130fdc8d8SChris Lattner }
49230fdc8d8SChris Lattner 
49330fdc8d8SChris Lattner uint32_t
49430fdc8d8SChris Lattner SBThread::GetIndexID () const
49530fdc8d8SChris Lattner {
4967fdf9ef1SGreg Clayton     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
49717a6ad05SGreg Clayton     if (thread_sp)
49817a6ad05SGreg Clayton         return thread_sp->GetIndexID();
49930fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
50030fdc8d8SChris Lattner }
5011ac04c30SGreg Clayton 
50230fdc8d8SChris Lattner const char *
50330fdc8d8SChris Lattner SBThread::GetName () const
50430fdc8d8SChris Lattner {
5055160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5064838131bSGreg Clayton     const char *name = NULL;
5074fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5084fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5094fc6cb9cSJim Ingham 
5101ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
511af67cecdSGreg Clayton     {
5127fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5137fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5147fdf9ef1SGreg Clayton         {
5151ac04c30SGreg Clayton             name = exe_ctx.GetThreadPtr()->GetName();
516af67cecdSGreg Clayton         }
517c9858e4dSGreg Clayton         else
518c9858e4dSGreg Clayton         {
519c9858e4dSGreg Clayton             if (log)
520324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetName() => error: process is running",
521324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
522c9858e4dSGreg Clayton         }
5237fdf9ef1SGreg Clayton     }
524ceb6b139SCaroline Tice 
525ceb6b139SCaroline Tice     if (log)
526324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetName () => %s",
527324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
528324a1036SSaleem Abdulrasool                      name ? name : "NULL");
529ceb6b139SCaroline Tice 
5304838131bSGreg Clayton     return name;
53130fdc8d8SChris Lattner }
53230fdc8d8SChris Lattner 
53330fdc8d8SChris Lattner const char *
53430fdc8d8SChris Lattner SBThread::GetQueueName () const
53530fdc8d8SChris Lattner {
5364838131bSGreg Clayton     const char *name = NULL;
5374fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5384fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5394fc6cb9cSJim Ingham 
5405160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5411ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
542af67cecdSGreg Clayton     {
5437fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5447fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5457fdf9ef1SGreg Clayton         {
5461ac04c30SGreg Clayton             name = exe_ctx.GetThreadPtr()->GetQueueName();
547af67cecdSGreg Clayton         }
548c9858e4dSGreg Clayton         else
549c9858e4dSGreg Clayton         {
550c9858e4dSGreg Clayton             if (log)
551324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetQueueName() => error: process is running",
552324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
553c9858e4dSGreg Clayton         }
5547fdf9ef1SGreg Clayton     }
555ceb6b139SCaroline Tice 
556ceb6b139SCaroline Tice     if (log)
557324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetQueueName () => %s",
558324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
559324a1036SSaleem Abdulrasool                      name ? name : "NULL");
560ceb6b139SCaroline Tice 
5614838131bSGreg Clayton     return name;
56230fdc8d8SChris Lattner }
56330fdc8d8SChris Lattner 
5644fdb5863SJason Molenda lldb::queue_id_t
5654fdb5863SJason Molenda SBThread::GetQueueID () const
5664fdb5863SJason Molenda {
5674fdb5863SJason Molenda     queue_id_t id = LLDB_INVALID_QUEUE_ID;
5684fdb5863SJason Molenda     Mutex::Locker api_locker;
5694fdb5863SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5704fdb5863SJason Molenda 
5714fdb5863SJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5724fdb5863SJason Molenda     if (exe_ctx.HasThreadScope())
5734fdb5863SJason Molenda     {
5744fdb5863SJason Molenda         Process::StopLocker stop_locker;
5754fdb5863SJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5764fdb5863SJason Molenda         {
5774fdb5863SJason Molenda             id = exe_ctx.GetThreadPtr()->GetQueueID();
5784fdb5863SJason Molenda         }
5794fdb5863SJason Molenda         else
5804fdb5863SJason Molenda         {
5814fdb5863SJason Molenda             if (log)
582324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetQueueID() => error: process is running",
583324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
5844fdb5863SJason Molenda         }
5854fdb5863SJason Molenda     }
5864fdb5863SJason Molenda 
5874fdb5863SJason Molenda     if (log)
588324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64,
589324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), id);
5904fdb5863SJason Molenda 
5914fdb5863SJason Molenda     return id;
5924fdb5863SJason Molenda }
5934fdb5863SJason Molenda 
594705b1809SJason Molenda bool
595705b1809SJason Molenda SBThread::GetInfoItemByPathAsString (const char *path, SBStream &strm)
596705b1809SJason Molenda {
597705b1809SJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
598705b1809SJason Molenda     bool success = false;
599705b1809SJason Molenda     Mutex::Locker api_locker;
600705b1809SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
601705b1809SJason Molenda 
602705b1809SJason Molenda     if (exe_ctx.HasThreadScope())
603705b1809SJason Molenda     {
604705b1809SJason Molenda         Process::StopLocker stop_locker;
605705b1809SJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
606705b1809SJason Molenda         {
607705b1809SJason Molenda             Thread *thread = exe_ctx.GetThreadPtr();
608705b1809SJason Molenda             StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo();
609705b1809SJason Molenda             if (info_root_sp)
610705b1809SJason Molenda             {
611705b1809SJason Molenda                 StructuredData::ObjectSP node = info_root_sp->GetObjectForDotSeparatedPath (path);
612705b1809SJason Molenda                 if (node)
613705b1809SJason Molenda                 {
614705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeString)
615705b1809SJason Molenda                     {
616705b1809SJason Molenda                         strm.Printf ("%s", node->GetAsString()->GetValue().c_str());
617705b1809SJason Molenda                         success = true;
618705b1809SJason Molenda                     }
619705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeInteger)
620705b1809SJason Molenda                     {
621705b1809SJason Molenda                         strm.Printf ("0x%" PRIx64, node->GetAsInteger()->GetValue());
622705b1809SJason Molenda                         success = true;
623705b1809SJason Molenda                     }
624705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeFloat)
625705b1809SJason Molenda                     {
626705b1809SJason Molenda                         strm.Printf ("0x%f", node->GetAsFloat()->GetValue());
627705b1809SJason Molenda                         success = true;
628705b1809SJason Molenda                     }
629705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeBoolean)
630705b1809SJason Molenda                     {
631705b1809SJason Molenda                         if (node->GetAsBoolean()->GetValue() == true)
632705b1809SJason Molenda                             strm.Printf ("true");
633705b1809SJason Molenda                         else
634705b1809SJason Molenda                             strm.Printf ("false");
635705b1809SJason Molenda                         success = true;
636705b1809SJason Molenda                     }
637705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeNull)
638705b1809SJason Molenda                     {
639705b1809SJason Molenda                         strm.Printf ("null");
640705b1809SJason Molenda                         success = true;
641705b1809SJason Molenda                     }
642705b1809SJason Molenda                 }
643705b1809SJason Molenda             }
644705b1809SJason Molenda         }
645705b1809SJason Molenda         else
646705b1809SJason Molenda         {
647705b1809SJason Molenda             if (log)
648705b1809SJason Molenda                 log->Printf ("SBThread(%p)::GetInfoItemByPathAsString() => error: process is running",
649705b1809SJason Molenda                              static_cast<void*>(exe_ctx.GetThreadPtr()));
650705b1809SJason Molenda         }
651705b1809SJason Molenda     }
652705b1809SJason Molenda 
653705b1809SJason Molenda     if (log)
654705b1809SJason Molenda         log->Printf ("SBThread(%p)::GetInfoItemByPathAsString () => %s",
655705b1809SJason Molenda                      static_cast<void*>(exe_ctx.GetThreadPtr()),
656705b1809SJason Molenda                      strm.GetData());
657705b1809SJason Molenda 
658705b1809SJason Molenda     return success;
659705b1809SJason Molenda }
660705b1809SJason Molenda 
661705b1809SJason Molenda 
66264e7ead1SJim Ingham SBError
66364e7ead1SJim Ingham SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
66464e7ead1SJim Ingham {
66564e7ead1SJim Ingham     SBError sb_error;
66664e7ead1SJim Ingham 
66764e7ead1SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
66864e7ead1SJim Ingham     if (!process)
66964e7ead1SJim Ingham     {
67064e7ead1SJim Ingham         sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
67164e7ead1SJim Ingham         return sb_error;
67264e7ead1SJim Ingham     }
67364e7ead1SJim Ingham 
67464e7ead1SJim Ingham     Thread *thread = exe_ctx.GetThreadPtr();
67564e7ead1SJim Ingham     if (!thread)
67664e7ead1SJim Ingham     {
67764e7ead1SJim Ingham         sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
67864e7ead1SJim Ingham         return sb_error;
67964e7ead1SJim Ingham     }
68064e7ead1SJim Ingham 
68164e7ead1SJim Ingham     // User level plans should be Master Plans so they can be interrupted, other plans executed, and
68264e7ead1SJim Ingham     // then a "continue" will resume the plan.
68364e7ead1SJim Ingham     if (new_plan != NULL)
68464e7ead1SJim Ingham     {
68564e7ead1SJim Ingham         new_plan->SetIsMasterPlan(true);
68664e7ead1SJim Ingham         new_plan->SetOkayToDiscard(false);
68764e7ead1SJim Ingham     }
68864e7ead1SJim Ingham 
68964e7ead1SJim Ingham     // Why do we need to set the current thread by ID here???
69064e7ead1SJim Ingham     process->GetThreadList().SetSelectedThreadByID (thread->GetID());
69164e7ead1SJim Ingham     sb_error.ref() = process->Resume();
69264e7ead1SJim Ingham 
69364e7ead1SJim Ingham     if (sb_error.Success())
69464e7ead1SJim Ingham     {
69564e7ead1SJim Ingham         // If we are doing synchronous mode, then wait for the
69664e7ead1SJim Ingham         // process to stop yet again!
69764e7ead1SJim Ingham         if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
69864e7ead1SJim Ingham             process->WaitForProcessToStop (NULL);
69964e7ead1SJim Ingham     }
70064e7ead1SJim Ingham 
70164e7ead1SJim Ingham     return sb_error;
70264e7ead1SJim Ingham }
70330fdc8d8SChris Lattner 
70430fdc8d8SChris Lattner void
70530fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
70630fdc8d8SChris Lattner {
7075160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
708ceb6b139SCaroline Tice 
7094fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7104fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7114fc6cb9cSJim Ingham 
71217a6ad05SGreg Clayton 
713ceb6b139SCaroline Tice     if (log)
714324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')",
715324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
716ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
717ceb6b139SCaroline Tice 
7181ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
71930fdc8d8SChris Lattner     {
7201ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
7217ba6e991SJim Ingham         bool abort_other_plans = false;
722b57e4a1bSJason Molenda         StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
72330fdc8d8SChris Lattner 
7244d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp;
72530fdc8d8SChris Lattner         if (frame_sp)
72630fdc8d8SChris Lattner         {
72730fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
72830fdc8d8SChris Lattner             {
7294b4b2478SJim Ingham                 const LazyBool avoid_no_debug = eLazyBoolCalculate;
73030fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
7314d56e9c1SJim Ingham                 new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
73230fdc8d8SChris Lattner                                                                     sc.line_entry.range,
73330fdc8d8SChris Lattner                                                                     sc,
7344b4b2478SJim Ingham                                                                     stop_other_threads,
7354b4b2478SJim Ingham                                                                     avoid_no_debug);
73630fdc8d8SChris Lattner             }
73730fdc8d8SChris Lattner             else
73830fdc8d8SChris Lattner             {
7394d56e9c1SJim Ingham                 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
74030fdc8d8SChris Lattner                                                                                abort_other_plans,
74130fdc8d8SChris Lattner                                                                                stop_other_threads);
74230fdc8d8SChris Lattner             }
74330fdc8d8SChris Lattner         }
74430fdc8d8SChris Lattner 
74564e7ead1SJim Ingham         // This returns an error, we should use it!
7464d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
74730fdc8d8SChris Lattner     }
74830fdc8d8SChris Lattner }
74930fdc8d8SChris Lattner 
75030fdc8d8SChris Lattner void
75130fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
75230fdc8d8SChris Lattner {
753c627682eSJim Ingham     StepInto (NULL, stop_other_threads);
754c627682eSJim Ingham }
755c627682eSJim Ingham 
756c627682eSJim Ingham void
757c627682eSJim Ingham SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
758c627682eSJim Ingham {
7595160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
760ceb6b139SCaroline Tice 
7614fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7624fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
76317a6ad05SGreg Clayton 
76417a6ad05SGreg Clayton     if (log)
765c627682eSJim Ingham         log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
766324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
767c627682eSJim Ingham                      target_name? target_name: "<NULL>",
76817a6ad05SGreg Clayton                      Thread::RunModeAsCString (stop_other_threads));
769c627682eSJim Ingham 
7701ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
77130fdc8d8SChris Lattner     {
7727ba6e991SJim Ingham         bool abort_other_plans = false;
77330fdc8d8SChris Lattner 
7741ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
775b57e4a1bSJason Molenda         StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
7764d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp;
77730fdc8d8SChris Lattner 
77830fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
77930fdc8d8SChris Lattner         {
7804b4b2478SJim Ingham             const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate;
7814b4b2478SJim Ingham             const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate;
78230fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
7834d56e9c1SJim Ingham             new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
78430fdc8d8SChris Lattner                                                               sc.line_entry.range,
78530fdc8d8SChris Lattner                                                               sc,
786c627682eSJim Ingham                                                               target_name,
787474966a4SGreg Clayton                                                               stop_other_threads,
7884b4b2478SJim Ingham                                                               step_in_avoids_code_without_debug_info,
7894b4b2478SJim Ingham                                                               step_out_avoids_code_without_debug_info);
79030fdc8d8SChris Lattner         }
79130fdc8d8SChris Lattner         else
79230fdc8d8SChris Lattner         {
7934d56e9c1SJim Ingham             new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
79430fdc8d8SChris Lattner                                                                            abort_other_plans,
79530fdc8d8SChris Lattner                                                                            stop_other_threads);
79630fdc8d8SChris Lattner         }
79730fdc8d8SChris Lattner 
79864e7ead1SJim Ingham         // This returns an error, we should use it!
7994d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
80030fdc8d8SChris Lattner     }
80130fdc8d8SChris Lattner }
80230fdc8d8SChris Lattner 
80330fdc8d8SChris Lattner void
80430fdc8d8SChris Lattner SBThread::StepOut ()
80530fdc8d8SChris Lattner {
8065160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
807ceb6b139SCaroline Tice 
8084fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8094fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8104fc6cb9cSJim Ingham 
811ceb6b139SCaroline Tice 
81217a6ad05SGreg Clayton     if (log)
813324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOut ()",
814324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()));
81517a6ad05SGreg Clayton 
8161ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
81730fdc8d8SChris Lattner     {
8187ba6e991SJim Ingham         bool abort_other_plans = false;
81994b09246SJim Ingham         bool stop_other_threads = false;
82030fdc8d8SChris Lattner 
8211ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
8221ac04c30SGreg Clayton 
8234b4b2478SJim Ingham         const LazyBool avoid_no_debug = eLazyBoolCalculate;
8244d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
825481cef25SGreg Clayton                                                                     NULL,
826481cef25SGreg Clayton                                                                     false,
827481cef25SGreg Clayton                                                                     stop_other_threads,
828481cef25SGreg Clayton                                                                     eVoteYes,
829481cef25SGreg Clayton                                                                     eVoteNoOpinion,
8304b4b2478SJim Ingham                                                                     0,
8314b4b2478SJim Ingham                                                                     avoid_no_debug));
832481cef25SGreg Clayton 
83364e7ead1SJim Ingham         // This returns an error, we should use it!
8344d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
835481cef25SGreg Clayton     }
836481cef25SGreg Clayton }
837481cef25SGreg Clayton 
838481cef25SGreg Clayton void
839481cef25SGreg Clayton SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
840481cef25SGreg Clayton {
8415160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
842481cef25SGreg Clayton 
8434fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8444fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8454fc6cb9cSJim Ingham 
846b57e4a1bSJason Molenda     StackFrameSP frame_sp (sb_frame.GetFrameSP());
847481cef25SGreg Clayton     if (log)
848481cef25SGreg Clayton     {
849481cef25SGreg Clayton         SBStream frame_desc_strm;
850481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
851324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)",
852324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
853324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
854324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
855481cef25SGreg Clayton     }
856481cef25SGreg Clayton 
8571ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
858481cef25SGreg Clayton     {
8597ba6e991SJim Ingham         bool abort_other_plans = false;
86094b09246SJim Ingham         bool stop_other_threads = false;
8611ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
862481cef25SGreg Clayton 
8634d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
864481cef25SGreg Clayton                                                                     NULL,
865481cef25SGreg Clayton                                                                     false,
866481cef25SGreg Clayton                                                                     stop_other_threads,
867481cef25SGreg Clayton                                                                     eVoteYes,
868481cef25SGreg Clayton                                                                     eVoteNoOpinion,
8694d56e9c1SJim Ingham                                                                     frame_sp->GetFrameIndex()));
87030fdc8d8SChris Lattner 
87164e7ead1SJim Ingham         // This returns an error, we should use it!
8724d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
87330fdc8d8SChris Lattner     }
87430fdc8d8SChris Lattner }
87530fdc8d8SChris Lattner 
87630fdc8d8SChris Lattner void
87730fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
87830fdc8d8SChris Lattner {
8795160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
880ceb6b139SCaroline Tice 
8814fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8824fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8834fc6cb9cSJim Ingham 
8841ac04c30SGreg Clayton 
885ceb6b139SCaroline Tice 
88617a6ad05SGreg Clayton     if (log)
887324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)",
888324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), step_over);
88917a6ad05SGreg Clayton 
8901ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
89130fdc8d8SChris Lattner     {
8921ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
8934d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
89464e7ead1SJim Ingham 
89564e7ead1SJim Ingham         // This returns an error, we should use it!
8964d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
89730fdc8d8SChris Lattner     }
89830fdc8d8SChris Lattner }
89930fdc8d8SChris Lattner 
90030fdc8d8SChris Lattner void
90130fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
90230fdc8d8SChris Lattner {
9035160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
904ceb6b139SCaroline Tice 
9054fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9064fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9074fc6cb9cSJim Ingham 
908ceb6b139SCaroline Tice 
90917a6ad05SGreg Clayton     if (log)
910324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")",
911324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), addr);
91217a6ad05SGreg Clayton 
9131ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
91430fdc8d8SChris Lattner     {
9157ba6e991SJim Ingham         bool abort_other_plans = false;
91630fdc8d8SChris Lattner         bool stop_other_threads = true;
91730fdc8d8SChris Lattner 
918e72dfb32SGreg Clayton         Address target_addr (addr);
91930fdc8d8SChris Lattner 
9201ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
9211ac04c30SGreg Clayton 
922*2bdbfd50SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans,
923*2bdbfd50SJim Ingham                                                                          target_addr,
924*2bdbfd50SJim Ingham                                                                          stop_other_threads));
92564e7ead1SJim Ingham 
92664e7ead1SJim Ingham         // This returns an error, we should use it!
9274d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
92830fdc8d8SChris Lattner     }
92930fdc8d8SChris Lattner }
93030fdc8d8SChris Lattner 
931481cef25SGreg Clayton SBError
932481cef25SGreg Clayton SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
933481cef25SGreg Clayton                          lldb::SBFileSpec &sb_file_spec,
934481cef25SGreg Clayton                          uint32_t line)
935481cef25SGreg Clayton {
936481cef25SGreg Clayton     SBError sb_error;
9375160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
938481cef25SGreg Clayton     char path[PATH_MAX];
939481cef25SGreg Clayton 
9404fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9414fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9424fc6cb9cSJim Ingham 
943b57e4a1bSJason Molenda     StackFrameSP frame_sp (sb_frame.GetFrameSP());
94417a6ad05SGreg Clayton 
945481cef25SGreg Clayton     if (log)
946481cef25SGreg Clayton     {
947481cef25SGreg Clayton         SBStream frame_desc_strm;
948481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
949481cef25SGreg Clayton         sb_file_spec->GetPath (path, sizeof(path));
950481cef25SGreg Clayton         log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
951324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
952324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
953324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData(), path, line);
954481cef25SGreg Clayton     }
955481cef25SGreg Clayton 
9561ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
957481cef25SGreg Clayton     {
9581ac04c30SGreg Clayton         Target *target = exe_ctx.GetTargetPtr();
9591ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
960481cef25SGreg Clayton 
961481cef25SGreg Clayton         if (line == 0)
962481cef25SGreg Clayton         {
963481cef25SGreg Clayton             sb_error.SetErrorString("invalid line argument");
964481cef25SGreg Clayton             return sb_error;
965481cef25SGreg Clayton         }
966481cef25SGreg Clayton 
967b9556accSGreg Clayton         if (!frame_sp)
968481cef25SGreg Clayton         {
9691ac04c30SGreg Clayton             frame_sp = thread->GetSelectedFrame ();
970481cef25SGreg Clayton             if (!frame_sp)
9711ac04c30SGreg Clayton                 frame_sp = thread->GetStackFrameAtIndex (0);
972481cef25SGreg Clayton         }
973481cef25SGreg Clayton 
974481cef25SGreg Clayton         SymbolContext frame_sc;
975481cef25SGreg Clayton         if (!frame_sp)
976481cef25SGreg Clayton         {
977481cef25SGreg Clayton             sb_error.SetErrorString("no valid frames in thread to step");
978481cef25SGreg Clayton             return sb_error;
979481cef25SGreg Clayton         }
980481cef25SGreg Clayton 
981481cef25SGreg Clayton         // If we have a frame, get its line
982481cef25SGreg Clayton         frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit  |
983481cef25SGreg Clayton                                                eSymbolContextFunction  |
984481cef25SGreg Clayton                                                eSymbolContextLineEntry |
985481cef25SGreg Clayton                                                eSymbolContextSymbol    );
986481cef25SGreg Clayton 
987481cef25SGreg Clayton         if (frame_sc.comp_unit == NULL)
988481cef25SGreg Clayton         {
989481cef25SGreg Clayton             sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
990481cef25SGreg Clayton             return sb_error;
991481cef25SGreg Clayton         }
992481cef25SGreg Clayton 
993481cef25SGreg Clayton         FileSpec step_file_spec;
994481cef25SGreg Clayton         if (sb_file_spec.IsValid())
995481cef25SGreg Clayton         {
996481cef25SGreg Clayton             // The file spec passed in was valid, so use it
997481cef25SGreg Clayton             step_file_spec = sb_file_spec.ref();
998481cef25SGreg Clayton         }
999481cef25SGreg Clayton         else
1000481cef25SGreg Clayton         {
1001481cef25SGreg Clayton             if (frame_sc.line_entry.IsValid())
1002481cef25SGreg Clayton                 step_file_spec = frame_sc.line_entry.file;
1003481cef25SGreg Clayton             else
1004481cef25SGreg Clayton             {
1005481cef25SGreg Clayton                 sb_error.SetErrorString("invalid file argument or no file for frame");
1006481cef25SGreg Clayton                 return sb_error;
1007481cef25SGreg Clayton             }
1008481cef25SGreg Clayton         }
1009481cef25SGreg Clayton 
10109b70ddb3SJim Ingham         // Grab the current function, then we will make sure the "until" address is
10119b70ddb3SJim Ingham         // within the function.  We discard addresses that are out of the current
10129b70ddb3SJim Ingham         // function, and then if there are no addresses remaining, give an appropriate
10139b70ddb3SJim Ingham         // error message.
10149b70ddb3SJim Ingham 
10159b70ddb3SJim Ingham         bool all_in_function = true;
10169b70ddb3SJim Ingham         AddressRange fun_range = frame_sc.function->GetAddressRange();
10179b70ddb3SJim Ingham 
1018481cef25SGreg Clayton         std::vector<addr_t> step_over_until_addrs;
10197ba6e991SJim Ingham         const bool abort_other_plans = false;
1020c02e3344SJim Ingham         const bool stop_other_threads = false;
1021481cef25SGreg Clayton         const bool check_inlines = true;
1022481cef25SGreg Clayton         const bool exact = false;
1023481cef25SGreg Clayton 
1024481cef25SGreg Clayton         SymbolContextList sc_list;
10259b70ddb3SJim Ingham         const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
10269b70ddb3SJim Ingham                                                                                line,
10279b70ddb3SJim Ingham                                                                                check_inlines,
10289b70ddb3SJim Ingham                                                                                exact,
10299b70ddb3SJim Ingham                                                                                eSymbolContextLineEntry,
10309b70ddb3SJim Ingham                                                                                sc_list);
1031481cef25SGreg Clayton         if (num_matches > 0)
1032481cef25SGreg Clayton         {
1033481cef25SGreg Clayton             SymbolContext sc;
1034481cef25SGreg Clayton             for (uint32_t i=0; i<num_matches; ++i)
1035481cef25SGreg Clayton             {
1036481cef25SGreg Clayton                 if (sc_list.GetContextAtIndex(i, sc))
1037481cef25SGreg Clayton                 {
10389b70ddb3SJim Ingham                     addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
1039481cef25SGreg Clayton                     if (step_addr != LLDB_INVALID_ADDRESS)
1040481cef25SGreg Clayton                     {
10419b70ddb3SJim Ingham                         if (fun_range.ContainsLoadAddress(step_addr, target))
1042481cef25SGreg Clayton                             step_over_until_addrs.push_back(step_addr);
10439b70ddb3SJim Ingham                         else
10449b70ddb3SJim Ingham                             all_in_function = false;
1045481cef25SGreg Clayton                     }
1046481cef25SGreg Clayton                 }
1047481cef25SGreg Clayton             }
1048481cef25SGreg Clayton         }
1049481cef25SGreg Clayton 
1050481cef25SGreg Clayton         if (step_over_until_addrs.empty())
1051481cef25SGreg Clayton         {
10529b70ddb3SJim Ingham             if (all_in_function)
10539b70ddb3SJim Ingham             {
1054481cef25SGreg Clayton                 step_file_spec.GetPath (path, sizeof(path));
1055fd54b368SJason Molenda                 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
1056481cef25SGreg Clayton             }
1057481cef25SGreg Clayton             else
105886edbf41SGreg Clayton                 sb_error.SetErrorString ("step until target not in current function");
10599b70ddb3SJim Ingham         }
10609b70ddb3SJim Ingham         else
1061481cef25SGreg Clayton         {
10624d56e9c1SJim Ingham             ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
1063481cef25SGreg Clayton                                                                         &step_over_until_addrs[0],
1064481cef25SGreg Clayton                                                                         step_over_until_addrs.size(),
1065481cef25SGreg Clayton                                                                         stop_other_threads,
10664d56e9c1SJim Ingham                                                                         frame_sp->GetFrameIndex()));
1067481cef25SGreg Clayton 
10684d56e9c1SJim Ingham             sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
1069481cef25SGreg Clayton         }
1070481cef25SGreg Clayton     }
1071481cef25SGreg Clayton     else
1072481cef25SGreg Clayton     {
1073481cef25SGreg Clayton         sb_error.SetErrorString("this SBThread object is invalid");
1074481cef25SGreg Clayton     }
1075481cef25SGreg Clayton     return sb_error;
1076481cef25SGreg Clayton }
1077481cef25SGreg Clayton 
10784413758cSJim Ingham SBError
1079*2bdbfd50SJim Ingham SBThread::StepUsingScriptedThreadPlan (const char *script_class_name)
1080*2bdbfd50SJim Ingham {
1081*2bdbfd50SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1082*2bdbfd50SJim Ingham     SBError sb_error;
1083*2bdbfd50SJim Ingham 
1084*2bdbfd50SJim Ingham     Mutex::Locker api_locker;
1085*2bdbfd50SJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1086*2bdbfd50SJim Ingham 
1087*2bdbfd50SJim Ingham     if (log)
1088*2bdbfd50SJim Ingham     {
1089*2bdbfd50SJim Ingham         log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s",
1090*2bdbfd50SJim Ingham                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1091*2bdbfd50SJim Ingham                      script_class_name);
1092*2bdbfd50SJim Ingham     }
1093*2bdbfd50SJim Ingham 
1094*2bdbfd50SJim Ingham 
1095*2bdbfd50SJim Ingham     if (!exe_ctx.HasThreadScope())
1096*2bdbfd50SJim Ingham     {
1097*2bdbfd50SJim Ingham         sb_error.SetErrorString("this SBThread object is invalid");
1098*2bdbfd50SJim Ingham         return sb_error;
1099*2bdbfd50SJim Ingham     }
1100*2bdbfd50SJim Ingham 
1101*2bdbfd50SJim Ingham     Thread *thread = exe_ctx.GetThreadPtr();
1102*2bdbfd50SJim Ingham     ThreadPlanSP thread_plan_sp = thread->QueueThreadPlanForStepScripted(false, script_class_name, false);
1103*2bdbfd50SJim Ingham 
1104*2bdbfd50SJim Ingham     if (thread_plan_sp)
1105*2bdbfd50SJim Ingham         sb_error = ResumeNewPlan(exe_ctx, thread_plan_sp.get());
1106*2bdbfd50SJim Ingham     else
1107*2bdbfd50SJim Ingham     {
1108*2bdbfd50SJim Ingham         sb_error.SetErrorStringWithFormat("Error queuing thread plan for class: %s.", script_class_name);
1109*2bdbfd50SJim Ingham         if (log)
1110*2bdbfd50SJim Ingham         log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: Error queuing thread plan for class: %s",
1111*2bdbfd50SJim Ingham                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1112*2bdbfd50SJim Ingham                      script_class_name);
1113*2bdbfd50SJim Ingham     }
1114*2bdbfd50SJim Ingham 
1115*2bdbfd50SJim Ingham     return sb_error;
1116*2bdbfd50SJim Ingham }
1117*2bdbfd50SJim Ingham 
1118*2bdbfd50SJim Ingham SBError
1119f86248d9SRichard Mitton SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line)
1120f86248d9SRichard Mitton {
1121f86248d9SRichard Mitton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1122f86248d9SRichard Mitton     SBError sb_error;
1123f86248d9SRichard Mitton 
1124f86248d9SRichard Mitton     Mutex::Locker api_locker;
1125f86248d9SRichard Mitton     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1126f86248d9SRichard Mitton 
1127f86248d9SRichard Mitton     if (log)
1128324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)",
1129324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1130324a1036SSaleem Abdulrasool                      file_spec->GetPath().c_str(), line);
1131f86248d9SRichard Mitton 
1132f86248d9SRichard Mitton     if (!exe_ctx.HasThreadScope())
1133f86248d9SRichard Mitton     {
1134f86248d9SRichard Mitton         sb_error.SetErrorString("this SBThread object is invalid");
1135f86248d9SRichard Mitton         return sb_error;
1136f86248d9SRichard Mitton     }
1137f86248d9SRichard Mitton 
1138f86248d9SRichard Mitton     Thread *thread = exe_ctx.GetThreadPtr();
1139f86248d9SRichard Mitton 
1140f86248d9SRichard Mitton     Error err = thread->JumpToLine (file_spec.get(), line, true);
1141f86248d9SRichard Mitton     sb_error.SetError (err);
1142f86248d9SRichard Mitton     return sb_error;
1143f86248d9SRichard Mitton }
1144f86248d9SRichard Mitton 
1145f86248d9SRichard Mitton SBError
1146cb640dd8SJim Ingham SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
11474413758cSJim Ingham {
11484413758cSJim Ingham     SBError sb_error;
11494413758cSJim Ingham 
11505160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11514413758cSJim Ingham 
11524413758cSJim Ingham     Mutex::Locker api_locker;
11534413758cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11544413758cSJim Ingham 
11554413758cSJim Ingham 
11564413758cSJim Ingham     if (log)
1157324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)",
1158324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1159324a1036SSaleem Abdulrasool                      frame.GetFrameID());
11604413758cSJim Ingham 
11614413758cSJim Ingham     if (exe_ctx.HasThreadScope())
11624413758cSJim Ingham     {
11634413758cSJim Ingham         Thread *thread = exe_ctx.GetThreadPtr();
1164cb640dd8SJim Ingham         sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
11654413758cSJim Ingham     }
11664413758cSJim Ingham 
11674413758cSJim Ingham     return sb_error;
11684413758cSJim Ingham }
11694413758cSJim Ingham 
1170481cef25SGreg Clayton 
1171722a0cdcSGreg Clayton bool
1172722a0cdcSGreg Clayton SBThread::Suspend()
1173722a0cdcSGreg Clayton {
11745160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11757fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
1176c9858e4dSGreg Clayton     bool result = false;
11771ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1178722a0cdcSGreg Clayton     {
1179c9858e4dSGreg Clayton         Process::StopLocker stop_locker;
1180c9858e4dSGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1181c9858e4dSGreg Clayton         {
11821ac04c30SGreg Clayton             exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
1183c9858e4dSGreg Clayton             result = true;
1184722a0cdcSGreg Clayton         }
1185c9858e4dSGreg Clayton         else
1186c9858e4dSGreg Clayton         {
1187c9858e4dSGreg Clayton             if (log)
1188324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::Suspend() => error: process is running",
1189324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1190c9858e4dSGreg Clayton         }
1191c9858e4dSGreg Clayton     }
1192c9858e4dSGreg Clayton     if (log)
1193324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::Suspend() => %i",
1194324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), result);
1195c9858e4dSGreg Clayton     return result;
1196722a0cdcSGreg Clayton }
1197722a0cdcSGreg Clayton 
1198722a0cdcSGreg Clayton bool
1199722a0cdcSGreg Clayton SBThread::Resume ()
1200722a0cdcSGreg Clayton {
12015160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
12027fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
1203c9858e4dSGreg Clayton     bool result = false;
12041ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1205722a0cdcSGreg Clayton     {
1206c9858e4dSGreg Clayton         Process::StopLocker stop_locker;
1207c9858e4dSGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1208c9858e4dSGreg Clayton         {
12096c9ed91cSJim Ingham             const bool override_suspend = true;
12106c9ed91cSJim Ingham             exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend);
1211c9858e4dSGreg Clayton             result = true;
1212722a0cdcSGreg Clayton         }
1213c9858e4dSGreg Clayton         else
1214c9858e4dSGreg Clayton         {
1215c9858e4dSGreg Clayton             if (log)
1216324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::Resume() => error: process is running",
1217324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1218c9858e4dSGreg Clayton         }
1219c9858e4dSGreg Clayton     }
1220c9858e4dSGreg Clayton     if (log)
1221324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::Resume() => %i",
1222324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), result);
1223c9858e4dSGreg Clayton     return result;
1224722a0cdcSGreg Clayton }
1225722a0cdcSGreg Clayton 
1226722a0cdcSGreg Clayton bool
1227722a0cdcSGreg Clayton SBThread::IsSuspended()
1228722a0cdcSGreg Clayton {
12297fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
12301ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
12311ac04c30SGreg Clayton         return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
1232722a0cdcSGreg Clayton     return false;
1233722a0cdcSGreg Clayton }
1234722a0cdcSGreg Clayton 
1235a75418dbSAndrew Kaylor bool
1236a75418dbSAndrew Kaylor SBThread::IsStopped()
1237a75418dbSAndrew Kaylor {
1238a75418dbSAndrew Kaylor     ExecutionContext exe_ctx (m_opaque_sp.get());
1239a75418dbSAndrew Kaylor     if (exe_ctx.HasThreadScope())
1240a75418dbSAndrew Kaylor         return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1241a75418dbSAndrew Kaylor     return false;
1242a75418dbSAndrew Kaylor }
1243a75418dbSAndrew Kaylor 
124430fdc8d8SChris Lattner SBProcess
124530fdc8d8SChris Lattner SBThread::GetProcess ()
124630fdc8d8SChris Lattner {
1247b9556accSGreg Clayton     SBProcess sb_process;
12487fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
12491ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
125030fdc8d8SChris Lattner     {
125130fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
12521ac04c30SGreg Clayton         sb_process.SetSP (exe_ctx.GetProcessSP());
125330fdc8d8SChris Lattner     }
1254ceb6b139SCaroline Tice 
12555160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1256ceb6b139SCaroline Tice     if (log)
1257ceb6b139SCaroline Tice     {
1258481cef25SGreg Clayton         SBStream frame_desc_strm;
1259b9556accSGreg Clayton         sb_process.GetDescription (frame_desc_strm);
1260324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s",
1261324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1262324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_process.GetSP().get()),
1263324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1264ceb6b139SCaroline Tice     }
1265ceb6b139SCaroline Tice 
1266b9556accSGreg Clayton     return sb_process;
126730fdc8d8SChris Lattner }
126830fdc8d8SChris Lattner 
126930fdc8d8SChris Lattner uint32_t
127030fdc8d8SChris Lattner SBThread::GetNumFrames ()
127130fdc8d8SChris Lattner {
12725160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1273ceb6b139SCaroline Tice 
1274ceb6b139SCaroline Tice     uint32_t num_frames = 0;
12754fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12764fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12774fc6cb9cSJim Ingham 
12781ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1279af67cecdSGreg Clayton     {
12807fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12817fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
12827fdf9ef1SGreg Clayton         {
12831ac04c30SGreg Clayton             num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1284af67cecdSGreg Clayton         }
1285c9858e4dSGreg Clayton         else
1286c9858e4dSGreg Clayton         {
1287c9858e4dSGreg Clayton             if (log)
1288324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running",
1289324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1290c9858e4dSGreg Clayton         }
12917fdf9ef1SGreg Clayton     }
1292ceb6b139SCaroline Tice 
1293ceb6b139SCaroline Tice     if (log)
1294324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetNumFrames () => %u",
1295324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames);
1296ceb6b139SCaroline Tice 
1297ceb6b139SCaroline Tice     return num_frames;
129830fdc8d8SChris Lattner }
129930fdc8d8SChris Lattner 
130030fdc8d8SChris Lattner SBFrame
130130fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
130230fdc8d8SChris Lattner {
13035160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1304ceb6b139SCaroline Tice 
130530fdc8d8SChris Lattner     SBFrame sb_frame;
1306b57e4a1bSJason Molenda     StackFrameSP frame_sp;
13074fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13084fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13094fc6cb9cSJim Ingham 
13101ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1311af67cecdSGreg Clayton     {
13127fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13137fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13147fdf9ef1SGreg Clayton         {
13151ac04c30SGreg Clayton             frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1316b9556accSGreg Clayton             sb_frame.SetFrameSP (frame_sp);
1317af67cecdSGreg Clayton         }
1318c9858e4dSGreg Clayton         else
1319c9858e4dSGreg Clayton         {
1320c9858e4dSGreg Clayton             if (log)
1321324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running",
1322324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1323c9858e4dSGreg Clayton         }
13247fdf9ef1SGreg Clayton     }
1325ceb6b139SCaroline Tice 
1326ceb6b139SCaroline Tice     if (log)
1327ceb6b139SCaroline Tice     {
1328481cef25SGreg Clayton         SBStream frame_desc_strm;
1329481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
13304838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
1331324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1332324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1333324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1334ceb6b139SCaroline Tice     }
1335ceb6b139SCaroline Tice 
133630fdc8d8SChris Lattner     return sb_frame;
133730fdc8d8SChris Lattner }
133830fdc8d8SChris Lattner 
1339f028a1fbSGreg Clayton lldb::SBFrame
1340f028a1fbSGreg Clayton SBThread::GetSelectedFrame ()
1341f028a1fbSGreg Clayton {
13425160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1343f028a1fbSGreg Clayton 
1344f028a1fbSGreg Clayton     SBFrame sb_frame;
1345b57e4a1bSJason Molenda     StackFrameSP frame_sp;
13464fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13474fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13484fc6cb9cSJim Ingham 
13491ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1350af67cecdSGreg Clayton     {
13517fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13527fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13537fdf9ef1SGreg Clayton         {
13541ac04c30SGreg Clayton             frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1355b9556accSGreg Clayton             sb_frame.SetFrameSP (frame_sp);
1356af67cecdSGreg Clayton         }
1357c9858e4dSGreg Clayton         else
1358c9858e4dSGreg Clayton         {
1359c9858e4dSGreg Clayton             if (log)
1360324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running",
1361324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1362c9858e4dSGreg Clayton         }
13637fdf9ef1SGreg Clayton     }
1364f028a1fbSGreg Clayton 
1365f028a1fbSGreg Clayton     if (log)
1366f028a1fbSGreg Clayton     {
1367481cef25SGreg Clayton         SBStream frame_desc_strm;
1368481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
1369f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
1370324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1371324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1372324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1373f028a1fbSGreg Clayton     }
1374f028a1fbSGreg Clayton 
1375f028a1fbSGreg Clayton     return sb_frame;
1376f028a1fbSGreg Clayton }
1377f028a1fbSGreg Clayton 
1378f028a1fbSGreg Clayton lldb::SBFrame
1379f028a1fbSGreg Clayton SBThread::SetSelectedFrame (uint32_t idx)
1380f028a1fbSGreg Clayton {
13815160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1382f028a1fbSGreg Clayton 
1383f028a1fbSGreg Clayton     SBFrame sb_frame;
1384b57e4a1bSJason Molenda     StackFrameSP frame_sp;
13854fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13864fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13874fc6cb9cSJim Ingham 
13881ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1389f028a1fbSGreg Clayton     {
13907fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13917fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13927fdf9ef1SGreg Clayton         {
13931ac04c30SGreg Clayton             Thread *thread = exe_ctx.GetThreadPtr();
13941ac04c30SGreg Clayton             frame_sp = thread->GetStackFrameAtIndex (idx);
1395f028a1fbSGreg Clayton             if (frame_sp)
1396f028a1fbSGreg Clayton             {
13971ac04c30SGreg Clayton                 thread->SetSelectedFrame (frame_sp.get());
1398b9556accSGreg Clayton                 sb_frame.SetFrameSP (frame_sp);
1399f028a1fbSGreg Clayton             }
1400f028a1fbSGreg Clayton         }
1401c9858e4dSGreg Clayton         else
1402c9858e4dSGreg Clayton         {
1403c9858e4dSGreg Clayton             if (log)
1404324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running",
1405324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1406c9858e4dSGreg Clayton         }
14077fdf9ef1SGreg Clayton     }
1408f028a1fbSGreg Clayton 
1409f028a1fbSGreg Clayton     if (log)
1410f028a1fbSGreg Clayton     {
1411481cef25SGreg Clayton         SBStream frame_desc_strm;
1412481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
1413f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
1414324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1415324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1416324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1417f028a1fbSGreg Clayton     }
1418f028a1fbSGreg Clayton     return sb_frame;
1419f028a1fbSGreg Clayton }
1420f028a1fbSGreg Clayton 
14214f465cffSJim Ingham bool
14224f465cffSJim Ingham SBThread::EventIsThreadEvent (const SBEvent &event)
14234f465cffSJim Ingham {
14244f465cffSJim Ingham     return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
14254f465cffSJim Ingham }
14264f465cffSJim Ingham 
14274f465cffSJim Ingham SBFrame
14284f465cffSJim Ingham SBThread::GetStackFrameFromEvent (const SBEvent &event)
14294f465cffSJim Ingham {
14304f465cffSJim Ingham     return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
14314f465cffSJim Ingham 
14324f465cffSJim Ingham }
14334f465cffSJim Ingham 
14344f465cffSJim Ingham SBThread
14354f465cffSJim Ingham SBThread::GetThreadFromEvent (const SBEvent &event)
14364f465cffSJim Ingham {
14374f465cffSJim Ingham     return Thread::ThreadEventData::GetThreadFromEvent (event.get());
14384f465cffSJim Ingham }
1439f028a1fbSGreg Clayton 
144030fdc8d8SChris Lattner bool
144130fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
144230fdc8d8SChris Lattner {
14437fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
144430fdc8d8SChris Lattner }
144530fdc8d8SChris Lattner 
144630fdc8d8SChris Lattner bool
144730fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
144830fdc8d8SChris Lattner {
14497fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
145030fdc8d8SChris Lattner }
1451dde9cff3SCaroline Tice 
1452dde9cff3SCaroline Tice bool
14534f465cffSJim Ingham SBThread::GetStatus (SBStream &status) const
14544f465cffSJim Ingham {
14554f465cffSJim Ingham     Stream &strm = status.ref();
14564f465cffSJim Ingham 
14574f465cffSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get());
14584f465cffSJim Ingham     if (exe_ctx.HasThreadScope())
14594f465cffSJim Ingham     {
14604f465cffSJim Ingham         exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
14614f465cffSJim Ingham     }
14624f465cffSJim Ingham     else
14634f465cffSJim Ingham         strm.PutCString ("No status");
14644f465cffSJim Ingham 
14654f465cffSJim Ingham     return true;
14664f465cffSJim Ingham }
14674f465cffSJim Ingham 
14684f465cffSJim Ingham bool
1469ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
1470ceb6b139SCaroline Tice {
1471da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1472da7bc7d0SGreg Clayton 
14737fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
14741ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1475ceb6b139SCaroline Tice     {
1476d01b2953SDaniel Malea         strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
1477ceb6b139SCaroline Tice     }
1478ceb6b139SCaroline Tice     else
1479da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1480ceb6b139SCaroline Tice 
1481ceb6b139SCaroline Tice     return true;
1482ceb6b139SCaroline Tice }
14835dd4916fSJason Molenda 
14845dd4916fSJason Molenda SBThread
1485008c45f1SJason Molenda SBThread::GetExtendedBacktraceThread (const char *type)
14865dd4916fSJason Molenda {
14875dd4916fSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14885dd4916fSJason Molenda     Mutex::Locker api_locker;
14895dd4916fSJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14905dd4916fSJason Molenda     SBThread sb_origin_thread;
14915dd4916fSJason Molenda 
14925dd4916fSJason Molenda     if (exe_ctx.HasThreadScope())
14935dd4916fSJason Molenda     {
14945dd4916fSJason Molenda         Process::StopLocker stop_locker;
14955dd4916fSJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
14965dd4916fSJason Molenda         {
14977a2f7904SJason Molenda             ThreadSP real_thread(exe_ctx.GetThreadSP());
14985dd4916fSJason Molenda             if (real_thread)
14995dd4916fSJason Molenda             {
15005dd4916fSJason Molenda                 ConstString type_const (type);
15017a2f7904SJason Molenda                 Process *process = exe_ctx.GetProcessPtr();
15027a2f7904SJason Molenda                 if (process)
15037a2f7904SJason Molenda                 {
15047a2f7904SJason Molenda                     SystemRuntime *runtime = process->GetSystemRuntime();
15055dd4916fSJason Molenda                     if (runtime)
15065dd4916fSJason Molenda                     {
1507008c45f1SJason Molenda                         ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const));
1508a6e9130dSJason Molenda                         if (new_thread_sp)
1509a6e9130dSJason Molenda                         {
15107a2f7904SJason Molenda                             // Save this in the Process' ExtendedThreadList so a strong pointer retains the
15117a2f7904SJason Molenda                             // object.
15127a2f7904SJason Molenda                             process->GetExtendedThreadList().AddThread (new_thread_sp);
15137a2f7904SJason Molenda                             sb_origin_thread.SetThread (new_thread_sp);
1514a6e9130dSJason Molenda                             if (log)
1515a6e9130dSJason Molenda                             {
1516a6e9130dSJason Molenda                                 const char *queue_name = new_thread_sp->GetQueueName();
1517a6e9130dSJason Molenda                                 if (queue_name == NULL)
1518a6e9130dSJason Molenda                                     queue_name = "";
1519*2bdbfd50SJim Ingham                                 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread "
1520*2bdbfd50SJim Ingham                                              "created (%p) with queue_id 0x%" PRIx64 " queue name '%s'",
1521324a1036SSaleem Abdulrasool                                              static_cast<void*>(exe_ctx.GetThreadPtr()),
1522324a1036SSaleem Abdulrasool                                              static_cast<void*>(new_thread_sp.get()),
1523324a1036SSaleem Abdulrasool                                              new_thread_sp->GetQueueID(),
1524324a1036SSaleem Abdulrasool                                              queue_name);
1525a6e9130dSJason Molenda                             }
1526a6e9130dSJason Molenda                         }
15277a2f7904SJason Molenda                     }
15285dd4916fSJason Molenda                 }
15295dd4916fSJason Molenda             }
15305dd4916fSJason Molenda         }
15315dd4916fSJason Molenda         else
15325dd4916fSJason Molenda         {
15335dd4916fSJason Molenda             if (log)
1534324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running",
1535324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
15365dd4916fSJason Molenda         }
15375dd4916fSJason Molenda     }
15385dd4916fSJason Molenda 
1539ac605f4aSJason Molenda     if (log && sb_origin_thread.IsValid() == false)
1540324a1036SSaleem Abdulrasool         log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread",
1541324a1036SSaleem Abdulrasool                     static_cast<void*>(exe_ctx.GetThreadPtr()));
15425dd4916fSJason Molenda     return sb_origin_thread;
15435dd4916fSJason Molenda }
15448ee9cb58SJason Molenda 
15458ee9cb58SJason Molenda uint32_t
15468ee9cb58SJason Molenda SBThread::GetExtendedBacktraceOriginatingIndexID ()
15478ee9cb58SJason Molenda {
15488ee9cb58SJason Molenda     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
15498ee9cb58SJason Molenda     if (thread_sp)
15508ee9cb58SJason Molenda         return thread_sp->GetExtendedBacktraceOriginatingIndexID();
15518ee9cb58SJason Molenda     return LLDB_INVALID_INDEX32;
15528ee9cb58SJason Molenda }
1553b4892cd2SJason Molenda 
1554b4892cd2SJason Molenda bool
1555b4892cd2SJason Molenda SBThread::SafeToCallFunctions ()
1556b4892cd2SJason Molenda {
1557b4892cd2SJason Molenda     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1558b4892cd2SJason Molenda     if (thread_sp)
1559b4892cd2SJason Molenda         return thread_sp->SafeToCallFunctions();
1560b4892cd2SJason Molenda     return true;
1561b4892cd2SJason Molenda }
1562*2bdbfd50SJim Ingham 
1563*2bdbfd50SJim Ingham lldb_private::Thread *
1564*2bdbfd50SJim Ingham SBThread::operator->()
1565*2bdbfd50SJim Ingham {
1566*2bdbfd50SJim Ingham     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1567*2bdbfd50SJim Ingham     if (thread_sp)
1568*2bdbfd50SJim Ingham         return thread_sp.get();
1569*2bdbfd50SJim Ingham     else
1570*2bdbfd50SJim Ingham         return NULL;
1571*2bdbfd50SJim Ingham }
1572*2bdbfd50SJim Ingham 
1573*2bdbfd50SJim Ingham lldb_private::Thread *
1574*2bdbfd50SJim Ingham SBThread::get()
1575*2bdbfd50SJim Ingham {
1576*2bdbfd50SJim Ingham     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1577*2bdbfd50SJim Ingham     if (thread_sp)
1578*2bdbfd50SJim Ingham         return thread_sp.get();
1579*2bdbfd50SJim Ingham     else
1580*2bdbfd50SJim Ingham         return NULL;
1581*2bdbfd50SJim Ingham }
1582*2bdbfd50SJim Ingham 
1583