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