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