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"
22*705b1809SJason 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"
4473ca05a2SJim Ingham #include "lldb/API/SBValue.h"
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner using namespace lldb;
4730fdc8d8SChris Lattner using namespace lldb_private;
4830fdc8d8SChris Lattner 
494f465cffSJim Ingham const char *
504f465cffSJim Ingham SBThread::GetBroadcasterClassName ()
514f465cffSJim Ingham {
524f465cffSJim Ingham     return Thread::GetStaticBroadcasterClass().AsCString();
534f465cffSJim Ingham }
544f465cffSJim Ingham 
55cfd1acedSGreg Clayton //----------------------------------------------------------------------
56cfd1acedSGreg Clayton // Constructors
57cfd1acedSGreg Clayton //----------------------------------------------------------------------
5830fdc8d8SChris Lattner SBThread::SBThread () :
597fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
6030fdc8d8SChris Lattner {
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) :
647fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef(lldb_object_sp))
6530fdc8d8SChris Lattner {
6630fdc8d8SChris Lattner }
6730fdc8d8SChris Lattner 
6892ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) :
697fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp))
7030fdc8d8SChris Lattner {
717fdf9ef1SGreg Clayton 
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
7430fdc8d8SChris Lattner //----------------------------------------------------------------------
75cfd1acedSGreg Clayton // Assignment operator
76cfd1acedSGreg Clayton //----------------------------------------------------------------------
77cfd1acedSGreg Clayton 
78cfd1acedSGreg Clayton const lldb::SBThread &
79cfd1acedSGreg Clayton SBThread::operator = (const SBThread &rhs)
80cfd1acedSGreg Clayton {
81cfd1acedSGreg Clayton     if (this != &rhs)
827fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
83cfd1acedSGreg Clayton     return *this;
84cfd1acedSGreg Clayton }
85cfd1acedSGreg Clayton 
86cfd1acedSGreg Clayton //----------------------------------------------------------------------
8730fdc8d8SChris Lattner // Destructor
8830fdc8d8SChris Lattner //----------------------------------------------------------------------
8930fdc8d8SChris Lattner SBThread::~SBThread()
9030fdc8d8SChris Lattner {
9130fdc8d8SChris Lattner }
9230fdc8d8SChris Lattner 
93b9ffa98cSJason Molenda lldb::SBQueue
94b9ffa98cSJason Molenda SBThread::GetQueue () const
95b9ffa98cSJason Molenda {
96b9ffa98cSJason Molenda     SBQueue sb_queue;
97b9ffa98cSJason Molenda     QueueSP queue_sp;
98b9ffa98cSJason Molenda     Mutex::Locker api_locker;
99b9ffa98cSJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
100b9ffa98cSJason Molenda 
101b9ffa98cSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
102b9ffa98cSJason Molenda     if (exe_ctx.HasThreadScope())
103b9ffa98cSJason Molenda     {
104b9ffa98cSJason Molenda         Process::StopLocker stop_locker;
105b9ffa98cSJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
106b9ffa98cSJason Molenda         {
107b9ffa98cSJason Molenda             queue_sp = exe_ctx.GetThreadPtr()->GetQueue();
108b9ffa98cSJason Molenda             if (queue_sp)
109b9ffa98cSJason Molenda             {
110b9ffa98cSJason Molenda                 sb_queue.SetQueue (queue_sp);
111b9ffa98cSJason Molenda             }
112b9ffa98cSJason Molenda         }
113b9ffa98cSJason Molenda         else
114b9ffa98cSJason Molenda         {
115b9ffa98cSJason Molenda             if (log)
116b9ffa98cSJason Molenda                 log->Printf ("SBThread(%p)::GetQueueKind() => error: process is running",
117b9ffa98cSJason Molenda                              static_cast<void*>(exe_ctx.GetThreadPtr()));
118b9ffa98cSJason Molenda         }
119b9ffa98cSJason Molenda     }
120b9ffa98cSJason Molenda 
121b9ffa98cSJason Molenda     if (log)
122b9ffa98cSJason Molenda         log->Printf ("SBThread(%p)::GetQueueKind () => SBQueue(%p)",
123b9ffa98cSJason Molenda                      static_cast<void*>(exe_ctx.GetThreadPtr()), static_cast<void*>(queue_sp.get()));
124b9ffa98cSJason Molenda 
125b9ffa98cSJason Molenda     return sb_queue;
126b9ffa98cSJason Molenda }
127b9ffa98cSJason Molenda 
128b9ffa98cSJason Molenda 
12930fdc8d8SChris Lattner bool
13030fdc8d8SChris Lattner SBThread::IsValid() const
13130fdc8d8SChris Lattner {
1327fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() != NULL;
13330fdc8d8SChris Lattner }
13430fdc8d8SChris Lattner 
13548e42549SGreg Clayton void
13648e42549SGreg Clayton SBThread::Clear ()
13748e42549SGreg Clayton {
1387fdf9ef1SGreg Clayton     m_opaque_sp->Clear();
13948e42549SGreg Clayton }
14048e42549SGreg Clayton 
14148e42549SGreg Clayton 
14230fdc8d8SChris Lattner StopReason
14330fdc8d8SChris Lattner SBThread::GetStopReason()
14430fdc8d8SChris Lattner {
1455160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
146ceb6b139SCaroline Tice 
147ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
1484fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1494fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1504fc6cb9cSJim Ingham 
1511ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
15230fdc8d8SChris Lattner     {
1537fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1547fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1557fdf9ef1SGreg Clayton         {
15697d5cf05SGreg Clayton             return exe_ctx.GetThreadPtr()->GetStopReason();
15730fdc8d8SChris Lattner         }
158c9858e4dSGreg Clayton         else
159c9858e4dSGreg Clayton         {
160c9858e4dSGreg Clayton             if (log)
161324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReason() => error: process is running",
162324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
163c9858e4dSGreg Clayton         }
1647fdf9ef1SGreg Clayton     }
165ceb6b139SCaroline Tice 
166ceb6b139SCaroline Tice     if (log)
167324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetStopReason () => %s",
168324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
169750cd175SCaroline Tice                      Thread::StopReasonAsCString (reason));
170ceb6b139SCaroline Tice 
171ceb6b139SCaroline Tice     return reason;
17230fdc8d8SChris Lattner }
17330fdc8d8SChris Lattner 
17430fdc8d8SChris Lattner size_t
1754e78f606SGreg Clayton SBThread::GetStopReasonDataCount ()
1764e78f606SGreg Clayton {
1774fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1784fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1794fc6cb9cSJim Ingham 
1801ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1814e78f606SGreg Clayton     {
1827fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1837fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1847fdf9ef1SGreg Clayton         {
1851ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
1864e78f606SGreg Clayton             if (stop_info_sp)
1874e78f606SGreg Clayton             {
1884e78f606SGreg Clayton                 StopReason reason = stop_info_sp->GetStopReason();
1894e78f606SGreg Clayton                 switch (reason)
1904e78f606SGreg Clayton                 {
1914e78f606SGreg Clayton                 case eStopReasonInvalid:
1924e78f606SGreg Clayton                 case eStopReasonNone:
1934e78f606SGreg Clayton                 case eStopReasonTrace:
19490ba8115SGreg Clayton                 case eStopReasonExec:
1954e78f606SGreg Clayton                 case eStopReasonPlanComplete:
196f85defaeSAndrew Kaylor                 case eStopReasonThreadExiting:
1974e78f606SGreg Clayton                     // There is no data for these stop reasons.
1984e78f606SGreg Clayton                     return 0;
1994e78f606SGreg Clayton 
2004e78f606SGreg Clayton                 case eStopReasonBreakpoint:
2014e78f606SGreg Clayton                     {
2024e78f606SGreg Clayton                         break_id_t site_id = stop_info_sp->GetValue();
2031ac04c30SGreg Clayton                         lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
2044e78f606SGreg Clayton                         if (bp_site_sp)
2054e78f606SGreg Clayton                             return bp_site_sp->GetNumberOfOwners () * 2;
2064e78f606SGreg Clayton                         else
2074e78f606SGreg Clayton                             return 0; // Breakpoint must have cleared itself...
2084e78f606SGreg Clayton                     }
2094e78f606SGreg Clayton                     break;
2104e78f606SGreg Clayton 
2114e78f606SGreg Clayton                 case eStopReasonWatchpoint:
212290fa41bSJohnny Chen                     return 1;
2134e78f606SGreg Clayton 
2144e78f606SGreg Clayton                 case eStopReasonSignal:
2154e78f606SGreg Clayton                     return 1;
2164e78f606SGreg Clayton 
2174e78f606SGreg Clayton                 case eStopReasonException:
2184e78f606SGreg Clayton                     return 1;
2194e78f606SGreg Clayton                 }
2204e78f606SGreg Clayton             }
2214e78f606SGreg Clayton         }
222c9858e4dSGreg Clayton         else
223c9858e4dSGreg Clayton         {
2245160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
225c9858e4dSGreg Clayton             if (log)
226324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running",
227324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
228c9858e4dSGreg Clayton         }
2297fdf9ef1SGreg Clayton     }
2304e78f606SGreg Clayton     return 0;
2314e78f606SGreg Clayton }
2324e78f606SGreg Clayton 
2334e78f606SGreg Clayton uint64_t
2344e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx)
2354e78f606SGreg Clayton {
2364fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2374fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2384fc6cb9cSJim Ingham 
2391ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
2404e78f606SGreg Clayton     {
2417fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2427fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2437fdf9ef1SGreg Clayton         {
2441ac04c30SGreg Clayton             Thread *thread = exe_ctx.GetThreadPtr();
2451ac04c30SGreg Clayton             StopInfoSP stop_info_sp = thread->GetStopInfo ();
2464e78f606SGreg Clayton             if (stop_info_sp)
2474e78f606SGreg Clayton             {
2484e78f606SGreg Clayton                 StopReason reason = stop_info_sp->GetStopReason();
2494e78f606SGreg Clayton                 switch (reason)
2504e78f606SGreg Clayton                 {
2514e78f606SGreg Clayton                 case eStopReasonInvalid:
2524e78f606SGreg Clayton                 case eStopReasonNone:
2534e78f606SGreg Clayton                 case eStopReasonTrace:
25490ba8115SGreg Clayton                 case eStopReasonExec:
2554e78f606SGreg Clayton                 case eStopReasonPlanComplete:
256f85defaeSAndrew Kaylor                 case eStopReasonThreadExiting:
2574e78f606SGreg Clayton                     // There is no data for these stop reasons.
2584e78f606SGreg Clayton                     return 0;
2594e78f606SGreg Clayton 
2604e78f606SGreg Clayton                 case eStopReasonBreakpoint:
2614e78f606SGreg Clayton                     {
2624e78f606SGreg Clayton                         break_id_t site_id = stop_info_sp->GetValue();
2631ac04c30SGreg Clayton                         lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
2644e78f606SGreg Clayton                         if (bp_site_sp)
2654e78f606SGreg Clayton                         {
2664e78f606SGreg Clayton                             uint32_t bp_index = idx / 2;
2674e78f606SGreg Clayton                             BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
2684e78f606SGreg Clayton                             if (bp_loc_sp)
2694e78f606SGreg Clayton                             {
2708334e14eSGreg Clayton                                 if (idx & 1)
2714e78f606SGreg Clayton                                 {
2724e78f606SGreg Clayton                                     // Odd idx, return the breakpoint location ID
2734e78f606SGreg Clayton                                     return bp_loc_sp->GetID();
2744e78f606SGreg Clayton                                 }
2754e78f606SGreg Clayton                                 else
2764e78f606SGreg Clayton                                 {
2774e78f606SGreg Clayton                                     // Even idx, return the breakpoint ID
2784e78f606SGreg Clayton                                     return bp_loc_sp->GetBreakpoint().GetID();
2794e78f606SGreg Clayton                                 }
2804e78f606SGreg Clayton                             }
2814e78f606SGreg Clayton                         }
2824e78f606SGreg Clayton                         return LLDB_INVALID_BREAK_ID;
2834e78f606SGreg Clayton                     }
2844e78f606SGreg Clayton                     break;
2854e78f606SGreg Clayton 
2864e78f606SGreg Clayton                 case eStopReasonWatchpoint:
287290fa41bSJohnny Chen                     return stop_info_sp->GetValue();
2884e78f606SGreg Clayton 
2894e78f606SGreg Clayton                 case eStopReasonSignal:
2904e78f606SGreg Clayton                     return stop_info_sp->GetValue();
2914e78f606SGreg Clayton 
2924e78f606SGreg Clayton                 case eStopReasonException:
2934e78f606SGreg Clayton                     return stop_info_sp->GetValue();
2944e78f606SGreg Clayton                 }
2954e78f606SGreg Clayton             }
2964e78f606SGreg Clayton         }
297c9858e4dSGreg Clayton         else
298c9858e4dSGreg Clayton         {
2995160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
300c9858e4dSGreg Clayton             if (log)
301324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running",
302324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
303c9858e4dSGreg Clayton         }
3047fdf9ef1SGreg Clayton     }
3054e78f606SGreg Clayton     return 0;
3064e78f606SGreg Clayton }
3074e78f606SGreg Clayton 
3084e78f606SGreg Clayton size_t
30930fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
31030fdc8d8SChris Lattner {
3115160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
312ceb6b139SCaroline Tice 
3134fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3144fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3154fc6cb9cSJim Ingham 
3161ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
31730fdc8d8SChris Lattner     {
3187fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3197fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3207fdf9ef1SGreg Clayton         {
3217fdf9ef1SGreg Clayton 
3221ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
323b15bfc75SJim Ingham             if (stop_info_sp)
32430fdc8d8SChris Lattner             {
325b15bfc75SJim Ingham                 const char *stop_desc = stop_info_sp->GetDescription();
32630fdc8d8SChris Lattner                 if (stop_desc)
32730fdc8d8SChris Lattner                 {
328ceb6b139SCaroline Tice                     if (log)
3294838131bSGreg Clayton                         log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
330324a1036SSaleem Abdulrasool                                      static_cast<void*>(exe_ctx.GetThreadPtr()),
331324a1036SSaleem Abdulrasool                                      stop_desc);
33230fdc8d8SChris Lattner                     if (dst)
33330fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc);
33430fdc8d8SChris Lattner                     else
33530fdc8d8SChris Lattner                     {
33630fdc8d8SChris Lattner                         // NULL dst passed in, return the length needed to contain the description
33730fdc8d8SChris Lattner                         return ::strlen (stop_desc) + 1; // Include the NULL byte for size
33830fdc8d8SChris Lattner                     }
33930fdc8d8SChris Lattner                 }
34030fdc8d8SChris Lattner                 else
34130fdc8d8SChris Lattner                 {
34230fdc8d8SChris Lattner                     size_t stop_desc_len = 0;
343b15bfc75SJim Ingham                     switch (stop_info_sp->GetStopReason())
34430fdc8d8SChris Lattner                     {
34530fdc8d8SChris Lattner                     case eStopReasonTrace:
34630fdc8d8SChris Lattner                     case eStopReasonPlanComplete:
34730fdc8d8SChris Lattner                         {
34830fdc8d8SChris Lattner                             static char trace_desc[] = "step";
34930fdc8d8SChris Lattner                             stop_desc = trace_desc;
35030fdc8d8SChris Lattner                             stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
35130fdc8d8SChris Lattner                         }
35230fdc8d8SChris Lattner                         break;
35330fdc8d8SChris Lattner 
35430fdc8d8SChris Lattner                     case eStopReasonBreakpoint:
35530fdc8d8SChris Lattner                         {
35630fdc8d8SChris Lattner                             static char bp_desc[] = "breakpoint hit";
35730fdc8d8SChris Lattner                             stop_desc = bp_desc;
35830fdc8d8SChris Lattner                             stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
35930fdc8d8SChris Lattner                         }
36030fdc8d8SChris Lattner                         break;
36130fdc8d8SChris Lattner 
36230fdc8d8SChris Lattner                     case eStopReasonWatchpoint:
36330fdc8d8SChris Lattner                         {
36430fdc8d8SChris Lattner                             static char wp_desc[] = "watchpoint hit";
36530fdc8d8SChris Lattner                             stop_desc = wp_desc;
36630fdc8d8SChris Lattner                             stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
36730fdc8d8SChris Lattner                         }
36830fdc8d8SChris Lattner                         break;
36930fdc8d8SChris Lattner 
37030fdc8d8SChris Lattner                     case eStopReasonSignal:
37130fdc8d8SChris Lattner                         {
3721ac04c30SGreg Clayton                             stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
37330fdc8d8SChris Lattner                             if (stop_desc == NULL || stop_desc[0] == '\0')
37430fdc8d8SChris Lattner                             {
37530fdc8d8SChris Lattner                                 static char signal_desc[] = "signal";
37630fdc8d8SChris Lattner                                 stop_desc = signal_desc;
37730fdc8d8SChris Lattner                                 stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
37830fdc8d8SChris Lattner                             }
37930fdc8d8SChris Lattner                         }
38030fdc8d8SChris Lattner                         break;
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner                     case eStopReasonException:
38330fdc8d8SChris Lattner                         {
38430fdc8d8SChris Lattner                             char exc_desc[] = "exception";
38530fdc8d8SChris Lattner                             stop_desc = exc_desc;
38630fdc8d8SChris Lattner                             stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
38730fdc8d8SChris Lattner                         }
38830fdc8d8SChris Lattner                         break;
389c982c768SGreg Clayton 
39090ba8115SGreg Clayton                     case eStopReasonExec:
39190ba8115SGreg Clayton                         {
39290ba8115SGreg Clayton                             char exc_desc[] = "exec";
39390ba8115SGreg Clayton                             stop_desc = exc_desc;
39490ba8115SGreg Clayton                             stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
39590ba8115SGreg Clayton                         }
39690ba8115SGreg Clayton                         break;
39790ba8115SGreg Clayton 
398f85defaeSAndrew Kaylor                     case eStopReasonThreadExiting:
399f85defaeSAndrew Kaylor                         {
400f85defaeSAndrew Kaylor                             char limbo_desc[] = "thread exiting";
401f85defaeSAndrew Kaylor                             stop_desc = limbo_desc;
402f85defaeSAndrew Kaylor                             stop_desc_len = sizeof(limbo_desc);
403f85defaeSAndrew Kaylor                         }
404f85defaeSAndrew Kaylor                         break;
405c982c768SGreg Clayton                     default:
406c982c768SGreg Clayton                         break;
40730fdc8d8SChris Lattner                     }
40830fdc8d8SChris Lattner 
40930fdc8d8SChris Lattner                     if (stop_desc && stop_desc[0])
41030fdc8d8SChris Lattner                     {
411ceb6b139SCaroline Tice                         if (log)
41293aa84e8SGreg Clayton                             log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
413324a1036SSaleem Abdulrasool                                          static_cast<void*>(exe_ctx.GetThreadPtr()),
414324a1036SSaleem Abdulrasool                                          stop_desc);
415ceb6b139SCaroline Tice 
41630fdc8d8SChris Lattner                         if (dst)
41730fdc8d8SChris Lattner                             return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
41830fdc8d8SChris Lattner 
41930fdc8d8SChris Lattner                         if (stop_desc_len == 0)
42030fdc8d8SChris Lattner                             stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
42130fdc8d8SChris Lattner 
42230fdc8d8SChris Lattner                         return stop_desc_len;
42330fdc8d8SChris Lattner                     }
42430fdc8d8SChris Lattner                 }
42530fdc8d8SChris Lattner             }
42630fdc8d8SChris Lattner         }
427c9858e4dSGreg Clayton         else
428c9858e4dSGreg Clayton         {
4295160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
430c9858e4dSGreg Clayton             if (log)
431324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running",
432324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
433c9858e4dSGreg Clayton         }
4347fdf9ef1SGreg Clayton     }
43530fdc8d8SChris Lattner     if (dst)
43630fdc8d8SChris Lattner         *dst = 0;
43730fdc8d8SChris Lattner     return 0;
43830fdc8d8SChris Lattner }
43930fdc8d8SChris Lattner 
44073ca05a2SJim Ingham SBValue
44173ca05a2SJim Ingham SBThread::GetStopReturnValue ()
44273ca05a2SJim Ingham {
4435160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
44473ca05a2SJim Ingham     ValueObjectSP return_valobj_sp;
4454fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4464fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4474fc6cb9cSJim Ingham 
4481ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
44973ca05a2SJim Ingham     {
4507fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4517fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4527fdf9ef1SGreg Clayton         {
4531ac04c30SGreg Clayton             StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
45473ca05a2SJim Ingham             if (stop_info_sp)
45573ca05a2SJim Ingham             {
45673ca05a2SJim Ingham                 return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
45773ca05a2SJim Ingham             }
45873ca05a2SJim Ingham         }
459c9858e4dSGreg Clayton         else
460c9858e4dSGreg Clayton         {
461c9858e4dSGreg Clayton             if (log)
462324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running",
463324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
464c9858e4dSGreg Clayton         }
4657fdf9ef1SGreg Clayton     }
46673ca05a2SJim Ingham 
46773ca05a2SJim Ingham     if (log)
468324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetStopReturnValue () => %s",
469324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
47073ca05a2SJim Ingham                      return_valobj_sp.get()
47173ca05a2SJim Ingham                         ? return_valobj_sp->GetValueAsCString()
47273ca05a2SJim Ingham                         : "<no return value>");
47373ca05a2SJim Ingham 
47473ca05a2SJim Ingham     return SBValue (return_valobj_sp);
47573ca05a2SJim Ingham }
47673ca05a2SJim Ingham 
47730fdc8d8SChris Lattner void
47830fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
47930fdc8d8SChris Lattner {
4807fdf9ef1SGreg Clayton     m_opaque_sp->SetThreadSP (lldb_object_sp);
48130fdc8d8SChris Lattner }
48230fdc8d8SChris Lattner 
48330fdc8d8SChris Lattner lldb::tid_t
48430fdc8d8SChris Lattner SBThread::GetThreadID () const
48530fdc8d8SChris Lattner {
4867fdf9ef1SGreg Clayton     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
48717a6ad05SGreg Clayton     if (thread_sp)
4881ac04c30SGreg Clayton         return thread_sp->GetID();
4891ac04c30SGreg Clayton     return LLDB_INVALID_THREAD_ID;
49030fdc8d8SChris Lattner }
49130fdc8d8SChris Lattner 
49230fdc8d8SChris Lattner uint32_t
49330fdc8d8SChris Lattner SBThread::GetIndexID () const
49430fdc8d8SChris Lattner {
4957fdf9ef1SGreg Clayton     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
49617a6ad05SGreg Clayton     if (thread_sp)
49717a6ad05SGreg Clayton         return thread_sp->GetIndexID();
49830fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
49930fdc8d8SChris Lattner }
5001ac04c30SGreg Clayton 
50130fdc8d8SChris Lattner const char *
50230fdc8d8SChris Lattner SBThread::GetName () const
50330fdc8d8SChris Lattner {
5045160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5054838131bSGreg Clayton     const char *name = NULL;
5064fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5074fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5084fc6cb9cSJim Ingham 
5091ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
510af67cecdSGreg Clayton     {
5117fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5127fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5137fdf9ef1SGreg Clayton         {
5141ac04c30SGreg Clayton             name = exe_ctx.GetThreadPtr()->GetName();
515af67cecdSGreg Clayton         }
516c9858e4dSGreg Clayton         else
517c9858e4dSGreg Clayton         {
518c9858e4dSGreg Clayton             if (log)
519324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetName() => error: process is running",
520324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
521c9858e4dSGreg Clayton         }
5227fdf9ef1SGreg Clayton     }
523ceb6b139SCaroline Tice 
524ceb6b139SCaroline Tice     if (log)
525324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetName () => %s",
526324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
527324a1036SSaleem Abdulrasool                      name ? name : "NULL");
528ceb6b139SCaroline Tice 
5294838131bSGreg Clayton     return name;
53030fdc8d8SChris Lattner }
53130fdc8d8SChris Lattner 
53230fdc8d8SChris Lattner const char *
53330fdc8d8SChris Lattner SBThread::GetQueueName () const
53430fdc8d8SChris Lattner {
5354838131bSGreg Clayton     const char *name = NULL;
5364fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5374fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5384fc6cb9cSJim Ingham 
5395160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5401ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
541af67cecdSGreg Clayton     {
5427fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5437fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5447fdf9ef1SGreg Clayton         {
5451ac04c30SGreg Clayton             name = exe_ctx.GetThreadPtr()->GetQueueName();
546af67cecdSGreg Clayton         }
547c9858e4dSGreg Clayton         else
548c9858e4dSGreg Clayton         {
549c9858e4dSGreg Clayton             if (log)
550324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetQueueName() => error: process is running",
551324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
552c9858e4dSGreg Clayton         }
5537fdf9ef1SGreg Clayton     }
554ceb6b139SCaroline Tice 
555ceb6b139SCaroline Tice     if (log)
556324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetQueueName () => %s",
557324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
558324a1036SSaleem Abdulrasool                      name ? name : "NULL");
559ceb6b139SCaroline Tice 
5604838131bSGreg Clayton     return name;
56130fdc8d8SChris Lattner }
56230fdc8d8SChris Lattner 
5634fdb5863SJason Molenda lldb::queue_id_t
5644fdb5863SJason Molenda SBThread::GetQueueID () const
5654fdb5863SJason Molenda {
5664fdb5863SJason Molenda     queue_id_t id = LLDB_INVALID_QUEUE_ID;
5674fdb5863SJason Molenda     Mutex::Locker api_locker;
5684fdb5863SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5694fdb5863SJason Molenda 
5704fdb5863SJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5714fdb5863SJason Molenda     if (exe_ctx.HasThreadScope())
5724fdb5863SJason Molenda     {
5734fdb5863SJason Molenda         Process::StopLocker stop_locker;
5744fdb5863SJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5754fdb5863SJason Molenda         {
5764fdb5863SJason Molenda             id = exe_ctx.GetThreadPtr()->GetQueueID();
5774fdb5863SJason Molenda         }
5784fdb5863SJason Molenda         else
5794fdb5863SJason Molenda         {
5804fdb5863SJason Molenda             if (log)
581324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetQueueID() => error: process is running",
582324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
5834fdb5863SJason Molenda         }
5844fdb5863SJason Molenda     }
5854fdb5863SJason Molenda 
5864fdb5863SJason Molenda     if (log)
587324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64,
588324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), id);
5894fdb5863SJason Molenda 
5904fdb5863SJason Molenda     return id;
5914fdb5863SJason Molenda }
5924fdb5863SJason Molenda 
593*705b1809SJason Molenda bool
594*705b1809SJason Molenda SBThread::GetInfoItemByPathAsString (const char *path, SBStream &strm)
595*705b1809SJason Molenda {
596*705b1809SJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
597*705b1809SJason Molenda     bool success = false;
598*705b1809SJason Molenda     Mutex::Locker api_locker;
599*705b1809SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
600*705b1809SJason Molenda 
601*705b1809SJason Molenda     if (exe_ctx.HasThreadScope())
602*705b1809SJason Molenda     {
603*705b1809SJason Molenda         Process::StopLocker stop_locker;
604*705b1809SJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
605*705b1809SJason Molenda         {
606*705b1809SJason Molenda             Thread *thread = exe_ctx.GetThreadPtr();
607*705b1809SJason Molenda             StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo();
608*705b1809SJason Molenda             if (info_root_sp)
609*705b1809SJason Molenda             {
610*705b1809SJason Molenda                 StructuredData::ObjectSP node = info_root_sp->GetObjectForDotSeparatedPath (path);
611*705b1809SJason Molenda                 if (node)
612*705b1809SJason Molenda                 {
613*705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeString)
614*705b1809SJason Molenda                     {
615*705b1809SJason Molenda                         strm.Printf ("%s", node->GetAsString()->GetValue().c_str());
616*705b1809SJason Molenda                         success = true;
617*705b1809SJason Molenda                     }
618*705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeInteger)
619*705b1809SJason Molenda                     {
620*705b1809SJason Molenda                         strm.Printf ("0x%" PRIx64, node->GetAsInteger()->GetValue());
621*705b1809SJason Molenda                         success = true;
622*705b1809SJason Molenda                     }
623*705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeFloat)
624*705b1809SJason Molenda                     {
625*705b1809SJason Molenda                         strm.Printf ("0x%f", node->GetAsFloat()->GetValue());
626*705b1809SJason Molenda                         success = true;
627*705b1809SJason Molenda                     }
628*705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeBoolean)
629*705b1809SJason Molenda                     {
630*705b1809SJason Molenda                         if (node->GetAsBoolean()->GetValue() == true)
631*705b1809SJason Molenda                             strm.Printf ("true");
632*705b1809SJason Molenda                         else
633*705b1809SJason Molenda                             strm.Printf ("false");
634*705b1809SJason Molenda                         success = true;
635*705b1809SJason Molenda                     }
636*705b1809SJason Molenda                     if (node->GetType() == StructuredData::Type::eTypeNull)
637*705b1809SJason Molenda                     {
638*705b1809SJason Molenda                         strm.Printf ("null");
639*705b1809SJason Molenda                         success = true;
640*705b1809SJason Molenda                     }
641*705b1809SJason Molenda                 }
642*705b1809SJason Molenda             }
643*705b1809SJason Molenda         }
644*705b1809SJason Molenda         else
645*705b1809SJason Molenda         {
646*705b1809SJason Molenda             if (log)
647*705b1809SJason Molenda                 log->Printf ("SBThread(%p)::GetInfoItemByPathAsString() => error: process is running",
648*705b1809SJason Molenda                              static_cast<void*>(exe_ctx.GetThreadPtr()));
649*705b1809SJason Molenda         }
650*705b1809SJason Molenda     }
651*705b1809SJason Molenda 
652*705b1809SJason Molenda     if (log)
653*705b1809SJason Molenda         log->Printf ("SBThread(%p)::GetInfoItemByPathAsString () => %s",
654*705b1809SJason Molenda                      static_cast<void*>(exe_ctx.GetThreadPtr()),
655*705b1809SJason Molenda                      strm.GetData());
656*705b1809SJason Molenda 
657*705b1809SJason Molenda     return success;
658*705b1809SJason Molenda }
659*705b1809SJason Molenda 
660*705b1809SJason Molenda 
66164e7ead1SJim Ingham SBError
66264e7ead1SJim Ingham SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
66364e7ead1SJim Ingham {
66464e7ead1SJim Ingham     SBError sb_error;
66564e7ead1SJim Ingham 
66664e7ead1SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
66764e7ead1SJim Ingham     if (!process)
66864e7ead1SJim Ingham     {
66964e7ead1SJim Ingham         sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
67064e7ead1SJim Ingham         return sb_error;
67164e7ead1SJim Ingham     }
67264e7ead1SJim Ingham 
67364e7ead1SJim Ingham     Thread *thread = exe_ctx.GetThreadPtr();
67464e7ead1SJim Ingham     if (!thread)
67564e7ead1SJim Ingham     {
67664e7ead1SJim Ingham         sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
67764e7ead1SJim Ingham         return sb_error;
67864e7ead1SJim Ingham     }
67964e7ead1SJim Ingham 
68064e7ead1SJim Ingham     // User level plans should be Master Plans so they can be interrupted, other plans executed, and
68164e7ead1SJim Ingham     // then a "continue" will resume the plan.
68264e7ead1SJim Ingham     if (new_plan != NULL)
68364e7ead1SJim Ingham     {
68464e7ead1SJim Ingham         new_plan->SetIsMasterPlan(true);
68564e7ead1SJim Ingham         new_plan->SetOkayToDiscard(false);
68664e7ead1SJim Ingham     }
68764e7ead1SJim Ingham 
68864e7ead1SJim Ingham     // Why do we need to set the current thread by ID here???
68964e7ead1SJim Ingham     process->GetThreadList().SetSelectedThreadByID (thread->GetID());
69064e7ead1SJim Ingham     sb_error.ref() = process->Resume();
69164e7ead1SJim Ingham 
69264e7ead1SJim Ingham     if (sb_error.Success())
69364e7ead1SJim Ingham     {
69464e7ead1SJim Ingham         // If we are doing synchronous mode, then wait for the
69564e7ead1SJim Ingham         // process to stop yet again!
69664e7ead1SJim Ingham         if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
69764e7ead1SJim Ingham             process->WaitForProcessToStop (NULL);
69864e7ead1SJim Ingham     }
69964e7ead1SJim Ingham 
70064e7ead1SJim Ingham     return sb_error;
70164e7ead1SJim Ingham }
70230fdc8d8SChris Lattner 
70330fdc8d8SChris Lattner void
70430fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
70530fdc8d8SChris Lattner {
7065160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
707ceb6b139SCaroline Tice 
7084fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7094fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7104fc6cb9cSJim Ingham 
71117a6ad05SGreg Clayton 
712ceb6b139SCaroline Tice     if (log)
713324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')",
714324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
715ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
716ceb6b139SCaroline Tice 
7171ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
71830fdc8d8SChris Lattner     {
7191ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
7207ba6e991SJim Ingham         bool abort_other_plans = false;
721b57e4a1bSJason Molenda         StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
72230fdc8d8SChris Lattner 
7234d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp;
72430fdc8d8SChris Lattner         if (frame_sp)
72530fdc8d8SChris Lattner         {
72630fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
72730fdc8d8SChris Lattner             {
7284b4b2478SJim Ingham                 const LazyBool avoid_no_debug = eLazyBoolCalculate;
72930fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
7304d56e9c1SJim Ingham                 new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
73130fdc8d8SChris Lattner                                                                     sc.line_entry.range,
73230fdc8d8SChris Lattner                                                                     sc,
7334b4b2478SJim Ingham                                                                     stop_other_threads,
7344b4b2478SJim Ingham                                                                     avoid_no_debug);
73530fdc8d8SChris Lattner             }
73630fdc8d8SChris Lattner             else
73730fdc8d8SChris Lattner             {
7384d56e9c1SJim Ingham                 new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
73930fdc8d8SChris Lattner                                                                                abort_other_plans,
74030fdc8d8SChris Lattner                                                                                stop_other_threads);
74130fdc8d8SChris Lattner             }
74230fdc8d8SChris Lattner         }
74330fdc8d8SChris Lattner 
74464e7ead1SJim Ingham         // This returns an error, we should use it!
7454d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
74630fdc8d8SChris Lattner     }
74730fdc8d8SChris Lattner }
74830fdc8d8SChris Lattner 
74930fdc8d8SChris Lattner void
75030fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
75130fdc8d8SChris Lattner {
752c627682eSJim Ingham     StepInto (NULL, stop_other_threads);
753c627682eSJim Ingham }
754c627682eSJim Ingham 
755c627682eSJim Ingham void
756c627682eSJim Ingham SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
757c627682eSJim Ingham {
7585160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
759ceb6b139SCaroline Tice 
7604fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7614fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
76217a6ad05SGreg Clayton 
76317a6ad05SGreg Clayton     if (log)
764c627682eSJim Ingham         log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
765324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
766c627682eSJim Ingham                      target_name? target_name: "<NULL>",
76717a6ad05SGreg Clayton                      Thread::RunModeAsCString (stop_other_threads));
768c627682eSJim Ingham 
7691ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
77030fdc8d8SChris Lattner     {
7717ba6e991SJim Ingham         bool abort_other_plans = false;
77230fdc8d8SChris Lattner 
7731ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
774b57e4a1bSJason Molenda         StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
7754d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp;
77630fdc8d8SChris Lattner 
77730fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
77830fdc8d8SChris Lattner         {
7794b4b2478SJim Ingham             const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate;
7804b4b2478SJim Ingham             const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate;
78130fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
7824d56e9c1SJim Ingham             new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
78330fdc8d8SChris Lattner                                                               sc.line_entry.range,
78430fdc8d8SChris Lattner                                                               sc,
785c627682eSJim Ingham                                                               target_name,
786474966a4SGreg Clayton                                                               stop_other_threads,
7874b4b2478SJim Ingham                                                               step_in_avoids_code_without_debug_info,
7884b4b2478SJim Ingham                                                               step_out_avoids_code_without_debug_info);
78930fdc8d8SChris Lattner         }
79030fdc8d8SChris Lattner         else
79130fdc8d8SChris Lattner         {
7924d56e9c1SJim Ingham             new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
79330fdc8d8SChris Lattner                                                                            abort_other_plans,
79430fdc8d8SChris Lattner                                                                            stop_other_threads);
79530fdc8d8SChris Lattner         }
79630fdc8d8SChris Lattner 
79764e7ead1SJim Ingham         // This returns an error, we should use it!
7984d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
79930fdc8d8SChris Lattner     }
80030fdc8d8SChris Lattner }
80130fdc8d8SChris Lattner 
80230fdc8d8SChris Lattner void
80330fdc8d8SChris Lattner SBThread::StepOut ()
80430fdc8d8SChris Lattner {
8055160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
806ceb6b139SCaroline Tice 
8074fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8084fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8094fc6cb9cSJim Ingham 
810ceb6b139SCaroline Tice 
81117a6ad05SGreg Clayton     if (log)
812324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOut ()",
813324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()));
81417a6ad05SGreg Clayton 
8151ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
81630fdc8d8SChris Lattner     {
8177ba6e991SJim Ingham         bool abort_other_plans = false;
81894b09246SJim Ingham         bool stop_other_threads = false;
81930fdc8d8SChris Lattner 
8201ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
8211ac04c30SGreg Clayton 
8224b4b2478SJim Ingham         const LazyBool avoid_no_debug = eLazyBoolCalculate;
8234d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
824481cef25SGreg Clayton                                                                     NULL,
825481cef25SGreg Clayton                                                                     false,
826481cef25SGreg Clayton                                                                     stop_other_threads,
827481cef25SGreg Clayton                                                                     eVoteYes,
828481cef25SGreg Clayton                                                                     eVoteNoOpinion,
8294b4b2478SJim Ingham                                                                     0,
8304b4b2478SJim Ingham                                                                     avoid_no_debug));
831481cef25SGreg Clayton 
83264e7ead1SJim Ingham         // This returns an error, we should use it!
8334d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
834481cef25SGreg Clayton     }
835481cef25SGreg Clayton }
836481cef25SGreg Clayton 
837481cef25SGreg Clayton void
838481cef25SGreg Clayton SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
839481cef25SGreg Clayton {
8405160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
841481cef25SGreg Clayton 
8424fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8434fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8444fc6cb9cSJim Ingham 
845b57e4a1bSJason Molenda     StackFrameSP frame_sp (sb_frame.GetFrameSP());
846481cef25SGreg Clayton     if (log)
847481cef25SGreg Clayton     {
848481cef25SGreg Clayton         SBStream frame_desc_strm;
849481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
850324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)",
851324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
852324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
853324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
854481cef25SGreg Clayton     }
855481cef25SGreg Clayton 
8561ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
857481cef25SGreg Clayton     {
8587ba6e991SJim Ingham         bool abort_other_plans = false;
85994b09246SJim Ingham         bool stop_other_threads = false;
8601ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
861481cef25SGreg Clayton 
8624d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
863481cef25SGreg Clayton                                                                     NULL,
864481cef25SGreg Clayton                                                                     false,
865481cef25SGreg Clayton                                                                     stop_other_threads,
866481cef25SGreg Clayton                                                                     eVoteYes,
867481cef25SGreg Clayton                                                                     eVoteNoOpinion,
8684d56e9c1SJim Ingham                                                                     frame_sp->GetFrameIndex()));
86930fdc8d8SChris Lattner 
87064e7ead1SJim Ingham         // This returns an error, we should use it!
8714d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
87230fdc8d8SChris Lattner     }
87330fdc8d8SChris Lattner }
87430fdc8d8SChris Lattner 
87530fdc8d8SChris Lattner void
87630fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
87730fdc8d8SChris Lattner {
8785160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
879ceb6b139SCaroline Tice 
8804fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8814fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8824fc6cb9cSJim Ingham 
8831ac04c30SGreg Clayton 
884ceb6b139SCaroline Tice 
88517a6ad05SGreg Clayton     if (log)
886324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)",
887324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), step_over);
88817a6ad05SGreg Clayton 
8891ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
89030fdc8d8SChris Lattner     {
8911ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
8924d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
89364e7ead1SJim Ingham 
89464e7ead1SJim Ingham         // This returns an error, we should use it!
8954d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
89630fdc8d8SChris Lattner     }
89730fdc8d8SChris Lattner }
89830fdc8d8SChris Lattner 
89930fdc8d8SChris Lattner void
90030fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
90130fdc8d8SChris Lattner {
9025160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
903ceb6b139SCaroline Tice 
9044fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9054fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9064fc6cb9cSJim Ingham 
907ceb6b139SCaroline Tice 
90817a6ad05SGreg Clayton     if (log)
909324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")",
910324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), addr);
91117a6ad05SGreg Clayton 
9121ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
91330fdc8d8SChris Lattner     {
9147ba6e991SJim Ingham         bool abort_other_plans = false;
91530fdc8d8SChris Lattner         bool stop_other_threads = true;
91630fdc8d8SChris Lattner 
917e72dfb32SGreg Clayton         Address target_addr (addr);
91830fdc8d8SChris Lattner 
9191ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
9201ac04c30SGreg Clayton 
9214d56e9c1SJim Ingham         ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads));
92264e7ead1SJim Ingham 
92364e7ead1SJim Ingham         // This returns an error, we should use it!
9244d56e9c1SJim Ingham         ResumeNewPlan (exe_ctx, new_plan_sp.get());
92530fdc8d8SChris Lattner     }
92630fdc8d8SChris Lattner }
92730fdc8d8SChris Lattner 
928481cef25SGreg Clayton SBError
929481cef25SGreg Clayton SBThread::StepOverUntil (lldb::SBFrame &sb_frame,
930481cef25SGreg Clayton                          lldb::SBFileSpec &sb_file_spec,
931481cef25SGreg Clayton                          uint32_t line)
932481cef25SGreg Clayton {
933481cef25SGreg Clayton     SBError sb_error;
9345160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
935481cef25SGreg Clayton     char path[PATH_MAX];
936481cef25SGreg Clayton 
9374fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9384fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9394fc6cb9cSJim Ingham 
940b57e4a1bSJason Molenda     StackFrameSP frame_sp (sb_frame.GetFrameSP());
94117a6ad05SGreg Clayton 
942481cef25SGreg Clayton     if (log)
943481cef25SGreg Clayton     {
944481cef25SGreg Clayton         SBStream frame_desc_strm;
945481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
946481cef25SGreg Clayton         sb_file_spec->GetPath (path, sizeof(path));
947481cef25SGreg Clayton         log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
948324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
949324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
950324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData(), path, line);
951481cef25SGreg Clayton     }
952481cef25SGreg Clayton 
9531ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
954481cef25SGreg Clayton     {
9551ac04c30SGreg Clayton         Target *target = exe_ctx.GetTargetPtr();
9561ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
957481cef25SGreg Clayton 
958481cef25SGreg Clayton         if (line == 0)
959481cef25SGreg Clayton         {
960481cef25SGreg Clayton             sb_error.SetErrorString("invalid line argument");
961481cef25SGreg Clayton             return sb_error;
962481cef25SGreg Clayton         }
963481cef25SGreg Clayton 
964b9556accSGreg Clayton         if (!frame_sp)
965481cef25SGreg Clayton         {
9661ac04c30SGreg Clayton             frame_sp = thread->GetSelectedFrame ();
967481cef25SGreg Clayton             if (!frame_sp)
9681ac04c30SGreg Clayton                 frame_sp = thread->GetStackFrameAtIndex (0);
969481cef25SGreg Clayton         }
970481cef25SGreg Clayton 
971481cef25SGreg Clayton         SymbolContext frame_sc;
972481cef25SGreg Clayton         if (!frame_sp)
973481cef25SGreg Clayton         {
974481cef25SGreg Clayton             sb_error.SetErrorString("no valid frames in thread to step");
975481cef25SGreg Clayton             return sb_error;
976481cef25SGreg Clayton         }
977481cef25SGreg Clayton 
978481cef25SGreg Clayton         // If we have a frame, get its line
979481cef25SGreg Clayton         frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit  |
980481cef25SGreg Clayton                                                eSymbolContextFunction  |
981481cef25SGreg Clayton                                                eSymbolContextLineEntry |
982481cef25SGreg Clayton                                                eSymbolContextSymbol    );
983481cef25SGreg Clayton 
984481cef25SGreg Clayton         if (frame_sc.comp_unit == NULL)
985481cef25SGreg Clayton         {
986481cef25SGreg Clayton             sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
987481cef25SGreg Clayton             return sb_error;
988481cef25SGreg Clayton         }
989481cef25SGreg Clayton 
990481cef25SGreg Clayton         FileSpec step_file_spec;
991481cef25SGreg Clayton         if (sb_file_spec.IsValid())
992481cef25SGreg Clayton         {
993481cef25SGreg Clayton             // The file spec passed in was valid, so use it
994481cef25SGreg Clayton             step_file_spec = sb_file_spec.ref();
995481cef25SGreg Clayton         }
996481cef25SGreg Clayton         else
997481cef25SGreg Clayton         {
998481cef25SGreg Clayton             if (frame_sc.line_entry.IsValid())
999481cef25SGreg Clayton                 step_file_spec = frame_sc.line_entry.file;
1000481cef25SGreg Clayton             else
1001481cef25SGreg Clayton             {
1002481cef25SGreg Clayton                 sb_error.SetErrorString("invalid file argument or no file for frame");
1003481cef25SGreg Clayton                 return sb_error;
1004481cef25SGreg Clayton             }
1005481cef25SGreg Clayton         }
1006481cef25SGreg Clayton 
10079b70ddb3SJim Ingham         // Grab the current function, then we will make sure the "until" address is
10089b70ddb3SJim Ingham         // within the function.  We discard addresses that are out of the current
10099b70ddb3SJim Ingham         // function, and then if there are no addresses remaining, give an appropriate
10109b70ddb3SJim Ingham         // error message.
10119b70ddb3SJim Ingham 
10129b70ddb3SJim Ingham         bool all_in_function = true;
10139b70ddb3SJim Ingham         AddressRange fun_range = frame_sc.function->GetAddressRange();
10149b70ddb3SJim Ingham 
1015481cef25SGreg Clayton         std::vector<addr_t> step_over_until_addrs;
10167ba6e991SJim Ingham         const bool abort_other_plans = false;
1017c02e3344SJim Ingham         const bool stop_other_threads = false;
1018481cef25SGreg Clayton         const bool check_inlines = true;
1019481cef25SGreg Clayton         const bool exact = false;
1020481cef25SGreg Clayton 
1021481cef25SGreg Clayton         SymbolContextList sc_list;
10229b70ddb3SJim Ingham         const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
10239b70ddb3SJim Ingham                                                                                line,
10249b70ddb3SJim Ingham                                                                                check_inlines,
10259b70ddb3SJim Ingham                                                                                exact,
10269b70ddb3SJim Ingham                                                                                eSymbolContextLineEntry,
10279b70ddb3SJim Ingham                                                                                sc_list);
1028481cef25SGreg Clayton         if (num_matches > 0)
1029481cef25SGreg Clayton         {
1030481cef25SGreg Clayton             SymbolContext sc;
1031481cef25SGreg Clayton             for (uint32_t i=0; i<num_matches; ++i)
1032481cef25SGreg Clayton             {
1033481cef25SGreg Clayton                 if (sc_list.GetContextAtIndex(i, sc))
1034481cef25SGreg Clayton                 {
10359b70ddb3SJim Ingham                     addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
1036481cef25SGreg Clayton                     if (step_addr != LLDB_INVALID_ADDRESS)
1037481cef25SGreg Clayton                     {
10389b70ddb3SJim Ingham                         if (fun_range.ContainsLoadAddress(step_addr, target))
1039481cef25SGreg Clayton                             step_over_until_addrs.push_back(step_addr);
10409b70ddb3SJim Ingham                         else
10419b70ddb3SJim Ingham                             all_in_function = false;
1042481cef25SGreg Clayton                     }
1043481cef25SGreg Clayton                 }
1044481cef25SGreg Clayton             }
1045481cef25SGreg Clayton         }
1046481cef25SGreg Clayton 
1047481cef25SGreg Clayton         if (step_over_until_addrs.empty())
1048481cef25SGreg Clayton         {
10499b70ddb3SJim Ingham             if (all_in_function)
10509b70ddb3SJim Ingham             {
1051481cef25SGreg Clayton                 step_file_spec.GetPath (path, sizeof(path));
1052fd54b368SJason Molenda                 sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
1053481cef25SGreg Clayton             }
1054481cef25SGreg Clayton             else
105586edbf41SGreg Clayton                 sb_error.SetErrorString ("step until target not in current function");
10569b70ddb3SJim Ingham         }
10579b70ddb3SJim Ingham         else
1058481cef25SGreg Clayton         {
10594d56e9c1SJim Ingham             ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
1060481cef25SGreg Clayton                                                                         &step_over_until_addrs[0],
1061481cef25SGreg Clayton                                                                         step_over_until_addrs.size(),
1062481cef25SGreg Clayton                                                                         stop_other_threads,
10634d56e9c1SJim Ingham                                                                         frame_sp->GetFrameIndex()));
1064481cef25SGreg Clayton 
10654d56e9c1SJim Ingham             sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
1066481cef25SGreg Clayton         }
1067481cef25SGreg Clayton     }
1068481cef25SGreg Clayton     else
1069481cef25SGreg Clayton     {
1070481cef25SGreg Clayton         sb_error.SetErrorString("this SBThread object is invalid");
1071481cef25SGreg Clayton     }
1072481cef25SGreg Clayton     return sb_error;
1073481cef25SGreg Clayton }
1074481cef25SGreg Clayton 
10754413758cSJim Ingham SBError
1076f86248d9SRichard Mitton SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line)
1077f86248d9SRichard Mitton {
1078f86248d9SRichard Mitton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1079f86248d9SRichard Mitton     SBError sb_error;
1080f86248d9SRichard Mitton 
1081f86248d9SRichard Mitton     Mutex::Locker api_locker;
1082f86248d9SRichard Mitton     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1083f86248d9SRichard Mitton 
1084f86248d9SRichard Mitton     if (log)
1085324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)",
1086324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1087324a1036SSaleem Abdulrasool                      file_spec->GetPath().c_str(), line);
1088f86248d9SRichard Mitton 
1089f86248d9SRichard Mitton     if (!exe_ctx.HasThreadScope())
1090f86248d9SRichard Mitton     {
1091f86248d9SRichard Mitton         sb_error.SetErrorString("this SBThread object is invalid");
1092f86248d9SRichard Mitton         return sb_error;
1093f86248d9SRichard Mitton     }
1094f86248d9SRichard Mitton 
1095f86248d9SRichard Mitton     Thread *thread = exe_ctx.GetThreadPtr();
1096f86248d9SRichard Mitton 
1097f86248d9SRichard Mitton     Error err = thread->JumpToLine (file_spec.get(), line, true);
1098f86248d9SRichard Mitton     sb_error.SetError (err);
1099f86248d9SRichard Mitton     return sb_error;
1100f86248d9SRichard Mitton }
1101f86248d9SRichard Mitton 
1102f86248d9SRichard Mitton SBError
1103cb640dd8SJim Ingham SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
11044413758cSJim Ingham {
11054413758cSJim Ingham     SBError sb_error;
11064413758cSJim Ingham 
11075160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11084413758cSJim Ingham 
11094413758cSJim Ingham     Mutex::Locker api_locker;
11104413758cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11114413758cSJim Ingham 
11124413758cSJim Ingham 
11134413758cSJim Ingham     if (log)
1114324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)",
1115324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1116324a1036SSaleem Abdulrasool                      frame.GetFrameID());
11174413758cSJim Ingham 
11184413758cSJim Ingham     if (exe_ctx.HasThreadScope())
11194413758cSJim Ingham     {
11204413758cSJim Ingham         Thread *thread = exe_ctx.GetThreadPtr();
1121cb640dd8SJim Ingham         sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
11224413758cSJim Ingham     }
11234413758cSJim Ingham 
11244413758cSJim Ingham     return sb_error;
11254413758cSJim Ingham }
11264413758cSJim Ingham 
1127481cef25SGreg Clayton 
1128722a0cdcSGreg Clayton bool
1129722a0cdcSGreg Clayton SBThread::Suspend()
1130722a0cdcSGreg Clayton {
11315160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11327fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
1133c9858e4dSGreg Clayton     bool result = false;
11341ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1135722a0cdcSGreg Clayton     {
1136c9858e4dSGreg Clayton         Process::StopLocker stop_locker;
1137c9858e4dSGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1138c9858e4dSGreg Clayton         {
11391ac04c30SGreg Clayton             exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
1140c9858e4dSGreg Clayton             result = true;
1141722a0cdcSGreg Clayton         }
1142c9858e4dSGreg Clayton         else
1143c9858e4dSGreg Clayton         {
1144c9858e4dSGreg Clayton             if (log)
1145324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::Suspend() => error: process is running",
1146324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1147c9858e4dSGreg Clayton         }
1148c9858e4dSGreg Clayton     }
1149c9858e4dSGreg Clayton     if (log)
1150324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::Suspend() => %i",
1151324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), result);
1152c9858e4dSGreg Clayton     return result;
1153722a0cdcSGreg Clayton }
1154722a0cdcSGreg Clayton 
1155722a0cdcSGreg Clayton bool
1156722a0cdcSGreg Clayton SBThread::Resume ()
1157722a0cdcSGreg Clayton {
11585160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11597fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
1160c9858e4dSGreg Clayton     bool result = false;
11611ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1162722a0cdcSGreg Clayton     {
1163c9858e4dSGreg Clayton         Process::StopLocker stop_locker;
1164c9858e4dSGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1165c9858e4dSGreg Clayton         {
11666c9ed91cSJim Ingham             const bool override_suspend = true;
11676c9ed91cSJim Ingham             exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend);
1168c9858e4dSGreg Clayton             result = true;
1169722a0cdcSGreg Clayton         }
1170c9858e4dSGreg Clayton         else
1171c9858e4dSGreg Clayton         {
1172c9858e4dSGreg Clayton             if (log)
1173324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::Resume() => error: process is running",
1174324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1175c9858e4dSGreg Clayton         }
1176c9858e4dSGreg Clayton     }
1177c9858e4dSGreg Clayton     if (log)
1178324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::Resume() => %i",
1179324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), result);
1180c9858e4dSGreg Clayton     return result;
1181722a0cdcSGreg Clayton }
1182722a0cdcSGreg Clayton 
1183722a0cdcSGreg Clayton bool
1184722a0cdcSGreg Clayton SBThread::IsSuspended()
1185722a0cdcSGreg Clayton {
11867fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
11871ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
11881ac04c30SGreg Clayton         return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
1189722a0cdcSGreg Clayton     return false;
1190722a0cdcSGreg Clayton }
1191722a0cdcSGreg Clayton 
1192a75418dbSAndrew Kaylor bool
1193a75418dbSAndrew Kaylor SBThread::IsStopped()
1194a75418dbSAndrew Kaylor {
1195a75418dbSAndrew Kaylor     ExecutionContext exe_ctx (m_opaque_sp.get());
1196a75418dbSAndrew Kaylor     if (exe_ctx.HasThreadScope())
1197a75418dbSAndrew Kaylor         return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
1198a75418dbSAndrew Kaylor     return false;
1199a75418dbSAndrew Kaylor }
1200a75418dbSAndrew Kaylor 
120130fdc8d8SChris Lattner SBProcess
120230fdc8d8SChris Lattner SBThread::GetProcess ()
120330fdc8d8SChris Lattner {
1204b9556accSGreg Clayton     SBProcess sb_process;
12057fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
12061ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
120730fdc8d8SChris Lattner     {
120830fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
12091ac04c30SGreg Clayton         sb_process.SetSP (exe_ctx.GetProcessSP());
121030fdc8d8SChris Lattner     }
1211ceb6b139SCaroline Tice 
12125160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1213ceb6b139SCaroline Tice     if (log)
1214ceb6b139SCaroline Tice     {
1215481cef25SGreg Clayton         SBStream frame_desc_strm;
1216b9556accSGreg Clayton         sb_process.GetDescription (frame_desc_strm);
1217324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s",
1218324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1219324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_process.GetSP().get()),
1220324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1221ceb6b139SCaroline Tice     }
1222ceb6b139SCaroline Tice 
1223b9556accSGreg Clayton     return sb_process;
122430fdc8d8SChris Lattner }
122530fdc8d8SChris Lattner 
122630fdc8d8SChris Lattner uint32_t
122730fdc8d8SChris Lattner SBThread::GetNumFrames ()
122830fdc8d8SChris Lattner {
12295160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1230ceb6b139SCaroline Tice 
1231ceb6b139SCaroline Tice     uint32_t num_frames = 0;
12324fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12334fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12344fc6cb9cSJim Ingham 
12351ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1236af67cecdSGreg Clayton     {
12377fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12387fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
12397fdf9ef1SGreg Clayton         {
12401ac04c30SGreg Clayton             num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1241af67cecdSGreg Clayton         }
1242c9858e4dSGreg Clayton         else
1243c9858e4dSGreg Clayton         {
1244c9858e4dSGreg Clayton             if (log)
1245324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running",
1246324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1247c9858e4dSGreg Clayton         }
12487fdf9ef1SGreg Clayton     }
1249ceb6b139SCaroline Tice 
1250ceb6b139SCaroline Tice     if (log)
1251324a1036SSaleem Abdulrasool         log->Printf ("SBThread(%p)::GetNumFrames () => %u",
1252324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames);
1253ceb6b139SCaroline Tice 
1254ceb6b139SCaroline Tice     return num_frames;
125530fdc8d8SChris Lattner }
125630fdc8d8SChris Lattner 
125730fdc8d8SChris Lattner SBFrame
125830fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
125930fdc8d8SChris Lattner {
12605160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1261ceb6b139SCaroline Tice 
126230fdc8d8SChris Lattner     SBFrame sb_frame;
1263b57e4a1bSJason Molenda     StackFrameSP frame_sp;
12644fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12654fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12664fc6cb9cSJim Ingham 
12671ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1268af67cecdSGreg Clayton     {
12697fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12707fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
12717fdf9ef1SGreg Clayton         {
12721ac04c30SGreg Clayton             frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1273b9556accSGreg Clayton             sb_frame.SetFrameSP (frame_sp);
1274af67cecdSGreg Clayton         }
1275c9858e4dSGreg Clayton         else
1276c9858e4dSGreg Clayton         {
1277c9858e4dSGreg Clayton             if (log)
1278324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running",
1279324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1280c9858e4dSGreg Clayton         }
12817fdf9ef1SGreg Clayton     }
1282ceb6b139SCaroline Tice 
1283ceb6b139SCaroline Tice     if (log)
1284ceb6b139SCaroline Tice     {
1285481cef25SGreg Clayton         SBStream frame_desc_strm;
1286481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
12874838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
1288324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1289324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1290324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1291ceb6b139SCaroline Tice     }
1292ceb6b139SCaroline Tice 
129330fdc8d8SChris Lattner     return sb_frame;
129430fdc8d8SChris Lattner }
129530fdc8d8SChris Lattner 
1296f028a1fbSGreg Clayton lldb::SBFrame
1297f028a1fbSGreg Clayton SBThread::GetSelectedFrame ()
1298f028a1fbSGreg Clayton {
12995160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1300f028a1fbSGreg Clayton 
1301f028a1fbSGreg Clayton     SBFrame sb_frame;
1302b57e4a1bSJason Molenda     StackFrameSP frame_sp;
13034fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13044fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13054fc6cb9cSJim Ingham 
13061ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1307af67cecdSGreg Clayton     {
13087fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13097fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13107fdf9ef1SGreg Clayton         {
13111ac04c30SGreg Clayton             frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1312b9556accSGreg Clayton             sb_frame.SetFrameSP (frame_sp);
1313af67cecdSGreg Clayton         }
1314c9858e4dSGreg Clayton         else
1315c9858e4dSGreg Clayton         {
1316c9858e4dSGreg Clayton             if (log)
1317324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running",
1318324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1319c9858e4dSGreg Clayton         }
13207fdf9ef1SGreg Clayton     }
1321f028a1fbSGreg Clayton 
1322f028a1fbSGreg Clayton     if (log)
1323f028a1fbSGreg Clayton     {
1324481cef25SGreg Clayton         SBStream frame_desc_strm;
1325481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
1326f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
1327324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()),
1328324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1329324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1330f028a1fbSGreg Clayton     }
1331f028a1fbSGreg Clayton 
1332f028a1fbSGreg Clayton     return sb_frame;
1333f028a1fbSGreg Clayton }
1334f028a1fbSGreg Clayton 
1335f028a1fbSGreg Clayton lldb::SBFrame
1336f028a1fbSGreg Clayton SBThread::SetSelectedFrame (uint32_t idx)
1337f028a1fbSGreg Clayton {
13385160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1339f028a1fbSGreg Clayton 
1340f028a1fbSGreg Clayton     SBFrame sb_frame;
1341b57e4a1bSJason Molenda     StackFrameSP frame_sp;
13424fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13434fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13444fc6cb9cSJim Ingham 
13451ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1346f028a1fbSGreg Clayton     {
13477fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13487fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
13497fdf9ef1SGreg Clayton         {
13501ac04c30SGreg Clayton             Thread *thread = exe_ctx.GetThreadPtr();
13511ac04c30SGreg Clayton             frame_sp = thread->GetStackFrameAtIndex (idx);
1352f028a1fbSGreg Clayton             if (frame_sp)
1353f028a1fbSGreg Clayton             {
13541ac04c30SGreg Clayton                 thread->SetSelectedFrame (frame_sp.get());
1355b9556accSGreg Clayton                 sb_frame.SetFrameSP (frame_sp);
1356f028a1fbSGreg Clayton             }
1357f028a1fbSGreg Clayton         }
1358c9858e4dSGreg Clayton         else
1359c9858e4dSGreg Clayton         {
1360c9858e4dSGreg Clayton             if (log)
1361324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running",
1362324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
1363c9858e4dSGreg Clayton         }
13647fdf9ef1SGreg Clayton     }
1365f028a1fbSGreg Clayton 
1366f028a1fbSGreg Clayton     if (log)
1367f028a1fbSGreg Clayton     {
1368481cef25SGreg Clayton         SBStream frame_desc_strm;
1369481cef25SGreg Clayton         sb_frame.GetDescription (frame_desc_strm);
1370f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
1371324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetThreadPtr()), idx,
1372324a1036SSaleem Abdulrasool                      static_cast<void*>(frame_sp.get()),
1373324a1036SSaleem Abdulrasool                      frame_desc_strm.GetData());
1374f028a1fbSGreg Clayton     }
1375f028a1fbSGreg Clayton     return sb_frame;
1376f028a1fbSGreg Clayton }
1377f028a1fbSGreg Clayton 
13784f465cffSJim Ingham bool
13794f465cffSJim Ingham SBThread::EventIsThreadEvent (const SBEvent &event)
13804f465cffSJim Ingham {
13814f465cffSJim Ingham     return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
13824f465cffSJim Ingham }
13834f465cffSJim Ingham 
13844f465cffSJim Ingham SBFrame
13854f465cffSJim Ingham SBThread::GetStackFrameFromEvent (const SBEvent &event)
13864f465cffSJim Ingham {
13874f465cffSJim Ingham     return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
13884f465cffSJim Ingham 
13894f465cffSJim Ingham }
13904f465cffSJim Ingham 
13914f465cffSJim Ingham SBThread
13924f465cffSJim Ingham SBThread::GetThreadFromEvent (const SBEvent &event)
13934f465cffSJim Ingham {
13944f465cffSJim Ingham     return Thread::ThreadEventData::GetThreadFromEvent (event.get());
13954f465cffSJim Ingham }
1396f028a1fbSGreg Clayton 
139730fdc8d8SChris Lattner bool
139830fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
139930fdc8d8SChris Lattner {
14007fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
140130fdc8d8SChris Lattner }
140230fdc8d8SChris Lattner 
140330fdc8d8SChris Lattner bool
140430fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
140530fdc8d8SChris Lattner {
14067fdf9ef1SGreg Clayton     return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
140730fdc8d8SChris Lattner }
1408dde9cff3SCaroline Tice 
1409dde9cff3SCaroline Tice bool
14104f465cffSJim Ingham SBThread::GetStatus (SBStream &status) const
14114f465cffSJim Ingham {
14124f465cffSJim Ingham     Stream &strm = status.ref();
14134f465cffSJim Ingham 
14144f465cffSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get());
14154f465cffSJim Ingham     if (exe_ctx.HasThreadScope())
14164f465cffSJim Ingham     {
14174f465cffSJim Ingham         exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
14184f465cffSJim Ingham     }
14194f465cffSJim Ingham     else
14204f465cffSJim Ingham         strm.PutCString ("No status");
14214f465cffSJim Ingham 
14224f465cffSJim Ingham     return true;
14234f465cffSJim Ingham }
14244f465cffSJim Ingham 
14254f465cffSJim Ingham bool
1426ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
1427ceb6b139SCaroline Tice {
1428da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1429da7bc7d0SGreg Clayton 
14307fdf9ef1SGreg Clayton     ExecutionContext exe_ctx (m_opaque_sp.get());
14311ac04c30SGreg Clayton     if (exe_ctx.HasThreadScope())
1432ceb6b139SCaroline Tice     {
1433d01b2953SDaniel Malea         strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
1434ceb6b139SCaroline Tice     }
1435ceb6b139SCaroline Tice     else
1436da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1437ceb6b139SCaroline Tice 
1438ceb6b139SCaroline Tice     return true;
1439ceb6b139SCaroline Tice }
14405dd4916fSJason Molenda 
14415dd4916fSJason Molenda SBThread
1442008c45f1SJason Molenda SBThread::GetExtendedBacktraceThread (const char *type)
14435dd4916fSJason Molenda {
14445dd4916fSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14455dd4916fSJason Molenda     Mutex::Locker api_locker;
14465dd4916fSJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14475dd4916fSJason Molenda     SBThread sb_origin_thread;
14485dd4916fSJason Molenda 
14495dd4916fSJason Molenda     if (exe_ctx.HasThreadScope())
14505dd4916fSJason Molenda     {
14515dd4916fSJason Molenda         Process::StopLocker stop_locker;
14525dd4916fSJason Molenda         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
14535dd4916fSJason Molenda         {
14547a2f7904SJason Molenda             ThreadSP real_thread(exe_ctx.GetThreadSP());
14555dd4916fSJason Molenda             if (real_thread)
14565dd4916fSJason Molenda             {
14575dd4916fSJason Molenda                 ConstString type_const (type);
14587a2f7904SJason Molenda                 Process *process = exe_ctx.GetProcessPtr();
14597a2f7904SJason Molenda                 if (process)
14607a2f7904SJason Molenda                 {
14617a2f7904SJason Molenda                     SystemRuntime *runtime = process->GetSystemRuntime();
14625dd4916fSJason Molenda                     if (runtime)
14635dd4916fSJason Molenda                     {
1464008c45f1SJason Molenda                         ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const));
1465a6e9130dSJason Molenda                         if (new_thread_sp)
1466a6e9130dSJason Molenda                         {
14677a2f7904SJason Molenda                             // Save this in the Process' ExtendedThreadList so a strong pointer retains the
14687a2f7904SJason Molenda                             // object.
14697a2f7904SJason Molenda                             process->GetExtendedThreadList().AddThread (new_thread_sp);
14707a2f7904SJason Molenda                             sb_origin_thread.SetThread (new_thread_sp);
1471a6e9130dSJason Molenda                             if (log)
1472a6e9130dSJason Molenda                             {
1473a6e9130dSJason Molenda                                 const char *queue_name = new_thread_sp->GetQueueName();
1474a6e9130dSJason Molenda                                 if (queue_name == NULL)
1475a6e9130dSJason Molenda                                     queue_name = "";
1476324a1036SSaleem Abdulrasool                                 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread created (%p) with queue_id 0x%" PRIx64 " queue name '%s'",
1477324a1036SSaleem Abdulrasool                                              static_cast<void*>(exe_ctx.GetThreadPtr()),
1478324a1036SSaleem Abdulrasool                                              static_cast<void*>(new_thread_sp.get()),
1479324a1036SSaleem Abdulrasool                                              new_thread_sp->GetQueueID(),
1480324a1036SSaleem Abdulrasool                                              queue_name);
1481a6e9130dSJason Molenda                             }
1482a6e9130dSJason Molenda                         }
14837a2f7904SJason Molenda                     }
14845dd4916fSJason Molenda                 }
14855dd4916fSJason Molenda             }
14865dd4916fSJason Molenda         }
14875dd4916fSJason Molenda         else
14885dd4916fSJason Molenda         {
14895dd4916fSJason Molenda             if (log)
1490324a1036SSaleem Abdulrasool                 log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running",
1491324a1036SSaleem Abdulrasool                              static_cast<void*>(exe_ctx.GetThreadPtr()));
14925dd4916fSJason Molenda         }
14935dd4916fSJason Molenda     }
14945dd4916fSJason Molenda 
1495ac605f4aSJason Molenda     if (log && sb_origin_thread.IsValid() == false)
1496324a1036SSaleem Abdulrasool         log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread",
1497324a1036SSaleem Abdulrasool                     static_cast<void*>(exe_ctx.GetThreadPtr()));
14985dd4916fSJason Molenda     return sb_origin_thread;
14995dd4916fSJason Molenda }
15008ee9cb58SJason Molenda 
15018ee9cb58SJason Molenda uint32_t
15028ee9cb58SJason Molenda SBThread::GetExtendedBacktraceOriginatingIndexID ()
15038ee9cb58SJason Molenda {
15048ee9cb58SJason Molenda     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
15058ee9cb58SJason Molenda     if (thread_sp)
15068ee9cb58SJason Molenda         return thread_sp->GetExtendedBacktraceOriginatingIndexID();
15078ee9cb58SJason Molenda     return LLDB_INVALID_INDEX32;
15088ee9cb58SJason Molenda }
1509b4892cd2SJason Molenda 
1510b4892cd2SJason Molenda bool
1511b4892cd2SJason Molenda SBThread::SafeToCallFunctions ()
1512b4892cd2SJason Molenda {
1513b4892cd2SJason Molenda     ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
1514b4892cd2SJason Molenda     if (thread_sp)
1515b4892cd2SJason Molenda         return thread_sp->SafeToCallFunctions();
1516b4892cd2SJason Molenda     return true;
1517b4892cd2SJason Molenda }
1518