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 104c5de699SEli Friedman #include "lldb/API/SBThread.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/API/SBSymbolContext.h" 1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 154e78f606SGreg Clayton #include "lldb/Breakpoint/BreakpointLocation.h" 166611103cSGreg Clayton #include "lldb/Core/Debugger.h" 17a75418dbSAndrew Kaylor #include "lldb/Core/State.h" 1830fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 20705b1809SJason Molenda #include "lldb/Core/StructuredData.h" 21a78bd7ffSZachary Turner #include "lldb/Core/ValueObject.h" 226611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 2393749ab3SZachary Turner #include "lldb/Symbol/SymbolContext.h" 2493749ab3SZachary Turner #include "lldb/Symbol/CompileUnit.h" 255dd4916fSJason Molenda #include "lldb/Target/SystemRuntime.h" 2630fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 2730fdc8d8SChris Lattner #include "lldb/Target/Process.h" 28b9ffa98cSJason Molenda #include "lldb/Target/Queue.h" 2993749ab3SZachary Turner #include "lldb/Target/UnixSignals.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" 442bdbfd50SJim 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) 117358cf1eaSGreg Clayton log->Printf ("SBThread(%p)::GetQueue() => error: process is running", 118b9ffa98cSJason Molenda static_cast<void*>(exe_ctx.GetThreadPtr())); 119b9ffa98cSJason Molenda } 120b9ffa98cSJason Molenda } 121b9ffa98cSJason Molenda 122b9ffa98cSJason Molenda if (log) 123358cf1eaSGreg Clayton log->Printf ("SBThread(%p)::GetQueue () => 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: 198afdf842bSKuba Brecka case eStopReasonInstrumentation: 1994e78f606SGreg Clayton // There is no data for these stop reasons. 2004e78f606SGreg Clayton return 0; 2014e78f606SGreg Clayton 2024e78f606SGreg Clayton case eStopReasonBreakpoint: 2034e78f606SGreg Clayton { 2044e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 2051ac04c30SGreg Clayton lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); 2064e78f606SGreg Clayton if (bp_site_sp) 2074e78f606SGreg Clayton return bp_site_sp->GetNumberOfOwners () * 2; 2084e78f606SGreg Clayton else 2094e78f606SGreg Clayton return 0; // Breakpoint must have cleared itself... 2104e78f606SGreg Clayton } 2114e78f606SGreg Clayton break; 2124e78f606SGreg Clayton 2134e78f606SGreg Clayton case eStopReasonWatchpoint: 214290fa41bSJohnny Chen return 1; 2154e78f606SGreg Clayton 2164e78f606SGreg Clayton case eStopReasonSignal: 2174e78f606SGreg Clayton return 1; 2184e78f606SGreg Clayton 2194e78f606SGreg Clayton case eStopReasonException: 2204e78f606SGreg Clayton return 1; 2214e78f606SGreg Clayton } 2224e78f606SGreg Clayton } 2234e78f606SGreg Clayton } 224c9858e4dSGreg Clayton else 225c9858e4dSGreg Clayton { 2265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 227c9858e4dSGreg Clayton if (log) 228324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running", 229324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 230c9858e4dSGreg Clayton } 2317fdf9ef1SGreg Clayton } 2324e78f606SGreg Clayton return 0; 2334e78f606SGreg Clayton } 2344e78f606SGreg Clayton 2354e78f606SGreg Clayton uint64_t 2364e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx) 2374e78f606SGreg Clayton { 2384fc6cb9cSJim Ingham Mutex::Locker api_locker; 2394fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2404fc6cb9cSJim Ingham 2411ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 2424e78f606SGreg Clayton { 2437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2447fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2457fdf9ef1SGreg Clayton { 2461ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 2471ac04c30SGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 2484e78f606SGreg Clayton if (stop_info_sp) 2494e78f606SGreg Clayton { 2504e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 2514e78f606SGreg Clayton switch (reason) 2524e78f606SGreg Clayton { 2534e78f606SGreg Clayton case eStopReasonInvalid: 2544e78f606SGreg Clayton case eStopReasonNone: 2554e78f606SGreg Clayton case eStopReasonTrace: 25690ba8115SGreg Clayton case eStopReasonExec: 2574e78f606SGreg Clayton case eStopReasonPlanComplete: 258f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 259afdf842bSKuba Brecka case eStopReasonInstrumentation: 2604e78f606SGreg Clayton // There is no data for these stop reasons. 2614e78f606SGreg Clayton return 0; 2624e78f606SGreg Clayton 2634e78f606SGreg Clayton case eStopReasonBreakpoint: 2644e78f606SGreg Clayton { 2654e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 2661ac04c30SGreg Clayton lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); 2674e78f606SGreg Clayton if (bp_site_sp) 2684e78f606SGreg Clayton { 2694e78f606SGreg Clayton uint32_t bp_index = idx / 2; 2704e78f606SGreg Clayton BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index)); 2714e78f606SGreg Clayton if (bp_loc_sp) 2724e78f606SGreg Clayton { 2738334e14eSGreg Clayton if (idx & 1) 2744e78f606SGreg Clayton { 2754e78f606SGreg Clayton // Odd idx, return the breakpoint location ID 2764e78f606SGreg Clayton return bp_loc_sp->GetID(); 2774e78f606SGreg Clayton } 2784e78f606SGreg Clayton else 2794e78f606SGreg Clayton { 2804e78f606SGreg Clayton // Even idx, return the breakpoint ID 2814e78f606SGreg Clayton return bp_loc_sp->GetBreakpoint().GetID(); 2824e78f606SGreg Clayton } 2834e78f606SGreg Clayton } 2844e78f606SGreg Clayton } 2854e78f606SGreg Clayton return LLDB_INVALID_BREAK_ID; 2864e78f606SGreg Clayton } 2874e78f606SGreg Clayton break; 2884e78f606SGreg Clayton 2894e78f606SGreg Clayton case eStopReasonWatchpoint: 290290fa41bSJohnny Chen return stop_info_sp->GetValue(); 2914e78f606SGreg Clayton 2924e78f606SGreg Clayton case eStopReasonSignal: 2934e78f606SGreg Clayton return stop_info_sp->GetValue(); 2944e78f606SGreg Clayton 2954e78f606SGreg Clayton case eStopReasonException: 2964e78f606SGreg Clayton return stop_info_sp->GetValue(); 2974e78f606SGreg Clayton } 2984e78f606SGreg Clayton } 2994e78f606SGreg Clayton } 300c9858e4dSGreg Clayton else 301c9858e4dSGreg Clayton { 3025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 303c9858e4dSGreg Clayton if (log) 304324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running", 305324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 306c9858e4dSGreg Clayton } 3077fdf9ef1SGreg Clayton } 3084e78f606SGreg Clayton return 0; 3094e78f606SGreg Clayton } 3104e78f606SGreg Clayton 311afdf842bSKuba Brecka bool 312afdf842bSKuba Brecka SBThread::GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream) 313afdf842bSKuba Brecka { 314afdf842bSKuba Brecka Stream &strm = stream.ref(); 315afdf842bSKuba Brecka 316afdf842bSKuba Brecka ExecutionContext exe_ctx (m_opaque_sp.get()); 317afdf842bSKuba Brecka if (! exe_ctx.HasThreadScope()) 318afdf842bSKuba Brecka return false; 319afdf842bSKuba Brecka 320afdf842bSKuba Brecka 321afdf842bSKuba Brecka StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); 322afdf842bSKuba Brecka StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); 323afdf842bSKuba Brecka if (! info) 324afdf842bSKuba Brecka return false; 325afdf842bSKuba Brecka 326afdf842bSKuba Brecka info->Dump(strm); 327afdf842bSKuba Brecka 328afdf842bSKuba Brecka return true; 329afdf842bSKuba Brecka } 330afdf842bSKuba Brecka 3314e78f606SGreg Clayton size_t 33230fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len) 33330fdc8d8SChris Lattner { 3345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 335ceb6b139SCaroline Tice 3364fc6cb9cSJim Ingham Mutex::Locker api_locker; 3374fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3384fc6cb9cSJim Ingham 3391ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 34030fdc8d8SChris Lattner { 3417fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3427fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3437fdf9ef1SGreg Clayton { 3447fdf9ef1SGreg Clayton 3451ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 346b15bfc75SJim Ingham if (stop_info_sp) 34730fdc8d8SChris Lattner { 348b15bfc75SJim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 34930fdc8d8SChris Lattner if (stop_desc) 35030fdc8d8SChris Lattner { 351ceb6b139SCaroline Tice if (log) 3524838131bSGreg Clayton log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"", 353324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 354324a1036SSaleem Abdulrasool stop_desc); 35530fdc8d8SChris Lattner if (dst) 35630fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc); 35730fdc8d8SChris Lattner else 35830fdc8d8SChris Lattner { 35930fdc8d8SChris Lattner // NULL dst passed in, return the length needed to contain the description 36030fdc8d8SChris Lattner return ::strlen (stop_desc) + 1; // Include the NULL byte for size 36130fdc8d8SChris Lattner } 36230fdc8d8SChris Lattner } 36330fdc8d8SChris Lattner else 36430fdc8d8SChris Lattner { 36530fdc8d8SChris Lattner size_t stop_desc_len = 0; 366b15bfc75SJim Ingham switch (stop_info_sp->GetStopReason()) 36730fdc8d8SChris Lattner { 36830fdc8d8SChris Lattner case eStopReasonTrace: 36930fdc8d8SChris Lattner case eStopReasonPlanComplete: 37030fdc8d8SChris Lattner { 37130fdc8d8SChris Lattner static char trace_desc[] = "step"; 37230fdc8d8SChris Lattner stop_desc = trace_desc; 37330fdc8d8SChris Lattner stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size 37430fdc8d8SChris Lattner } 37530fdc8d8SChris Lattner break; 37630fdc8d8SChris Lattner 37730fdc8d8SChris Lattner case eStopReasonBreakpoint: 37830fdc8d8SChris Lattner { 37930fdc8d8SChris Lattner static char bp_desc[] = "breakpoint hit"; 38030fdc8d8SChris Lattner stop_desc = bp_desc; 38130fdc8d8SChris Lattner stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size 38230fdc8d8SChris Lattner } 38330fdc8d8SChris Lattner break; 38430fdc8d8SChris Lattner 38530fdc8d8SChris Lattner case eStopReasonWatchpoint: 38630fdc8d8SChris Lattner { 38730fdc8d8SChris Lattner static char wp_desc[] = "watchpoint hit"; 38830fdc8d8SChris Lattner stop_desc = wp_desc; 38930fdc8d8SChris Lattner stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size 39030fdc8d8SChris Lattner } 39130fdc8d8SChris Lattner break; 39230fdc8d8SChris Lattner 39330fdc8d8SChris Lattner case eStopReasonSignal: 39430fdc8d8SChris Lattner { 39598d0a4b3SChaoren Lin stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals()->GetSignalAsCString(stop_info_sp->GetValue()); 39630fdc8d8SChris Lattner if (stop_desc == NULL || stop_desc[0] == '\0') 39730fdc8d8SChris Lattner { 39830fdc8d8SChris Lattner static char signal_desc[] = "signal"; 39930fdc8d8SChris Lattner stop_desc = signal_desc; 40030fdc8d8SChris Lattner stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size 40130fdc8d8SChris Lattner } 40230fdc8d8SChris Lattner } 40330fdc8d8SChris Lattner break; 40430fdc8d8SChris Lattner 40530fdc8d8SChris Lattner case eStopReasonException: 40630fdc8d8SChris Lattner { 40730fdc8d8SChris Lattner char exc_desc[] = "exception"; 40830fdc8d8SChris Lattner stop_desc = exc_desc; 40930fdc8d8SChris Lattner stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 41030fdc8d8SChris Lattner } 41130fdc8d8SChris Lattner break; 412c982c768SGreg Clayton 41390ba8115SGreg Clayton case eStopReasonExec: 41490ba8115SGreg Clayton { 41590ba8115SGreg Clayton char exc_desc[] = "exec"; 41690ba8115SGreg Clayton stop_desc = exc_desc; 41790ba8115SGreg Clayton stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 41890ba8115SGreg Clayton } 41990ba8115SGreg Clayton break; 42090ba8115SGreg Clayton 421f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 422f85defaeSAndrew Kaylor { 423f85defaeSAndrew Kaylor char limbo_desc[] = "thread exiting"; 424f85defaeSAndrew Kaylor stop_desc = limbo_desc; 425f85defaeSAndrew Kaylor stop_desc_len = sizeof(limbo_desc); 426f85defaeSAndrew Kaylor } 427f85defaeSAndrew Kaylor break; 428c982c768SGreg Clayton default: 429c982c768SGreg Clayton break; 43030fdc8d8SChris Lattner } 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner if (stop_desc && stop_desc[0]) 43330fdc8d8SChris Lattner { 434ceb6b139SCaroline Tice if (log) 43593aa84e8SGreg Clayton log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'", 436324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 437324a1036SSaleem Abdulrasool stop_desc); 438ceb6b139SCaroline Tice 43930fdc8d8SChris Lattner if (dst) 44030fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte 44130fdc8d8SChris Lattner 44230fdc8d8SChris Lattner if (stop_desc_len == 0) 44330fdc8d8SChris Lattner stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte 44430fdc8d8SChris Lattner 44530fdc8d8SChris Lattner return stop_desc_len; 44630fdc8d8SChris Lattner } 44730fdc8d8SChris Lattner } 44830fdc8d8SChris Lattner } 44930fdc8d8SChris Lattner } 450c9858e4dSGreg Clayton else 451c9858e4dSGreg Clayton { 4525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 453c9858e4dSGreg Clayton if (log) 454324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running", 455324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 456c9858e4dSGreg Clayton } 4577fdf9ef1SGreg Clayton } 45830fdc8d8SChris Lattner if (dst) 45930fdc8d8SChris Lattner *dst = 0; 46030fdc8d8SChris Lattner return 0; 46130fdc8d8SChris Lattner } 46230fdc8d8SChris Lattner 46373ca05a2SJim Ingham SBValue 46473ca05a2SJim Ingham SBThread::GetStopReturnValue () 46573ca05a2SJim Ingham { 4665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 46773ca05a2SJim Ingham ValueObjectSP return_valobj_sp; 4684fc6cb9cSJim Ingham Mutex::Locker api_locker; 4694fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4704fc6cb9cSJim Ingham 4711ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 47273ca05a2SJim Ingham { 4737fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4747fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4757fdf9ef1SGreg Clayton { 4761ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 47773ca05a2SJim Ingham if (stop_info_sp) 47873ca05a2SJim Ingham { 47973ca05a2SJim Ingham return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 48073ca05a2SJim Ingham } 48173ca05a2SJim Ingham } 482c9858e4dSGreg Clayton else 483c9858e4dSGreg Clayton { 484c9858e4dSGreg Clayton if (log) 485324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running", 486324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 487c9858e4dSGreg Clayton } 4887fdf9ef1SGreg Clayton } 48973ca05a2SJim Ingham 49073ca05a2SJim Ingham if (log) 491324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", 492324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 49373ca05a2SJim Ingham return_valobj_sp.get() 49473ca05a2SJim Ingham ? return_valobj_sp->GetValueAsCString() 49573ca05a2SJim Ingham : "<no return value>"); 49673ca05a2SJim Ingham 49773ca05a2SJim Ingham return SBValue (return_valobj_sp); 49873ca05a2SJim Ingham } 49973ca05a2SJim Ingham 50030fdc8d8SChris Lattner void 50130fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp) 50230fdc8d8SChris Lattner { 5037fdf9ef1SGreg Clayton m_opaque_sp->SetThreadSP (lldb_object_sp); 50430fdc8d8SChris Lattner } 50530fdc8d8SChris Lattner 50630fdc8d8SChris Lattner lldb::tid_t 50730fdc8d8SChris Lattner SBThread::GetThreadID () const 50830fdc8d8SChris Lattner { 5097fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 51017a6ad05SGreg Clayton if (thread_sp) 5111ac04c30SGreg Clayton return thread_sp->GetID(); 5121ac04c30SGreg Clayton return LLDB_INVALID_THREAD_ID; 51330fdc8d8SChris Lattner } 51430fdc8d8SChris Lattner 51530fdc8d8SChris Lattner uint32_t 51630fdc8d8SChris Lattner SBThread::GetIndexID () const 51730fdc8d8SChris Lattner { 5187fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 51917a6ad05SGreg Clayton if (thread_sp) 52017a6ad05SGreg Clayton return thread_sp->GetIndexID(); 52130fdc8d8SChris Lattner return LLDB_INVALID_INDEX32; 52230fdc8d8SChris Lattner } 5231ac04c30SGreg Clayton 52430fdc8d8SChris Lattner const char * 52530fdc8d8SChris Lattner SBThread::GetName () const 52630fdc8d8SChris Lattner { 5275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5284838131bSGreg Clayton const char *name = NULL; 5294fc6cb9cSJim Ingham Mutex::Locker api_locker; 5304fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5314fc6cb9cSJim Ingham 5321ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 533af67cecdSGreg Clayton { 5347fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5357fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5367fdf9ef1SGreg Clayton { 5371ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetName(); 538af67cecdSGreg Clayton } 539c9858e4dSGreg Clayton else 540c9858e4dSGreg Clayton { 541c9858e4dSGreg Clayton if (log) 542324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetName() => error: process is running", 543324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 544c9858e4dSGreg Clayton } 5457fdf9ef1SGreg Clayton } 546ceb6b139SCaroline Tice 547ceb6b139SCaroline Tice if (log) 548324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetName () => %s", 549324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 550324a1036SSaleem Abdulrasool name ? name : "NULL"); 551ceb6b139SCaroline Tice 5524838131bSGreg Clayton return name; 55330fdc8d8SChris Lattner } 55430fdc8d8SChris Lattner 55530fdc8d8SChris Lattner const char * 55630fdc8d8SChris Lattner SBThread::GetQueueName () const 55730fdc8d8SChris Lattner { 5584838131bSGreg Clayton const char *name = NULL; 5594fc6cb9cSJim Ingham Mutex::Locker api_locker; 5604fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5614fc6cb9cSJim Ingham 5625160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5631ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 564af67cecdSGreg Clayton { 5657fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5667fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5677fdf9ef1SGreg Clayton { 5681ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetQueueName(); 569af67cecdSGreg Clayton } 570c9858e4dSGreg Clayton else 571c9858e4dSGreg Clayton { 572c9858e4dSGreg Clayton if (log) 573324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueName() => error: process is running", 574324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 575c9858e4dSGreg Clayton } 5767fdf9ef1SGreg Clayton } 577ceb6b139SCaroline Tice 578ceb6b139SCaroline Tice if (log) 579324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueName () => %s", 580324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 581324a1036SSaleem Abdulrasool name ? name : "NULL"); 582ceb6b139SCaroline Tice 5834838131bSGreg Clayton return name; 58430fdc8d8SChris Lattner } 58530fdc8d8SChris Lattner 5864fdb5863SJason Molenda lldb::queue_id_t 5874fdb5863SJason Molenda SBThread::GetQueueID () const 5884fdb5863SJason Molenda { 5894fdb5863SJason Molenda queue_id_t id = LLDB_INVALID_QUEUE_ID; 5904fdb5863SJason Molenda Mutex::Locker api_locker; 5914fdb5863SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5924fdb5863SJason Molenda 5934fdb5863SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5944fdb5863SJason Molenda if (exe_ctx.HasThreadScope()) 5954fdb5863SJason Molenda { 5964fdb5863SJason Molenda Process::StopLocker stop_locker; 5974fdb5863SJason Molenda if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5984fdb5863SJason Molenda { 5994fdb5863SJason Molenda id = exe_ctx.GetThreadPtr()->GetQueueID(); 6004fdb5863SJason Molenda } 6014fdb5863SJason Molenda else 6024fdb5863SJason Molenda { 6034fdb5863SJason Molenda if (log) 604324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueID() => error: process is running", 605324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 6064fdb5863SJason Molenda } 6074fdb5863SJason Molenda } 6084fdb5863SJason Molenda 6094fdb5863SJason Molenda if (log) 610324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64, 611324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), id); 6124fdb5863SJason Molenda 6134fdb5863SJason Molenda return id; 6144fdb5863SJason Molenda } 6154fdb5863SJason Molenda 616705b1809SJason Molenda bool 617705b1809SJason Molenda SBThread::GetInfoItemByPathAsString (const char *path, SBStream &strm) 618705b1809SJason Molenda { 619705b1809SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 620705b1809SJason Molenda bool success = false; 621705b1809SJason Molenda Mutex::Locker api_locker; 622705b1809SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 623705b1809SJason Molenda 624705b1809SJason Molenda if (exe_ctx.HasThreadScope()) 625705b1809SJason Molenda { 626705b1809SJason Molenda Process::StopLocker stop_locker; 627705b1809SJason Molenda if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 628705b1809SJason Molenda { 629705b1809SJason Molenda Thread *thread = exe_ctx.GetThreadPtr(); 630705b1809SJason Molenda StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo(); 631705b1809SJason Molenda if (info_root_sp) 632705b1809SJason Molenda { 633705b1809SJason Molenda StructuredData::ObjectSP node = info_root_sp->GetObjectForDotSeparatedPath (path); 634705b1809SJason Molenda if (node) 635705b1809SJason Molenda { 636705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeString) 637705b1809SJason Molenda { 638705b1809SJason Molenda strm.Printf ("%s", node->GetAsString()->GetValue().c_str()); 639705b1809SJason Molenda success = true; 640705b1809SJason Molenda } 641705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeInteger) 642705b1809SJason Molenda { 643705b1809SJason Molenda strm.Printf ("0x%" PRIx64, node->GetAsInteger()->GetValue()); 644705b1809SJason Molenda success = true; 645705b1809SJason Molenda } 646705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeFloat) 647705b1809SJason Molenda { 648705b1809SJason Molenda strm.Printf ("0x%f", node->GetAsFloat()->GetValue()); 649705b1809SJason Molenda success = true; 650705b1809SJason Molenda } 651705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeBoolean) 652705b1809SJason Molenda { 653705b1809SJason Molenda if (node->GetAsBoolean()->GetValue() == true) 654705b1809SJason Molenda strm.Printf ("true"); 655705b1809SJason Molenda else 656705b1809SJason Molenda strm.Printf ("false"); 657705b1809SJason Molenda success = true; 658705b1809SJason Molenda } 659705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeNull) 660705b1809SJason Molenda { 661705b1809SJason Molenda strm.Printf ("null"); 662705b1809SJason Molenda success = true; 663705b1809SJason Molenda } 664705b1809SJason Molenda } 665705b1809SJason Molenda } 666705b1809SJason Molenda } 667705b1809SJason Molenda else 668705b1809SJason Molenda { 669705b1809SJason Molenda if (log) 670705b1809SJason Molenda log->Printf ("SBThread(%p)::GetInfoItemByPathAsString() => error: process is running", 671705b1809SJason Molenda static_cast<void*>(exe_ctx.GetThreadPtr())); 672705b1809SJason Molenda } 673705b1809SJason Molenda } 674705b1809SJason Molenda 675705b1809SJason Molenda if (log) 676705b1809SJason Molenda log->Printf ("SBThread(%p)::GetInfoItemByPathAsString () => %s", 677705b1809SJason Molenda static_cast<void*>(exe_ctx.GetThreadPtr()), 678705b1809SJason Molenda strm.GetData()); 679705b1809SJason Molenda 680705b1809SJason Molenda return success; 681705b1809SJason Molenda } 682705b1809SJason Molenda 683705b1809SJason Molenda 68464e7ead1SJim Ingham SBError 68564e7ead1SJim Ingham SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan) 68664e7ead1SJim Ingham { 68764e7ead1SJim Ingham SBError sb_error; 68864e7ead1SJim Ingham 68964e7ead1SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 69064e7ead1SJim Ingham if (!process) 69164e7ead1SJim Ingham { 69264e7ead1SJim Ingham sb_error.SetErrorString("No process in SBThread::ResumeNewPlan"); 69364e7ead1SJim Ingham return sb_error; 69464e7ead1SJim Ingham } 69564e7ead1SJim Ingham 69664e7ead1SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 69764e7ead1SJim Ingham if (!thread) 69864e7ead1SJim Ingham { 69964e7ead1SJim Ingham sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan"); 70064e7ead1SJim Ingham return sb_error; 70164e7ead1SJim Ingham } 70264e7ead1SJim Ingham 70364e7ead1SJim Ingham // User level plans should be Master Plans so they can be interrupted, other plans executed, and 70464e7ead1SJim Ingham // then a "continue" will resume the plan. 70564e7ead1SJim Ingham if (new_plan != NULL) 70664e7ead1SJim Ingham { 70764e7ead1SJim Ingham new_plan->SetIsMasterPlan(true); 70864e7ead1SJim Ingham new_plan->SetOkayToDiscard(false); 70964e7ead1SJim Ingham } 71064e7ead1SJim Ingham 71164e7ead1SJim Ingham // Why do we need to set the current thread by ID here??? 71264e7ead1SJim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 71364e7ead1SJim Ingham 714dc6224e0SGreg Clayton if (process->GetTarget().GetDebugger().GetAsyncExecution ()) 715dc6224e0SGreg Clayton sb_error.ref() = process->Resume (); 716dc6224e0SGreg Clayton else 717dc6224e0SGreg Clayton sb_error.ref() = process->ResumeSynchronous (NULL); 71864e7ead1SJim Ingham 71964e7ead1SJim Ingham return sb_error; 72064e7ead1SJim Ingham } 72130fdc8d8SChris Lattner 72230fdc8d8SChris Lattner void 72330fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads) 72430fdc8d8SChris Lattner { 7255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 726ceb6b139SCaroline Tice 7274fc6cb9cSJim Ingham Mutex::Locker api_locker; 7284fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7294fc6cb9cSJim Ingham 73017a6ad05SGreg Clayton 731ceb6b139SCaroline Tice if (log) 732324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", 733324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 734ceb6b139SCaroline Tice Thread::RunModeAsCString (stop_other_threads)); 735ceb6b139SCaroline Tice 7361ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 73730fdc8d8SChris Lattner { 7381ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 7397ba6e991SJim Ingham bool abort_other_plans = false; 740b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 74130fdc8d8SChris Lattner 7424d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 74330fdc8d8SChris Lattner if (frame_sp) 74430fdc8d8SChris Lattner { 74530fdc8d8SChris Lattner if (frame_sp->HasDebugInformation ()) 74630fdc8d8SChris Lattner { 7474b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 74830fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 7494d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans, 75025d5b10bSJason Molenda sc.line_entry, 75130fdc8d8SChris Lattner sc, 7524b4b2478SJim Ingham stop_other_threads, 7534b4b2478SJim Ingham avoid_no_debug); 75430fdc8d8SChris Lattner } 75530fdc8d8SChris Lattner else 75630fdc8d8SChris Lattner { 7574d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true, 75830fdc8d8SChris Lattner abort_other_plans, 75930fdc8d8SChris Lattner stop_other_threads); 76030fdc8d8SChris Lattner } 76130fdc8d8SChris Lattner } 76230fdc8d8SChris Lattner 76364e7ead1SJim Ingham // This returns an error, we should use it! 7644d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 76530fdc8d8SChris Lattner } 76630fdc8d8SChris Lattner } 76730fdc8d8SChris Lattner 76830fdc8d8SChris Lattner void 76930fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads) 77030fdc8d8SChris Lattner { 771c627682eSJim Ingham StepInto (NULL, stop_other_threads); 772c627682eSJim Ingham } 773c627682eSJim Ingham 774c627682eSJim Ingham void 775c627682eSJim Ingham SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads) 776c627682eSJim Ingham { 777*cbf6f9b2SJim Ingham SBError error; 778*cbf6f9b2SJim Ingham StepInto(target_name, LLDB_INVALID_LINE_NUMBER, error, stop_other_threads); 779*cbf6f9b2SJim Ingham } 780*cbf6f9b2SJim Ingham 781*cbf6f9b2SJim Ingham void 782*cbf6f9b2SJim Ingham SBThread::StepInto (const char *target_name, uint32_t end_line, SBError &error, lldb::RunMode stop_other_threads) 783*cbf6f9b2SJim Ingham { 7845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 785ceb6b139SCaroline Tice 7864fc6cb9cSJim Ingham Mutex::Locker api_locker; 7874fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 78817a6ad05SGreg Clayton 78917a6ad05SGreg Clayton if (log) 790c627682eSJim Ingham log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')", 791324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 792c627682eSJim Ingham target_name? target_name: "<NULL>", 79317a6ad05SGreg Clayton Thread::RunModeAsCString (stop_other_threads)); 794c627682eSJim Ingham 7951ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 79630fdc8d8SChris Lattner { 7977ba6e991SJim Ingham bool abort_other_plans = false; 79830fdc8d8SChris Lattner 7991ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 800b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 8014d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 80230fdc8d8SChris Lattner 80330fdc8d8SChris Lattner if (frame_sp && frame_sp->HasDebugInformation ()) 80430fdc8d8SChris Lattner { 805*cbf6f9b2SJim Ingham SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 806*cbf6f9b2SJim Ingham AddressRange range; 807*cbf6f9b2SJim Ingham if (end_line == LLDB_INVALID_LINE_NUMBER) 808*cbf6f9b2SJim Ingham range = sc.line_entry.range; 809*cbf6f9b2SJim Ingham else 810*cbf6f9b2SJim Ingham { 811*cbf6f9b2SJim Ingham if (!sc.GetAddressRangeFromHereToEndLine(end_line, range, error.ref())) 812*cbf6f9b2SJim Ingham return; 813*cbf6f9b2SJim Ingham } 814*cbf6f9b2SJim Ingham 8154b4b2478SJim Ingham const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate; 8164b4b2478SJim Ingham const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate; 8174d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans, 818*cbf6f9b2SJim Ingham range, 81930fdc8d8SChris Lattner sc, 820c627682eSJim Ingham target_name, 821474966a4SGreg Clayton stop_other_threads, 8224b4b2478SJim Ingham step_in_avoids_code_without_debug_info, 8234b4b2478SJim Ingham step_out_avoids_code_without_debug_info); 82430fdc8d8SChris Lattner } 82530fdc8d8SChris Lattner else 82630fdc8d8SChris Lattner { 8274d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false, 82830fdc8d8SChris Lattner abort_other_plans, 82930fdc8d8SChris Lattner stop_other_threads); 83030fdc8d8SChris Lattner } 83130fdc8d8SChris Lattner 832*cbf6f9b2SJim Ingham error = ResumeNewPlan (exe_ctx, new_plan_sp.get()); 83330fdc8d8SChris Lattner } 83430fdc8d8SChris Lattner } 83530fdc8d8SChris Lattner 83630fdc8d8SChris Lattner void 83730fdc8d8SChris Lattner SBThread::StepOut () 83830fdc8d8SChris Lattner { 8395160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 840ceb6b139SCaroline Tice 8414fc6cb9cSJim Ingham Mutex::Locker api_locker; 8424fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8434fc6cb9cSJim Ingham 84417a6ad05SGreg Clayton if (log) 845324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepOut ()", 846324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 84717a6ad05SGreg Clayton 8481ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 84930fdc8d8SChris Lattner { 8507ba6e991SJim Ingham bool abort_other_plans = false; 85194b09246SJim Ingham bool stop_other_threads = false; 85230fdc8d8SChris Lattner 8531ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 8541ac04c30SGreg Clayton 8554b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 8564d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans, 857481cef25SGreg Clayton NULL, 858481cef25SGreg Clayton false, 859481cef25SGreg Clayton stop_other_threads, 860481cef25SGreg Clayton eVoteYes, 861481cef25SGreg Clayton eVoteNoOpinion, 8624b4b2478SJim Ingham 0, 8634b4b2478SJim Ingham avoid_no_debug)); 864481cef25SGreg Clayton 86564e7ead1SJim Ingham // This returns an error, we should use it! 8664d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 867481cef25SGreg Clayton } 868481cef25SGreg Clayton } 869481cef25SGreg Clayton 870481cef25SGreg Clayton void 871481cef25SGreg Clayton SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame) 872481cef25SGreg Clayton { 8735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 874481cef25SGreg Clayton 8754fc6cb9cSJim Ingham Mutex::Locker api_locker; 8764fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8774fc6cb9cSJim Ingham 878989a7558SJim Ingham if (!sb_frame.IsValid()) 879989a7558SJim Ingham { 880989a7558SJim Ingham if (log) 881989a7558SJim Ingham log->Printf("SBThread(%p)::StepOutOfFrame passed an invalid frame, returning.", 882989a7558SJim Ingham static_cast<void*>(exe_ctx.GetThreadPtr())); 883989a7558SJim Ingham return; 884989a7558SJim Ingham } 885989a7558SJim Ingham 886b57e4a1bSJason Molenda StackFrameSP frame_sp (sb_frame.GetFrameSP()); 887481cef25SGreg Clayton if (log) 888481cef25SGreg Clayton { 889481cef25SGreg Clayton SBStream frame_desc_strm; 890481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 891324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", 892324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 893324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 894324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 895481cef25SGreg Clayton } 896481cef25SGreg Clayton 8971ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 898481cef25SGreg Clayton { 8997ba6e991SJim Ingham bool abort_other_plans = false; 90094b09246SJim Ingham bool stop_other_threads = false; 9011ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 902989a7558SJim Ingham if (sb_frame.GetThread().GetThreadID() != thread->GetID()) 903989a7558SJim Ingham { 9041ef6e4c8SBruce Mitchener log->Printf("SBThread(%p)::StepOutOfFrame passed a frame from another thread (0x%" PRIx64 " vrs. 0x%" PRIx64 ", returning.", 905989a7558SJim Ingham static_cast<void*>(exe_ctx.GetThreadPtr()), 906989a7558SJim Ingham sb_frame.GetThread().GetThreadID(), 907989a7558SJim Ingham thread->GetID()); 908989a7558SJim Ingham } 909481cef25SGreg Clayton 9104d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans, 911481cef25SGreg Clayton NULL, 912481cef25SGreg Clayton false, 913481cef25SGreg Clayton stop_other_threads, 914481cef25SGreg Clayton eVoteYes, 915481cef25SGreg Clayton eVoteNoOpinion, 9164d56e9c1SJim Ingham frame_sp->GetFrameIndex())); 91730fdc8d8SChris Lattner 91864e7ead1SJim Ingham // This returns an error, we should use it! 9194d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 92030fdc8d8SChris Lattner } 92130fdc8d8SChris Lattner } 92230fdc8d8SChris Lattner 92330fdc8d8SChris Lattner void 92430fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over) 92530fdc8d8SChris Lattner { 9265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 927ceb6b139SCaroline Tice 9284fc6cb9cSJim Ingham Mutex::Locker api_locker; 9294fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9304fc6cb9cSJim Ingham 9311ac04c30SGreg Clayton 932ceb6b139SCaroline Tice 93317a6ad05SGreg Clayton if (log) 934324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", 935324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), step_over); 93617a6ad05SGreg Clayton 9371ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 93830fdc8d8SChris Lattner { 9391ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 9404d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true)); 94164e7ead1SJim Ingham 94264e7ead1SJim Ingham // This returns an error, we should use it! 9434d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 94430fdc8d8SChris Lattner } 94530fdc8d8SChris Lattner } 94630fdc8d8SChris Lattner 94730fdc8d8SChris Lattner void 94830fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr) 94930fdc8d8SChris Lattner { 9505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 951ceb6b139SCaroline Tice 9524fc6cb9cSJim Ingham Mutex::Locker api_locker; 9534fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9544fc6cb9cSJim Ingham 955ceb6b139SCaroline Tice 95617a6ad05SGreg Clayton if (log) 957324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", 958324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), addr); 95917a6ad05SGreg Clayton 9601ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 96130fdc8d8SChris Lattner { 9627ba6e991SJim Ingham bool abort_other_plans = false; 96330fdc8d8SChris Lattner bool stop_other_threads = true; 96430fdc8d8SChris Lattner 965e72dfb32SGreg Clayton Address target_addr (addr); 96630fdc8d8SChris Lattner 9671ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 9681ac04c30SGreg Clayton 9692bdbfd50SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, 9702bdbfd50SJim Ingham target_addr, 9712bdbfd50SJim Ingham stop_other_threads)); 97264e7ead1SJim Ingham 97364e7ead1SJim Ingham // This returns an error, we should use it! 9744d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 97530fdc8d8SChris Lattner } 97630fdc8d8SChris Lattner } 97730fdc8d8SChris Lattner 978481cef25SGreg Clayton SBError 979481cef25SGreg Clayton SBThread::StepOverUntil (lldb::SBFrame &sb_frame, 980481cef25SGreg Clayton lldb::SBFileSpec &sb_file_spec, 981481cef25SGreg Clayton uint32_t line) 982481cef25SGreg Clayton { 983481cef25SGreg Clayton SBError sb_error; 9845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 985481cef25SGreg Clayton char path[PATH_MAX]; 986481cef25SGreg Clayton 9874fc6cb9cSJim Ingham Mutex::Locker api_locker; 9884fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9894fc6cb9cSJim Ingham 990b57e4a1bSJason Molenda StackFrameSP frame_sp (sb_frame.GetFrameSP()); 99117a6ad05SGreg Clayton 992481cef25SGreg Clayton if (log) 993481cef25SGreg Clayton { 994481cef25SGreg Clayton SBStream frame_desc_strm; 995481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 996481cef25SGreg Clayton sb_file_spec->GetPath (path, sizeof(path)); 997481cef25SGreg Clayton log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)", 998324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 999324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 1000324a1036SSaleem Abdulrasool frame_desc_strm.GetData(), path, line); 1001481cef25SGreg Clayton } 1002481cef25SGreg Clayton 10031ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1004481cef25SGreg Clayton { 10051ac04c30SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10061ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 1007481cef25SGreg Clayton 1008481cef25SGreg Clayton if (line == 0) 1009481cef25SGreg Clayton { 1010481cef25SGreg Clayton sb_error.SetErrorString("invalid line argument"); 1011481cef25SGreg Clayton return sb_error; 1012481cef25SGreg Clayton } 1013481cef25SGreg Clayton 1014b9556accSGreg Clayton if (!frame_sp) 1015481cef25SGreg Clayton { 10161ac04c30SGreg Clayton frame_sp = thread->GetSelectedFrame (); 1017481cef25SGreg Clayton if (!frame_sp) 10181ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex (0); 1019481cef25SGreg Clayton } 1020481cef25SGreg Clayton 1021481cef25SGreg Clayton SymbolContext frame_sc; 1022481cef25SGreg Clayton if (!frame_sp) 1023481cef25SGreg Clayton { 1024481cef25SGreg Clayton sb_error.SetErrorString("no valid frames in thread to step"); 1025481cef25SGreg Clayton return sb_error; 1026481cef25SGreg Clayton } 1027481cef25SGreg Clayton 1028481cef25SGreg Clayton // If we have a frame, get its line 1029481cef25SGreg Clayton frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit | 1030481cef25SGreg Clayton eSymbolContextFunction | 1031481cef25SGreg Clayton eSymbolContextLineEntry | 1032481cef25SGreg Clayton eSymbolContextSymbol ); 1033481cef25SGreg Clayton 1034481cef25SGreg Clayton if (frame_sc.comp_unit == NULL) 1035481cef25SGreg Clayton { 1036481cef25SGreg Clayton sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex()); 1037481cef25SGreg Clayton return sb_error; 1038481cef25SGreg Clayton } 1039481cef25SGreg Clayton 1040481cef25SGreg Clayton FileSpec step_file_spec; 1041481cef25SGreg Clayton if (sb_file_spec.IsValid()) 1042481cef25SGreg Clayton { 1043481cef25SGreg Clayton // The file spec passed in was valid, so use it 1044481cef25SGreg Clayton step_file_spec = sb_file_spec.ref(); 1045481cef25SGreg Clayton } 1046481cef25SGreg Clayton else 1047481cef25SGreg Clayton { 1048481cef25SGreg Clayton if (frame_sc.line_entry.IsValid()) 1049481cef25SGreg Clayton step_file_spec = frame_sc.line_entry.file; 1050481cef25SGreg Clayton else 1051481cef25SGreg Clayton { 1052481cef25SGreg Clayton sb_error.SetErrorString("invalid file argument or no file for frame"); 1053481cef25SGreg Clayton return sb_error; 1054481cef25SGreg Clayton } 1055481cef25SGreg Clayton } 1056481cef25SGreg Clayton 10579b70ddb3SJim Ingham // Grab the current function, then we will make sure the "until" address is 10589b70ddb3SJim Ingham // within the function. We discard addresses that are out of the current 10599b70ddb3SJim Ingham // function, and then if there are no addresses remaining, give an appropriate 10609b70ddb3SJim Ingham // error message. 10619b70ddb3SJim Ingham 10629b70ddb3SJim Ingham bool all_in_function = true; 10639b70ddb3SJim Ingham AddressRange fun_range = frame_sc.function->GetAddressRange(); 10649b70ddb3SJim Ingham 1065481cef25SGreg Clayton std::vector<addr_t> step_over_until_addrs; 10667ba6e991SJim Ingham const bool abort_other_plans = false; 1067c02e3344SJim Ingham const bool stop_other_threads = false; 1068481cef25SGreg Clayton const bool check_inlines = true; 1069481cef25SGreg Clayton const bool exact = false; 1070481cef25SGreg Clayton 1071481cef25SGreg Clayton SymbolContextList sc_list; 10729b70ddb3SJim Ingham const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec, 10739b70ddb3SJim Ingham line, 10749b70ddb3SJim Ingham check_inlines, 10759b70ddb3SJim Ingham exact, 10769b70ddb3SJim Ingham eSymbolContextLineEntry, 10779b70ddb3SJim Ingham sc_list); 1078481cef25SGreg Clayton if (num_matches > 0) 1079481cef25SGreg Clayton { 1080481cef25SGreg Clayton SymbolContext sc; 1081481cef25SGreg Clayton for (uint32_t i=0; i<num_matches; ++i) 1082481cef25SGreg Clayton { 1083481cef25SGreg Clayton if (sc_list.GetContextAtIndex(i, sc)) 1084481cef25SGreg Clayton { 10859b70ddb3SJim Ingham addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target); 1086481cef25SGreg Clayton if (step_addr != LLDB_INVALID_ADDRESS) 1087481cef25SGreg Clayton { 10889b70ddb3SJim Ingham if (fun_range.ContainsLoadAddress(step_addr, target)) 1089481cef25SGreg Clayton step_over_until_addrs.push_back(step_addr); 10909b70ddb3SJim Ingham else 10919b70ddb3SJim Ingham all_in_function = false; 1092481cef25SGreg Clayton } 1093481cef25SGreg Clayton } 1094481cef25SGreg Clayton } 1095481cef25SGreg Clayton } 1096481cef25SGreg Clayton 1097481cef25SGreg Clayton if (step_over_until_addrs.empty()) 1098481cef25SGreg Clayton { 10999b70ddb3SJim Ingham if (all_in_function) 11009b70ddb3SJim Ingham { 1101481cef25SGreg Clayton step_file_spec.GetPath (path, sizeof(path)); 1102fd54b368SJason Molenda sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line); 1103481cef25SGreg Clayton } 1104481cef25SGreg Clayton else 110586edbf41SGreg Clayton sb_error.SetErrorString ("step until target not in current function"); 11069b70ddb3SJim Ingham } 11079b70ddb3SJim Ingham else 1108481cef25SGreg Clayton { 11094d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans, 1110481cef25SGreg Clayton &step_over_until_addrs[0], 1111481cef25SGreg Clayton step_over_until_addrs.size(), 1112481cef25SGreg Clayton stop_other_threads, 11134d56e9c1SJim Ingham frame_sp->GetFrameIndex())); 1114481cef25SGreg Clayton 11154d56e9c1SJim Ingham sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get()); 1116481cef25SGreg Clayton } 1117481cef25SGreg Clayton } 1118481cef25SGreg Clayton else 1119481cef25SGreg Clayton { 1120481cef25SGreg Clayton sb_error.SetErrorString("this SBThread object is invalid"); 1121481cef25SGreg Clayton } 1122481cef25SGreg Clayton return sb_error; 1123481cef25SGreg Clayton } 1124481cef25SGreg Clayton 11254413758cSJim Ingham SBError 11262bdbfd50SJim Ingham SBThread::StepUsingScriptedThreadPlan (const char *script_class_name) 11272bdbfd50SJim Ingham { 11282bdbfd50SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11292bdbfd50SJim Ingham SBError sb_error; 11302bdbfd50SJim Ingham 11312bdbfd50SJim Ingham Mutex::Locker api_locker; 11322bdbfd50SJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11332bdbfd50SJim Ingham 11342bdbfd50SJim Ingham if (log) 11352bdbfd50SJim Ingham { 11362bdbfd50SJim Ingham log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s", 11372bdbfd50SJim Ingham static_cast<void*>(exe_ctx.GetThreadPtr()), 11382bdbfd50SJim Ingham script_class_name); 11392bdbfd50SJim Ingham } 11402bdbfd50SJim Ingham 11412bdbfd50SJim Ingham 11422bdbfd50SJim Ingham if (!exe_ctx.HasThreadScope()) 11432bdbfd50SJim Ingham { 11442bdbfd50SJim Ingham sb_error.SetErrorString("this SBThread object is invalid"); 11452bdbfd50SJim Ingham return sb_error; 11462bdbfd50SJim Ingham } 11472bdbfd50SJim Ingham 11482bdbfd50SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 11492bdbfd50SJim Ingham ThreadPlanSP thread_plan_sp = thread->QueueThreadPlanForStepScripted(false, script_class_name, false); 11502bdbfd50SJim Ingham 11512bdbfd50SJim Ingham if (thread_plan_sp) 11522bdbfd50SJim Ingham sb_error = ResumeNewPlan(exe_ctx, thread_plan_sp.get()); 11532bdbfd50SJim Ingham else 11542bdbfd50SJim Ingham { 11552bdbfd50SJim Ingham sb_error.SetErrorStringWithFormat("Error queuing thread plan for class: %s.", script_class_name); 11562bdbfd50SJim Ingham if (log) 11572bdbfd50SJim Ingham log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: Error queuing thread plan for class: %s", 11582bdbfd50SJim Ingham static_cast<void*>(exe_ctx.GetThreadPtr()), 11592bdbfd50SJim Ingham script_class_name); 11602bdbfd50SJim Ingham } 11612bdbfd50SJim Ingham 11622bdbfd50SJim Ingham return sb_error; 11632bdbfd50SJim Ingham } 11642bdbfd50SJim Ingham 11652bdbfd50SJim Ingham SBError 1166f86248d9SRichard Mitton SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line) 1167f86248d9SRichard Mitton { 1168f86248d9SRichard Mitton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1169f86248d9SRichard Mitton SBError sb_error; 1170f86248d9SRichard Mitton 1171f86248d9SRichard Mitton Mutex::Locker api_locker; 1172f86248d9SRichard Mitton ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1173f86248d9SRichard Mitton 1174f86248d9SRichard Mitton if (log) 1175324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)", 1176324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1177324a1036SSaleem Abdulrasool file_spec->GetPath().c_str(), line); 1178f86248d9SRichard Mitton 1179f86248d9SRichard Mitton if (!exe_ctx.HasThreadScope()) 1180f86248d9SRichard Mitton { 1181f86248d9SRichard Mitton sb_error.SetErrorString("this SBThread object is invalid"); 1182f86248d9SRichard Mitton return sb_error; 1183f86248d9SRichard Mitton } 1184f86248d9SRichard Mitton 1185f86248d9SRichard Mitton Thread *thread = exe_ctx.GetThreadPtr(); 1186f86248d9SRichard Mitton 1187f86248d9SRichard Mitton Error err = thread->JumpToLine (file_spec.get(), line, true); 1188f86248d9SRichard Mitton sb_error.SetError (err); 1189f86248d9SRichard Mitton return sb_error; 1190f86248d9SRichard Mitton } 1191f86248d9SRichard Mitton 1192f86248d9SRichard Mitton SBError 1193cb640dd8SJim Ingham SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value) 11944413758cSJim Ingham { 11954413758cSJim Ingham SBError sb_error; 11964413758cSJim Ingham 11975160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11984413758cSJim Ingham 11994413758cSJim Ingham Mutex::Locker api_locker; 12004413758cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12014413758cSJim Ingham 12024413758cSJim Ingham 12034413758cSJim Ingham if (log) 1204324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", 1205324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1206324a1036SSaleem Abdulrasool frame.GetFrameID()); 12074413758cSJim Ingham 12084413758cSJim Ingham if (exe_ctx.HasThreadScope()) 12094413758cSJim Ingham { 12104413758cSJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 1211cb640dd8SJim Ingham sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP())); 12124413758cSJim Ingham } 12134413758cSJim Ingham 12144413758cSJim Ingham return sb_error; 12154413758cSJim Ingham } 12164413758cSJim Ingham 1217481cef25SGreg Clayton 1218722a0cdcSGreg Clayton bool 1219722a0cdcSGreg Clayton SBThread::Suspend() 1220722a0cdcSGreg Clayton { 12215160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 12227fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 1223c9858e4dSGreg Clayton bool result = false; 12241ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1225722a0cdcSGreg Clayton { 1226c9858e4dSGreg Clayton Process::StopLocker stop_locker; 1227c9858e4dSGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1228c9858e4dSGreg Clayton { 12291ac04c30SGreg Clayton exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended); 1230c9858e4dSGreg Clayton result = true; 1231722a0cdcSGreg Clayton } 1232c9858e4dSGreg Clayton else 1233c9858e4dSGreg Clayton { 1234c9858e4dSGreg Clayton if (log) 1235324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Suspend() => error: process is running", 1236324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1237c9858e4dSGreg Clayton } 1238c9858e4dSGreg Clayton } 1239c9858e4dSGreg Clayton if (log) 1240324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Suspend() => %i", 1241324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), result); 1242c9858e4dSGreg Clayton return result; 1243722a0cdcSGreg Clayton } 1244722a0cdcSGreg Clayton 1245722a0cdcSGreg Clayton bool 1246722a0cdcSGreg Clayton SBThread::Resume () 1247722a0cdcSGreg Clayton { 12485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 12497fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 1250c9858e4dSGreg Clayton bool result = false; 12511ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1252722a0cdcSGreg Clayton { 1253c9858e4dSGreg Clayton Process::StopLocker stop_locker; 1254c9858e4dSGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1255c9858e4dSGreg Clayton { 12566c9ed91cSJim Ingham const bool override_suspend = true; 12576c9ed91cSJim Ingham exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend); 1258c9858e4dSGreg Clayton result = true; 1259722a0cdcSGreg Clayton } 1260c9858e4dSGreg Clayton else 1261c9858e4dSGreg Clayton { 1262c9858e4dSGreg Clayton if (log) 1263324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Resume() => error: process is running", 1264324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1265c9858e4dSGreg Clayton } 1266c9858e4dSGreg Clayton } 1267c9858e4dSGreg Clayton if (log) 1268324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Resume() => %i", 1269324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), result); 1270c9858e4dSGreg Clayton return result; 1271722a0cdcSGreg Clayton } 1272722a0cdcSGreg Clayton 1273722a0cdcSGreg Clayton bool 1274722a0cdcSGreg Clayton SBThread::IsSuspended() 1275722a0cdcSGreg Clayton { 12767fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 12771ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 12781ac04c30SGreg Clayton return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended; 1279722a0cdcSGreg Clayton return false; 1280722a0cdcSGreg Clayton } 1281722a0cdcSGreg Clayton 1282a75418dbSAndrew Kaylor bool 1283a75418dbSAndrew Kaylor SBThread::IsStopped() 1284a75418dbSAndrew Kaylor { 1285a75418dbSAndrew Kaylor ExecutionContext exe_ctx (m_opaque_sp.get()); 1286a75418dbSAndrew Kaylor if (exe_ctx.HasThreadScope()) 1287a75418dbSAndrew Kaylor return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true); 1288a75418dbSAndrew Kaylor return false; 1289a75418dbSAndrew Kaylor } 1290a75418dbSAndrew Kaylor 129130fdc8d8SChris Lattner SBProcess 129230fdc8d8SChris Lattner SBThread::GetProcess () 129330fdc8d8SChris Lattner { 1294b9556accSGreg Clayton SBProcess sb_process; 12957fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 12961ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 129730fdc8d8SChris Lattner { 129830fdc8d8SChris Lattner // Have to go up to the target so we can get a shared pointer to our process... 12991ac04c30SGreg Clayton sb_process.SetSP (exe_ctx.GetProcessSP()); 130030fdc8d8SChris Lattner } 1301ceb6b139SCaroline Tice 13025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1303ceb6b139SCaroline Tice if (log) 1304ceb6b139SCaroline Tice { 1305481cef25SGreg Clayton SBStream frame_desc_strm; 1306b9556accSGreg Clayton sb_process.GetDescription (frame_desc_strm); 1307324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", 1308324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1309324a1036SSaleem Abdulrasool static_cast<void*>(sb_process.GetSP().get()), 1310324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1311ceb6b139SCaroline Tice } 1312ceb6b139SCaroline Tice 1313b9556accSGreg Clayton return sb_process; 131430fdc8d8SChris Lattner } 131530fdc8d8SChris Lattner 131630fdc8d8SChris Lattner uint32_t 131730fdc8d8SChris Lattner SBThread::GetNumFrames () 131830fdc8d8SChris Lattner { 13195160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1320ceb6b139SCaroline Tice 1321ceb6b139SCaroline Tice uint32_t num_frames = 0; 13224fc6cb9cSJim Ingham Mutex::Locker api_locker; 13234fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13244fc6cb9cSJim Ingham 13251ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1326af67cecdSGreg Clayton { 13277fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13287fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 13297fdf9ef1SGreg Clayton { 13301ac04c30SGreg Clayton num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount(); 1331af67cecdSGreg Clayton } 1332c9858e4dSGreg Clayton else 1333c9858e4dSGreg Clayton { 1334c9858e4dSGreg Clayton if (log) 1335324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", 1336324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1337c9858e4dSGreg Clayton } 13387fdf9ef1SGreg Clayton } 1339ceb6b139SCaroline Tice 1340ceb6b139SCaroline Tice if (log) 1341324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetNumFrames () => %u", 1342324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames); 1343ceb6b139SCaroline Tice 1344ceb6b139SCaroline Tice return num_frames; 134530fdc8d8SChris Lattner } 134630fdc8d8SChris Lattner 134730fdc8d8SChris Lattner SBFrame 134830fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx) 134930fdc8d8SChris Lattner { 13505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1351ceb6b139SCaroline Tice 135230fdc8d8SChris Lattner SBFrame sb_frame; 1353b57e4a1bSJason Molenda StackFrameSP frame_sp; 13544fc6cb9cSJim Ingham Mutex::Locker api_locker; 13554fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13564fc6cb9cSJim Ingham 13571ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1358af67cecdSGreg Clayton { 13597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13607fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 13617fdf9ef1SGreg Clayton { 13621ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx); 1363b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1364af67cecdSGreg Clayton } 1365c9858e4dSGreg Clayton else 1366c9858e4dSGreg Clayton { 1367c9858e4dSGreg Clayton if (log) 1368324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", 1369324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1370c9858e4dSGreg Clayton } 13717fdf9ef1SGreg Clayton } 1372ceb6b139SCaroline Tice 1373ceb6b139SCaroline Tice if (log) 1374ceb6b139SCaroline Tice { 1375481cef25SGreg Clayton SBStream frame_desc_strm; 1376481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 13774838131bSGreg Clayton log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s", 1378324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), idx, 1379324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 1380324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1381ceb6b139SCaroline Tice } 1382ceb6b139SCaroline Tice 138330fdc8d8SChris Lattner return sb_frame; 138430fdc8d8SChris Lattner } 138530fdc8d8SChris Lattner 1386f028a1fbSGreg Clayton lldb::SBFrame 1387f028a1fbSGreg Clayton SBThread::GetSelectedFrame () 1388f028a1fbSGreg Clayton { 13895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1390f028a1fbSGreg Clayton 1391f028a1fbSGreg Clayton SBFrame sb_frame; 1392b57e4a1bSJason Molenda StackFrameSP frame_sp; 13934fc6cb9cSJim Ingham Mutex::Locker api_locker; 13944fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13954fc6cb9cSJim Ingham 13961ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1397af67cecdSGreg Clayton { 13987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13997fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 14007fdf9ef1SGreg Clayton { 14011ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame (); 1402b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1403af67cecdSGreg Clayton } 1404c9858e4dSGreg Clayton else 1405c9858e4dSGreg Clayton { 1406c9858e4dSGreg Clayton if (log) 1407324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", 1408324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1409c9858e4dSGreg Clayton } 14107fdf9ef1SGreg Clayton } 1411f028a1fbSGreg Clayton 1412f028a1fbSGreg Clayton if (log) 1413f028a1fbSGreg Clayton { 1414481cef25SGreg Clayton SBStream frame_desc_strm; 1415481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 1416f028a1fbSGreg Clayton log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s", 1417324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1418324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 1419324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1420f028a1fbSGreg Clayton } 1421f028a1fbSGreg Clayton 1422f028a1fbSGreg Clayton return sb_frame; 1423f028a1fbSGreg Clayton } 1424f028a1fbSGreg Clayton 1425f028a1fbSGreg Clayton lldb::SBFrame 1426f028a1fbSGreg Clayton SBThread::SetSelectedFrame (uint32_t idx) 1427f028a1fbSGreg Clayton { 14285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1429f028a1fbSGreg Clayton 1430f028a1fbSGreg Clayton SBFrame sb_frame; 1431b57e4a1bSJason Molenda StackFrameSP frame_sp; 14324fc6cb9cSJim Ingham Mutex::Locker api_locker; 14334fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 14344fc6cb9cSJim Ingham 14351ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1436f028a1fbSGreg Clayton { 14377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14387fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 14397fdf9ef1SGreg Clayton { 14401ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 14411ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex (idx); 1442f028a1fbSGreg Clayton if (frame_sp) 1443f028a1fbSGreg Clayton { 14441ac04c30SGreg Clayton thread->SetSelectedFrame (frame_sp.get()); 1445b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1446f028a1fbSGreg Clayton } 1447f028a1fbSGreg Clayton } 1448c9858e4dSGreg Clayton else 1449c9858e4dSGreg Clayton { 1450c9858e4dSGreg Clayton if (log) 1451324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", 1452324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1453c9858e4dSGreg Clayton } 14547fdf9ef1SGreg Clayton } 1455f028a1fbSGreg Clayton 1456f028a1fbSGreg Clayton if (log) 1457f028a1fbSGreg Clayton { 1458481cef25SGreg Clayton SBStream frame_desc_strm; 1459481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 1460f028a1fbSGreg Clayton log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s", 1461324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), idx, 1462324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 1463324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1464f028a1fbSGreg Clayton } 1465f028a1fbSGreg Clayton return sb_frame; 1466f028a1fbSGreg Clayton } 1467f028a1fbSGreg Clayton 14684f465cffSJim Ingham bool 14694f465cffSJim Ingham SBThread::EventIsThreadEvent (const SBEvent &event) 14704f465cffSJim Ingham { 14714f465cffSJim Ingham return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL; 14724f465cffSJim Ingham } 14734f465cffSJim Ingham 14744f465cffSJim Ingham SBFrame 14754f465cffSJim Ingham SBThread::GetStackFrameFromEvent (const SBEvent &event) 14764f465cffSJim Ingham { 14774f465cffSJim Ingham return Thread::ThreadEventData::GetStackFrameFromEvent (event.get()); 14784f465cffSJim Ingham 14794f465cffSJim Ingham } 14804f465cffSJim Ingham 14814f465cffSJim Ingham SBThread 14824f465cffSJim Ingham SBThread::GetThreadFromEvent (const SBEvent &event) 14834f465cffSJim Ingham { 14844f465cffSJim Ingham return Thread::ThreadEventData::GetThreadFromEvent (event.get()); 14854f465cffSJim Ingham } 1486f028a1fbSGreg Clayton 148730fdc8d8SChris Lattner bool 148830fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const 148930fdc8d8SChris Lattner { 14907fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get(); 149130fdc8d8SChris Lattner } 149230fdc8d8SChris Lattner 149330fdc8d8SChris Lattner bool 149430fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const 149530fdc8d8SChris Lattner { 14967fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get(); 149730fdc8d8SChris Lattner } 1498dde9cff3SCaroline Tice 1499dde9cff3SCaroline Tice bool 15004f465cffSJim Ingham SBThread::GetStatus (SBStream &status) const 15014f465cffSJim Ingham { 15024f465cffSJim Ingham Stream &strm = status.ref(); 15034f465cffSJim Ingham 15044f465cffSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get()); 15054f465cffSJim Ingham if (exe_ctx.HasThreadScope()) 15064f465cffSJim Ingham { 15074f465cffSJim Ingham exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1); 15084f465cffSJim Ingham } 15094f465cffSJim Ingham else 15104f465cffSJim Ingham strm.PutCString ("No status"); 15114f465cffSJim Ingham 15124f465cffSJim Ingham return true; 15134f465cffSJim Ingham } 15144f465cffSJim Ingham 15154f465cffSJim Ingham bool 1516ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const 1517ceb6b139SCaroline Tice { 1518da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1519da7bc7d0SGreg Clayton 15207fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 15211ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1522ceb6b139SCaroline Tice { 1523603985fcSJim Ingham exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, LLDB_INVALID_THREAD_ID); 1524603985fcSJim Ingham //strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID()); 1525ceb6b139SCaroline Tice } 1526ceb6b139SCaroline Tice else 1527da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1528ceb6b139SCaroline Tice 1529ceb6b139SCaroline Tice return true; 1530ceb6b139SCaroline Tice } 15315dd4916fSJason Molenda 15325dd4916fSJason Molenda SBThread 1533008c45f1SJason Molenda SBThread::GetExtendedBacktraceThread (const char *type) 15345dd4916fSJason Molenda { 15355dd4916fSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15365dd4916fSJason Molenda Mutex::Locker api_locker; 15375dd4916fSJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 15385dd4916fSJason Molenda SBThread sb_origin_thread; 15395dd4916fSJason Molenda 15405dd4916fSJason Molenda if (exe_ctx.HasThreadScope()) 15415dd4916fSJason Molenda { 15425dd4916fSJason Molenda Process::StopLocker stop_locker; 15435dd4916fSJason Molenda if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 15445dd4916fSJason Molenda { 15457a2f7904SJason Molenda ThreadSP real_thread(exe_ctx.GetThreadSP()); 15465dd4916fSJason Molenda if (real_thread) 15475dd4916fSJason Molenda { 15485dd4916fSJason Molenda ConstString type_const (type); 15497a2f7904SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 15507a2f7904SJason Molenda if (process) 15517a2f7904SJason Molenda { 15527a2f7904SJason Molenda SystemRuntime *runtime = process->GetSystemRuntime(); 15535dd4916fSJason Molenda if (runtime) 15545dd4916fSJason Molenda { 1555008c45f1SJason Molenda ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const)); 1556a6e9130dSJason Molenda if (new_thread_sp) 1557a6e9130dSJason Molenda { 15587a2f7904SJason Molenda // Save this in the Process' ExtendedThreadList so a strong pointer retains the 15597a2f7904SJason Molenda // object. 15607a2f7904SJason Molenda process->GetExtendedThreadList().AddThread (new_thread_sp); 15617a2f7904SJason Molenda sb_origin_thread.SetThread (new_thread_sp); 1562a6e9130dSJason Molenda if (log) 1563a6e9130dSJason Molenda { 1564a6e9130dSJason Molenda const char *queue_name = new_thread_sp->GetQueueName(); 1565a6e9130dSJason Molenda if (queue_name == NULL) 1566a6e9130dSJason Molenda queue_name = ""; 15672bdbfd50SJim Ingham log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread " 15682bdbfd50SJim Ingham "created (%p) with queue_id 0x%" PRIx64 " queue name '%s'", 1569324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1570324a1036SSaleem Abdulrasool static_cast<void*>(new_thread_sp.get()), 1571324a1036SSaleem Abdulrasool new_thread_sp->GetQueueID(), 1572324a1036SSaleem Abdulrasool queue_name); 1573a6e9130dSJason Molenda } 1574a6e9130dSJason Molenda } 15757a2f7904SJason Molenda } 15765dd4916fSJason Molenda } 15775dd4916fSJason Molenda } 15785dd4916fSJason Molenda } 15795dd4916fSJason Molenda else 15805dd4916fSJason Molenda { 15815dd4916fSJason Molenda if (log) 1582324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running", 1583324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 15845dd4916fSJason Molenda } 15855dd4916fSJason Molenda } 15865dd4916fSJason Molenda 1587ac605f4aSJason Molenda if (log && sb_origin_thread.IsValid() == false) 1588324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread", 1589324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 15905dd4916fSJason Molenda return sb_origin_thread; 15915dd4916fSJason Molenda } 15928ee9cb58SJason Molenda 15938ee9cb58SJason Molenda uint32_t 15948ee9cb58SJason Molenda SBThread::GetExtendedBacktraceOriginatingIndexID () 15958ee9cb58SJason Molenda { 15968ee9cb58SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 15978ee9cb58SJason Molenda if (thread_sp) 15988ee9cb58SJason Molenda return thread_sp->GetExtendedBacktraceOriginatingIndexID(); 15998ee9cb58SJason Molenda return LLDB_INVALID_INDEX32; 16008ee9cb58SJason Molenda } 1601b4892cd2SJason Molenda 1602b4892cd2SJason Molenda bool 1603b4892cd2SJason Molenda SBThread::SafeToCallFunctions () 1604b4892cd2SJason Molenda { 1605b4892cd2SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1606b4892cd2SJason Molenda if (thread_sp) 1607b4892cd2SJason Molenda return thread_sp->SafeToCallFunctions(); 1608b4892cd2SJason Molenda return true; 1609b4892cd2SJason Molenda } 16102bdbfd50SJim Ingham 16112bdbfd50SJim Ingham lldb_private::Thread * 16122bdbfd50SJim Ingham SBThread::operator->() 16132bdbfd50SJim Ingham { 16142bdbfd50SJim Ingham ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 16152bdbfd50SJim Ingham if (thread_sp) 16162bdbfd50SJim Ingham return thread_sp.get(); 16172bdbfd50SJim Ingham else 16182bdbfd50SJim Ingham return NULL; 16192bdbfd50SJim Ingham } 16202bdbfd50SJim Ingham 16212bdbfd50SJim Ingham lldb_private::Thread * 16222bdbfd50SJim Ingham SBThread::get() 16232bdbfd50SJim Ingham { 16242bdbfd50SJim Ingham ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 16252bdbfd50SJim Ingham if (thread_sp) 16262bdbfd50SJim Ingham return thread_sp.get(); 16272bdbfd50SJim Ingham else 16282bdbfd50SJim Ingham return NULL; 16292bdbfd50SJim Ingham } 16302bdbfd50SJim Ingham 1631