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" 23*a78bd7ffSZachary Turner #include "lldb/Core/ValueObject.h" 246611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 2593749ab3SZachary Turner #include "lldb/Symbol/SymbolContext.h" 2693749ab3SZachary Turner #include "lldb/Symbol/CompileUnit.h" 275dd4916fSJason Molenda #include "lldb/Target/SystemRuntime.h" 2830fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 2930fdc8d8SChris Lattner #include "lldb/Target/Process.h" 30b9ffa98cSJason Molenda #include "lldb/Target/Queue.h" 3193749ab3SZachary Turner #include "lldb/Target/UnixSignals.h" 32f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h" 3330fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3430fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h" 3530fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h" 3630fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h" 3730fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h" 3830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInRange.h" 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner 414c5de699SEli Friedman #include "lldb/API/SBAddress.h" 424c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 434f465cffSJim Ingham #include "lldb/API/SBEvent.h" 4473ca05a2SJim Ingham #include "lldb/API/SBFrame.h" 454c5de699SEli Friedman #include "lldb/API/SBProcess.h" 462bdbfd50SJim Ingham #include "lldb/API/SBThreadPlan.h" 4773ca05a2SJim Ingham #include "lldb/API/SBValue.h" 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner using namespace lldb; 5030fdc8d8SChris Lattner using namespace lldb_private; 5130fdc8d8SChris Lattner 524f465cffSJim Ingham const char * 534f465cffSJim Ingham SBThread::GetBroadcasterClassName () 544f465cffSJim Ingham { 554f465cffSJim Ingham return Thread::GetStaticBroadcasterClass().AsCString(); 564f465cffSJim Ingham } 574f465cffSJim Ingham 58cfd1acedSGreg Clayton //---------------------------------------------------------------------- 59cfd1acedSGreg Clayton // Constructors 60cfd1acedSGreg Clayton //---------------------------------------------------------------------- 6130fdc8d8SChris Lattner SBThread::SBThread () : 627fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 6330fdc8d8SChris Lattner { 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) : 677fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef(lldb_object_sp)) 6830fdc8d8SChris Lattner { 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 7192ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) : 727fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp)) 7330fdc8d8SChris Lattner { 747fdf9ef1SGreg Clayton 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 7730fdc8d8SChris Lattner //---------------------------------------------------------------------- 78cfd1acedSGreg Clayton // Assignment operator 79cfd1acedSGreg Clayton //---------------------------------------------------------------------- 80cfd1acedSGreg Clayton 81cfd1acedSGreg Clayton const lldb::SBThread & 82cfd1acedSGreg Clayton SBThread::operator = (const SBThread &rhs) 83cfd1acedSGreg Clayton { 84cfd1acedSGreg Clayton if (this != &rhs) 857fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 86cfd1acedSGreg Clayton return *this; 87cfd1acedSGreg Clayton } 88cfd1acedSGreg Clayton 89cfd1acedSGreg Clayton //---------------------------------------------------------------------- 9030fdc8d8SChris Lattner // Destructor 9130fdc8d8SChris Lattner //---------------------------------------------------------------------- 9230fdc8d8SChris Lattner SBThread::~SBThread() 9330fdc8d8SChris Lattner { 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner 96b9ffa98cSJason Molenda lldb::SBQueue 97b9ffa98cSJason Molenda SBThread::GetQueue () const 98b9ffa98cSJason Molenda { 99b9ffa98cSJason Molenda SBQueue sb_queue; 100b9ffa98cSJason Molenda QueueSP queue_sp; 101b9ffa98cSJason Molenda Mutex::Locker api_locker; 102b9ffa98cSJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 103b9ffa98cSJason Molenda 104b9ffa98cSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 105b9ffa98cSJason Molenda if (exe_ctx.HasThreadScope()) 106b9ffa98cSJason Molenda { 107b9ffa98cSJason Molenda Process::StopLocker stop_locker; 108b9ffa98cSJason Molenda if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 109b9ffa98cSJason Molenda { 110b9ffa98cSJason Molenda queue_sp = exe_ctx.GetThreadPtr()->GetQueue(); 111b9ffa98cSJason Molenda if (queue_sp) 112b9ffa98cSJason Molenda { 113b9ffa98cSJason Molenda sb_queue.SetQueue (queue_sp); 114b9ffa98cSJason Molenda } 115b9ffa98cSJason Molenda } 116b9ffa98cSJason Molenda else 117b9ffa98cSJason Molenda { 118b9ffa98cSJason Molenda if (log) 119b9ffa98cSJason Molenda log->Printf ("SBThread(%p)::GetQueueKind() => error: process is running", 120b9ffa98cSJason Molenda static_cast<void*>(exe_ctx.GetThreadPtr())); 121b9ffa98cSJason Molenda } 122b9ffa98cSJason Molenda } 123b9ffa98cSJason Molenda 124b9ffa98cSJason Molenda if (log) 125b9ffa98cSJason Molenda log->Printf ("SBThread(%p)::GetQueueKind () => SBQueue(%p)", 126b9ffa98cSJason Molenda static_cast<void*>(exe_ctx.GetThreadPtr()), static_cast<void*>(queue_sp.get())); 127b9ffa98cSJason Molenda 128b9ffa98cSJason Molenda return sb_queue; 129b9ffa98cSJason Molenda } 130b9ffa98cSJason Molenda 131b9ffa98cSJason Molenda 13230fdc8d8SChris Lattner bool 13330fdc8d8SChris Lattner SBThread::IsValid() const 13430fdc8d8SChris Lattner { 1357fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() != NULL; 13630fdc8d8SChris Lattner } 13730fdc8d8SChris Lattner 13848e42549SGreg Clayton void 13948e42549SGreg Clayton SBThread::Clear () 14048e42549SGreg Clayton { 1417fdf9ef1SGreg Clayton m_opaque_sp->Clear(); 14248e42549SGreg Clayton } 14348e42549SGreg Clayton 14448e42549SGreg Clayton 14530fdc8d8SChris Lattner StopReason 14630fdc8d8SChris Lattner SBThread::GetStopReason() 14730fdc8d8SChris Lattner { 1485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 149ceb6b139SCaroline Tice 150ceb6b139SCaroline Tice StopReason reason = eStopReasonInvalid; 1514fc6cb9cSJim Ingham Mutex::Locker api_locker; 1524fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1534fc6cb9cSJim Ingham 1541ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 15530fdc8d8SChris Lattner { 1567fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1577fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1587fdf9ef1SGreg Clayton { 15997d5cf05SGreg Clayton return exe_ctx.GetThreadPtr()->GetStopReason(); 16030fdc8d8SChris Lattner } 161c9858e4dSGreg Clayton else 162c9858e4dSGreg Clayton { 163c9858e4dSGreg Clayton if (log) 164324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReason() => error: process is running", 165324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 166c9858e4dSGreg Clayton } 1677fdf9ef1SGreg Clayton } 168ceb6b139SCaroline Tice 169ceb6b139SCaroline Tice if (log) 170324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReason () => %s", 171324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 172750cd175SCaroline Tice Thread::StopReasonAsCString (reason)); 173ceb6b139SCaroline Tice 174ceb6b139SCaroline Tice return reason; 17530fdc8d8SChris Lattner } 17630fdc8d8SChris Lattner 17730fdc8d8SChris Lattner size_t 1784e78f606SGreg Clayton SBThread::GetStopReasonDataCount () 1794e78f606SGreg Clayton { 1804fc6cb9cSJim Ingham Mutex::Locker api_locker; 1814fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1824fc6cb9cSJim Ingham 1831ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1844e78f606SGreg Clayton { 1857fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1867fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1877fdf9ef1SGreg Clayton { 1881ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 1894e78f606SGreg Clayton if (stop_info_sp) 1904e78f606SGreg Clayton { 1914e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 1924e78f606SGreg Clayton switch (reason) 1934e78f606SGreg Clayton { 1944e78f606SGreg Clayton case eStopReasonInvalid: 1954e78f606SGreg Clayton case eStopReasonNone: 1964e78f606SGreg Clayton case eStopReasonTrace: 19790ba8115SGreg Clayton case eStopReasonExec: 1984e78f606SGreg Clayton case eStopReasonPlanComplete: 199f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 200afdf842bSKuba Brecka case eStopReasonInstrumentation: 2014e78f606SGreg Clayton // There is no data for these stop reasons. 2024e78f606SGreg Clayton return 0; 2034e78f606SGreg Clayton 2044e78f606SGreg Clayton case eStopReasonBreakpoint: 2054e78f606SGreg Clayton { 2064e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 2071ac04c30SGreg Clayton lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); 2084e78f606SGreg Clayton if (bp_site_sp) 2094e78f606SGreg Clayton return bp_site_sp->GetNumberOfOwners () * 2; 2104e78f606SGreg Clayton else 2114e78f606SGreg Clayton return 0; // Breakpoint must have cleared itself... 2124e78f606SGreg Clayton } 2134e78f606SGreg Clayton break; 2144e78f606SGreg Clayton 2154e78f606SGreg Clayton case eStopReasonWatchpoint: 216290fa41bSJohnny Chen return 1; 2174e78f606SGreg Clayton 2184e78f606SGreg Clayton case eStopReasonSignal: 2194e78f606SGreg Clayton return 1; 2204e78f606SGreg Clayton 2214e78f606SGreg Clayton case eStopReasonException: 2224e78f606SGreg Clayton return 1; 2234e78f606SGreg Clayton } 2244e78f606SGreg Clayton } 2254e78f606SGreg Clayton } 226c9858e4dSGreg Clayton else 227c9858e4dSGreg Clayton { 2285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 229c9858e4dSGreg Clayton if (log) 230324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running", 231324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 232c9858e4dSGreg Clayton } 2337fdf9ef1SGreg Clayton } 2344e78f606SGreg Clayton return 0; 2354e78f606SGreg Clayton } 2364e78f606SGreg Clayton 2374e78f606SGreg Clayton uint64_t 2384e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx) 2394e78f606SGreg Clayton { 2404fc6cb9cSJim Ingham Mutex::Locker api_locker; 2414fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2424fc6cb9cSJim Ingham 2431ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 2444e78f606SGreg Clayton { 2457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2467fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2477fdf9ef1SGreg Clayton { 2481ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 2491ac04c30SGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 2504e78f606SGreg Clayton if (stop_info_sp) 2514e78f606SGreg Clayton { 2524e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 2534e78f606SGreg Clayton switch (reason) 2544e78f606SGreg Clayton { 2554e78f606SGreg Clayton case eStopReasonInvalid: 2564e78f606SGreg Clayton case eStopReasonNone: 2574e78f606SGreg Clayton case eStopReasonTrace: 25890ba8115SGreg Clayton case eStopReasonExec: 2594e78f606SGreg Clayton case eStopReasonPlanComplete: 260f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 261afdf842bSKuba Brecka case eStopReasonInstrumentation: 2624e78f606SGreg Clayton // There is no data for these stop reasons. 2634e78f606SGreg Clayton return 0; 2644e78f606SGreg Clayton 2654e78f606SGreg Clayton case eStopReasonBreakpoint: 2664e78f606SGreg Clayton { 2674e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 2681ac04c30SGreg Clayton lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); 2694e78f606SGreg Clayton if (bp_site_sp) 2704e78f606SGreg Clayton { 2714e78f606SGreg Clayton uint32_t bp_index = idx / 2; 2724e78f606SGreg Clayton BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index)); 2734e78f606SGreg Clayton if (bp_loc_sp) 2744e78f606SGreg Clayton { 2758334e14eSGreg Clayton if (idx & 1) 2764e78f606SGreg Clayton { 2774e78f606SGreg Clayton // Odd idx, return the breakpoint location ID 2784e78f606SGreg Clayton return bp_loc_sp->GetID(); 2794e78f606SGreg Clayton } 2804e78f606SGreg Clayton else 2814e78f606SGreg Clayton { 2824e78f606SGreg Clayton // Even idx, return the breakpoint ID 2834e78f606SGreg Clayton return bp_loc_sp->GetBreakpoint().GetID(); 2844e78f606SGreg Clayton } 2854e78f606SGreg Clayton } 2864e78f606SGreg Clayton } 2874e78f606SGreg Clayton return LLDB_INVALID_BREAK_ID; 2884e78f606SGreg Clayton } 2894e78f606SGreg Clayton break; 2904e78f606SGreg Clayton 2914e78f606SGreg Clayton case eStopReasonWatchpoint: 292290fa41bSJohnny Chen return stop_info_sp->GetValue(); 2934e78f606SGreg Clayton 2944e78f606SGreg Clayton case eStopReasonSignal: 2954e78f606SGreg Clayton return stop_info_sp->GetValue(); 2964e78f606SGreg Clayton 2974e78f606SGreg Clayton case eStopReasonException: 2984e78f606SGreg Clayton return stop_info_sp->GetValue(); 2994e78f606SGreg Clayton } 3004e78f606SGreg Clayton } 3014e78f606SGreg Clayton } 302c9858e4dSGreg Clayton else 303c9858e4dSGreg Clayton { 3045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 305c9858e4dSGreg Clayton if (log) 306324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running", 307324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 308c9858e4dSGreg Clayton } 3097fdf9ef1SGreg Clayton } 3104e78f606SGreg Clayton return 0; 3114e78f606SGreg Clayton } 3124e78f606SGreg Clayton 313afdf842bSKuba Brecka bool 314afdf842bSKuba Brecka SBThread::GetStopReasonExtendedInfoAsJSON (lldb::SBStream &stream) 315afdf842bSKuba Brecka { 316afdf842bSKuba Brecka Stream &strm = stream.ref(); 317afdf842bSKuba Brecka 318afdf842bSKuba Brecka ExecutionContext exe_ctx (m_opaque_sp.get()); 319afdf842bSKuba Brecka if (! exe_ctx.HasThreadScope()) 320afdf842bSKuba Brecka return false; 321afdf842bSKuba Brecka 322afdf842bSKuba Brecka 323afdf842bSKuba Brecka StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); 324afdf842bSKuba Brecka StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); 325afdf842bSKuba Brecka if (! info) 326afdf842bSKuba Brecka return false; 327afdf842bSKuba Brecka 328afdf842bSKuba Brecka info->Dump(strm); 329afdf842bSKuba Brecka 330afdf842bSKuba Brecka return true; 331afdf842bSKuba Brecka } 332afdf842bSKuba Brecka 3334e78f606SGreg Clayton size_t 33430fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len) 33530fdc8d8SChris Lattner { 3365160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 337ceb6b139SCaroline Tice 3384fc6cb9cSJim Ingham Mutex::Locker api_locker; 3394fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3404fc6cb9cSJim Ingham 3411ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 34230fdc8d8SChris Lattner { 3437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3447fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3457fdf9ef1SGreg Clayton { 3467fdf9ef1SGreg Clayton 3471ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 348b15bfc75SJim Ingham if (stop_info_sp) 34930fdc8d8SChris Lattner { 350b15bfc75SJim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 35130fdc8d8SChris Lattner if (stop_desc) 35230fdc8d8SChris Lattner { 353ceb6b139SCaroline Tice if (log) 3544838131bSGreg Clayton log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"", 355324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 356324a1036SSaleem Abdulrasool stop_desc); 35730fdc8d8SChris Lattner if (dst) 35830fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc); 35930fdc8d8SChris Lattner else 36030fdc8d8SChris Lattner { 36130fdc8d8SChris Lattner // NULL dst passed in, return the length needed to contain the description 36230fdc8d8SChris Lattner return ::strlen (stop_desc) + 1; // Include the NULL byte for size 36330fdc8d8SChris Lattner } 36430fdc8d8SChris Lattner } 36530fdc8d8SChris Lattner else 36630fdc8d8SChris Lattner { 36730fdc8d8SChris Lattner size_t stop_desc_len = 0; 368b15bfc75SJim Ingham switch (stop_info_sp->GetStopReason()) 36930fdc8d8SChris Lattner { 37030fdc8d8SChris Lattner case eStopReasonTrace: 37130fdc8d8SChris Lattner case eStopReasonPlanComplete: 37230fdc8d8SChris Lattner { 37330fdc8d8SChris Lattner static char trace_desc[] = "step"; 37430fdc8d8SChris Lattner stop_desc = trace_desc; 37530fdc8d8SChris Lattner stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner break; 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner case eStopReasonBreakpoint: 38030fdc8d8SChris Lattner { 38130fdc8d8SChris Lattner static char bp_desc[] = "breakpoint hit"; 38230fdc8d8SChris Lattner stop_desc = bp_desc; 38330fdc8d8SChris Lattner stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner break; 38630fdc8d8SChris Lattner 38730fdc8d8SChris Lattner case eStopReasonWatchpoint: 38830fdc8d8SChris Lattner { 38930fdc8d8SChris Lattner static char wp_desc[] = "watchpoint hit"; 39030fdc8d8SChris Lattner stop_desc = wp_desc; 39130fdc8d8SChris Lattner stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner break; 39430fdc8d8SChris Lattner 39530fdc8d8SChris Lattner case eStopReasonSignal: 39630fdc8d8SChris Lattner { 3971ac04c30SGreg Clayton stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue()); 39830fdc8d8SChris Lattner if (stop_desc == NULL || stop_desc[0] == '\0') 39930fdc8d8SChris Lattner { 40030fdc8d8SChris Lattner static char signal_desc[] = "signal"; 40130fdc8d8SChris Lattner stop_desc = signal_desc; 40230fdc8d8SChris Lattner stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size 40330fdc8d8SChris Lattner } 40430fdc8d8SChris Lattner } 40530fdc8d8SChris Lattner break; 40630fdc8d8SChris Lattner 40730fdc8d8SChris Lattner case eStopReasonException: 40830fdc8d8SChris Lattner { 40930fdc8d8SChris Lattner char exc_desc[] = "exception"; 41030fdc8d8SChris Lattner stop_desc = exc_desc; 41130fdc8d8SChris Lattner stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner break; 414c982c768SGreg Clayton 41590ba8115SGreg Clayton case eStopReasonExec: 41690ba8115SGreg Clayton { 41790ba8115SGreg Clayton char exc_desc[] = "exec"; 41890ba8115SGreg Clayton stop_desc = exc_desc; 41990ba8115SGreg Clayton stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 42090ba8115SGreg Clayton } 42190ba8115SGreg Clayton break; 42290ba8115SGreg Clayton 423f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 424f85defaeSAndrew Kaylor { 425f85defaeSAndrew Kaylor char limbo_desc[] = "thread exiting"; 426f85defaeSAndrew Kaylor stop_desc = limbo_desc; 427f85defaeSAndrew Kaylor stop_desc_len = sizeof(limbo_desc); 428f85defaeSAndrew Kaylor } 429f85defaeSAndrew Kaylor break; 430c982c768SGreg Clayton default: 431c982c768SGreg Clayton break; 43230fdc8d8SChris Lattner } 43330fdc8d8SChris Lattner 43430fdc8d8SChris Lattner if (stop_desc && stop_desc[0]) 43530fdc8d8SChris Lattner { 436ceb6b139SCaroline Tice if (log) 43793aa84e8SGreg Clayton log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'", 438324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 439324a1036SSaleem Abdulrasool stop_desc); 440ceb6b139SCaroline Tice 44130fdc8d8SChris Lattner if (dst) 44230fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte 44330fdc8d8SChris Lattner 44430fdc8d8SChris Lattner if (stop_desc_len == 0) 44530fdc8d8SChris Lattner stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner return stop_desc_len; 44830fdc8d8SChris Lattner } 44930fdc8d8SChris Lattner } 45030fdc8d8SChris Lattner } 45130fdc8d8SChris Lattner } 452c9858e4dSGreg Clayton else 453c9858e4dSGreg Clayton { 4545160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 455c9858e4dSGreg Clayton if (log) 456324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running", 457324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 458c9858e4dSGreg Clayton } 4597fdf9ef1SGreg Clayton } 46030fdc8d8SChris Lattner if (dst) 46130fdc8d8SChris Lattner *dst = 0; 46230fdc8d8SChris Lattner return 0; 46330fdc8d8SChris Lattner } 46430fdc8d8SChris Lattner 46573ca05a2SJim Ingham SBValue 46673ca05a2SJim Ingham SBThread::GetStopReturnValue () 46773ca05a2SJim Ingham { 4685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 46973ca05a2SJim Ingham ValueObjectSP return_valobj_sp; 4704fc6cb9cSJim Ingham Mutex::Locker api_locker; 4714fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4724fc6cb9cSJim Ingham 4731ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 47473ca05a2SJim Ingham { 4757fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4767fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4777fdf9ef1SGreg Clayton { 4781ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 47973ca05a2SJim Ingham if (stop_info_sp) 48073ca05a2SJim Ingham { 48173ca05a2SJim Ingham return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 48273ca05a2SJim Ingham } 48373ca05a2SJim Ingham } 484c9858e4dSGreg Clayton else 485c9858e4dSGreg Clayton { 486c9858e4dSGreg Clayton if (log) 487324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running", 488324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 489c9858e4dSGreg Clayton } 4907fdf9ef1SGreg Clayton } 49173ca05a2SJim Ingham 49273ca05a2SJim Ingham if (log) 493324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", 494324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 49573ca05a2SJim Ingham return_valobj_sp.get() 49673ca05a2SJim Ingham ? return_valobj_sp->GetValueAsCString() 49773ca05a2SJim Ingham : "<no return value>"); 49873ca05a2SJim Ingham 49973ca05a2SJim Ingham return SBValue (return_valobj_sp); 50073ca05a2SJim Ingham } 50173ca05a2SJim Ingham 50230fdc8d8SChris Lattner void 50330fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp) 50430fdc8d8SChris Lattner { 5057fdf9ef1SGreg Clayton m_opaque_sp->SetThreadSP (lldb_object_sp); 50630fdc8d8SChris Lattner } 50730fdc8d8SChris Lattner 50830fdc8d8SChris Lattner lldb::tid_t 50930fdc8d8SChris Lattner SBThread::GetThreadID () const 51030fdc8d8SChris Lattner { 5117fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 51217a6ad05SGreg Clayton if (thread_sp) 5131ac04c30SGreg Clayton return thread_sp->GetID(); 5141ac04c30SGreg Clayton return LLDB_INVALID_THREAD_ID; 51530fdc8d8SChris Lattner } 51630fdc8d8SChris Lattner 51730fdc8d8SChris Lattner uint32_t 51830fdc8d8SChris Lattner SBThread::GetIndexID () const 51930fdc8d8SChris Lattner { 5207fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 52117a6ad05SGreg Clayton if (thread_sp) 52217a6ad05SGreg Clayton return thread_sp->GetIndexID(); 52330fdc8d8SChris Lattner return LLDB_INVALID_INDEX32; 52430fdc8d8SChris Lattner } 5251ac04c30SGreg Clayton 52630fdc8d8SChris Lattner const char * 52730fdc8d8SChris Lattner SBThread::GetName () const 52830fdc8d8SChris Lattner { 5295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5304838131bSGreg Clayton const char *name = NULL; 5314fc6cb9cSJim Ingham Mutex::Locker api_locker; 5324fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5334fc6cb9cSJim Ingham 5341ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 535af67cecdSGreg Clayton { 5367fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5377fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5387fdf9ef1SGreg Clayton { 5391ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetName(); 540af67cecdSGreg Clayton } 541c9858e4dSGreg Clayton else 542c9858e4dSGreg Clayton { 543c9858e4dSGreg Clayton if (log) 544324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetName() => error: process is running", 545324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 546c9858e4dSGreg Clayton } 5477fdf9ef1SGreg Clayton } 548ceb6b139SCaroline Tice 549ceb6b139SCaroline Tice if (log) 550324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetName () => %s", 551324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 552324a1036SSaleem Abdulrasool name ? name : "NULL"); 553ceb6b139SCaroline Tice 5544838131bSGreg Clayton return name; 55530fdc8d8SChris Lattner } 55630fdc8d8SChris Lattner 55730fdc8d8SChris Lattner const char * 55830fdc8d8SChris Lattner SBThread::GetQueueName () const 55930fdc8d8SChris Lattner { 5604838131bSGreg Clayton const char *name = NULL; 5614fc6cb9cSJim Ingham Mutex::Locker api_locker; 5624fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5634fc6cb9cSJim Ingham 5645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5651ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 566af67cecdSGreg Clayton { 5677fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5687fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5697fdf9ef1SGreg Clayton { 5701ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetQueueName(); 571af67cecdSGreg Clayton } 572c9858e4dSGreg Clayton else 573c9858e4dSGreg Clayton { 574c9858e4dSGreg Clayton if (log) 575324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueName() => error: process is running", 576324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 577c9858e4dSGreg Clayton } 5787fdf9ef1SGreg Clayton } 579ceb6b139SCaroline Tice 580ceb6b139SCaroline Tice if (log) 581324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueName () => %s", 582324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 583324a1036SSaleem Abdulrasool name ? name : "NULL"); 584ceb6b139SCaroline Tice 5854838131bSGreg Clayton return name; 58630fdc8d8SChris Lattner } 58730fdc8d8SChris Lattner 5884fdb5863SJason Molenda lldb::queue_id_t 5894fdb5863SJason Molenda SBThread::GetQueueID () const 5904fdb5863SJason Molenda { 5914fdb5863SJason Molenda queue_id_t id = LLDB_INVALID_QUEUE_ID; 5924fdb5863SJason Molenda Mutex::Locker api_locker; 5934fdb5863SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5944fdb5863SJason Molenda 5954fdb5863SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5964fdb5863SJason Molenda if (exe_ctx.HasThreadScope()) 5974fdb5863SJason Molenda { 5984fdb5863SJason Molenda Process::StopLocker stop_locker; 5994fdb5863SJason Molenda if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 6004fdb5863SJason Molenda { 6014fdb5863SJason Molenda id = exe_ctx.GetThreadPtr()->GetQueueID(); 6024fdb5863SJason Molenda } 6034fdb5863SJason Molenda else 6044fdb5863SJason Molenda { 6054fdb5863SJason Molenda if (log) 606324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueID() => error: process is running", 607324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 6084fdb5863SJason Molenda } 6094fdb5863SJason Molenda } 6104fdb5863SJason Molenda 6114fdb5863SJason Molenda if (log) 612324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetQueueID () => 0x%" PRIx64, 613324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), id); 6144fdb5863SJason Molenda 6154fdb5863SJason Molenda return id; 6164fdb5863SJason Molenda } 6174fdb5863SJason Molenda 618705b1809SJason Molenda bool 619705b1809SJason Molenda SBThread::GetInfoItemByPathAsString (const char *path, SBStream &strm) 620705b1809SJason Molenda { 621705b1809SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 622705b1809SJason Molenda bool success = false; 623705b1809SJason Molenda Mutex::Locker api_locker; 624705b1809SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 625705b1809SJason Molenda 626705b1809SJason Molenda if (exe_ctx.HasThreadScope()) 627705b1809SJason Molenda { 628705b1809SJason Molenda Process::StopLocker stop_locker; 629705b1809SJason Molenda if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 630705b1809SJason Molenda { 631705b1809SJason Molenda Thread *thread = exe_ctx.GetThreadPtr(); 632705b1809SJason Molenda StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo(); 633705b1809SJason Molenda if (info_root_sp) 634705b1809SJason Molenda { 635705b1809SJason Molenda StructuredData::ObjectSP node = info_root_sp->GetObjectForDotSeparatedPath (path); 636705b1809SJason Molenda if (node) 637705b1809SJason Molenda { 638705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeString) 639705b1809SJason Molenda { 640705b1809SJason Molenda strm.Printf ("%s", node->GetAsString()->GetValue().c_str()); 641705b1809SJason Molenda success = true; 642705b1809SJason Molenda } 643705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeInteger) 644705b1809SJason Molenda { 645705b1809SJason Molenda strm.Printf ("0x%" PRIx64, node->GetAsInteger()->GetValue()); 646705b1809SJason Molenda success = true; 647705b1809SJason Molenda } 648705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeFloat) 649705b1809SJason Molenda { 650705b1809SJason Molenda strm.Printf ("0x%f", node->GetAsFloat()->GetValue()); 651705b1809SJason Molenda success = true; 652705b1809SJason Molenda } 653705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeBoolean) 654705b1809SJason Molenda { 655705b1809SJason Molenda if (node->GetAsBoolean()->GetValue() == true) 656705b1809SJason Molenda strm.Printf ("true"); 657705b1809SJason Molenda else 658705b1809SJason Molenda strm.Printf ("false"); 659705b1809SJason Molenda success = true; 660705b1809SJason Molenda } 661705b1809SJason Molenda if (node->GetType() == StructuredData::Type::eTypeNull) 662705b1809SJason Molenda { 663705b1809SJason Molenda strm.Printf ("null"); 664705b1809SJason Molenda success = true; 665705b1809SJason Molenda } 666705b1809SJason Molenda } 667705b1809SJason Molenda } 668705b1809SJason Molenda } 669705b1809SJason Molenda else 670705b1809SJason Molenda { 671705b1809SJason Molenda if (log) 672705b1809SJason Molenda log->Printf ("SBThread(%p)::GetInfoItemByPathAsString() => error: process is running", 673705b1809SJason Molenda static_cast<void*>(exe_ctx.GetThreadPtr())); 674705b1809SJason Molenda } 675705b1809SJason Molenda } 676705b1809SJason Molenda 677705b1809SJason Molenda if (log) 678705b1809SJason Molenda log->Printf ("SBThread(%p)::GetInfoItemByPathAsString () => %s", 679705b1809SJason Molenda static_cast<void*>(exe_ctx.GetThreadPtr()), 680705b1809SJason Molenda strm.GetData()); 681705b1809SJason Molenda 682705b1809SJason Molenda return success; 683705b1809SJason Molenda } 684705b1809SJason Molenda 685705b1809SJason Molenda 68664e7ead1SJim Ingham SBError 68764e7ead1SJim Ingham SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan) 68864e7ead1SJim Ingham { 68964e7ead1SJim Ingham SBError sb_error; 69064e7ead1SJim Ingham 69164e7ead1SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 69264e7ead1SJim Ingham if (!process) 69364e7ead1SJim Ingham { 69464e7ead1SJim Ingham sb_error.SetErrorString("No process in SBThread::ResumeNewPlan"); 69564e7ead1SJim Ingham return sb_error; 69664e7ead1SJim Ingham } 69764e7ead1SJim Ingham 69864e7ead1SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 69964e7ead1SJim Ingham if (!thread) 70064e7ead1SJim Ingham { 70164e7ead1SJim Ingham sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan"); 70264e7ead1SJim Ingham return sb_error; 70364e7ead1SJim Ingham } 70464e7ead1SJim Ingham 70564e7ead1SJim Ingham // User level plans should be Master Plans so they can be interrupted, other plans executed, and 70664e7ead1SJim Ingham // then a "continue" will resume the plan. 70764e7ead1SJim Ingham if (new_plan != NULL) 70864e7ead1SJim Ingham { 70964e7ead1SJim Ingham new_plan->SetIsMasterPlan(true); 71064e7ead1SJim Ingham new_plan->SetOkayToDiscard(false); 71164e7ead1SJim Ingham } 71264e7ead1SJim Ingham 71364e7ead1SJim Ingham // Why do we need to set the current thread by ID here??? 71464e7ead1SJim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 71564e7ead1SJim Ingham 716dc6224e0SGreg Clayton if (process->GetTarget().GetDebugger().GetAsyncExecution ()) 717dc6224e0SGreg Clayton sb_error.ref() = process->Resume (); 718dc6224e0SGreg Clayton else 719dc6224e0SGreg Clayton sb_error.ref() = process->ResumeSynchronous (NULL); 72064e7ead1SJim Ingham 72164e7ead1SJim Ingham return sb_error; 72264e7ead1SJim Ingham } 72330fdc8d8SChris Lattner 72430fdc8d8SChris Lattner void 72530fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads) 72630fdc8d8SChris Lattner { 7275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 728ceb6b139SCaroline Tice 7294fc6cb9cSJim Ingham Mutex::Locker api_locker; 7304fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7314fc6cb9cSJim Ingham 73217a6ad05SGreg Clayton 733ceb6b139SCaroline Tice if (log) 734324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", 735324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 736ceb6b139SCaroline Tice Thread::RunModeAsCString (stop_other_threads)); 737ceb6b139SCaroline Tice 7381ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 73930fdc8d8SChris Lattner { 7401ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 7417ba6e991SJim Ingham bool abort_other_plans = false; 742b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 74330fdc8d8SChris Lattner 7444d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 74530fdc8d8SChris Lattner if (frame_sp) 74630fdc8d8SChris Lattner { 74730fdc8d8SChris Lattner if (frame_sp->HasDebugInformation ()) 74830fdc8d8SChris Lattner { 7494b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 75030fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 7514d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans, 75230fdc8d8SChris Lattner sc.line_entry.range, 75330fdc8d8SChris Lattner sc, 7544b4b2478SJim Ingham stop_other_threads, 7554b4b2478SJim Ingham avoid_no_debug); 75630fdc8d8SChris Lattner } 75730fdc8d8SChris Lattner else 75830fdc8d8SChris Lattner { 7594d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true, 76030fdc8d8SChris Lattner abort_other_plans, 76130fdc8d8SChris Lattner stop_other_threads); 76230fdc8d8SChris Lattner } 76330fdc8d8SChris Lattner } 76430fdc8d8SChris Lattner 76564e7ead1SJim Ingham // This returns an error, we should use it! 7664d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 76730fdc8d8SChris Lattner } 76830fdc8d8SChris Lattner } 76930fdc8d8SChris Lattner 77030fdc8d8SChris Lattner void 77130fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads) 77230fdc8d8SChris Lattner { 773c627682eSJim Ingham StepInto (NULL, stop_other_threads); 774c627682eSJim Ingham } 775c627682eSJim Ingham 776c627682eSJim Ingham void 777c627682eSJim Ingham SBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads) 778c627682eSJim Ingham { 7795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 780ceb6b139SCaroline Tice 7814fc6cb9cSJim Ingham Mutex::Locker api_locker; 7824fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 78317a6ad05SGreg Clayton 78417a6ad05SGreg Clayton if (log) 785c627682eSJim Ingham log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')", 786324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 787c627682eSJim Ingham target_name? target_name: "<NULL>", 78817a6ad05SGreg Clayton Thread::RunModeAsCString (stop_other_threads)); 789c627682eSJim Ingham 7901ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 79130fdc8d8SChris Lattner { 7927ba6e991SJim Ingham bool abort_other_plans = false; 79330fdc8d8SChris Lattner 7941ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 795b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 7964d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 79730fdc8d8SChris Lattner 79830fdc8d8SChris Lattner if (frame_sp && frame_sp->HasDebugInformation ()) 79930fdc8d8SChris Lattner { 8004b4b2478SJim Ingham const LazyBool step_out_avoids_code_without_debug_info = eLazyBoolCalculate; 8014b4b2478SJim Ingham const LazyBool step_in_avoids_code_without_debug_info = eLazyBoolCalculate; 80230fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 8034d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans, 80430fdc8d8SChris Lattner sc.line_entry.range, 80530fdc8d8SChris Lattner sc, 806c627682eSJim Ingham target_name, 807474966a4SGreg Clayton stop_other_threads, 8084b4b2478SJim Ingham step_in_avoids_code_without_debug_info, 8094b4b2478SJim Ingham step_out_avoids_code_without_debug_info); 81030fdc8d8SChris Lattner } 81130fdc8d8SChris Lattner else 81230fdc8d8SChris Lattner { 8134d56e9c1SJim Ingham new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false, 81430fdc8d8SChris Lattner abort_other_plans, 81530fdc8d8SChris Lattner stop_other_threads); 81630fdc8d8SChris Lattner } 81730fdc8d8SChris Lattner 81864e7ead1SJim Ingham // This returns an error, we should use it! 8194d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 82030fdc8d8SChris Lattner } 82130fdc8d8SChris Lattner } 82230fdc8d8SChris Lattner 82330fdc8d8SChris Lattner void 82430fdc8d8SChris Lattner SBThread::StepOut () 82530fdc8d8SChris Lattner { 8265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 827ceb6b139SCaroline Tice 8284fc6cb9cSJim Ingham Mutex::Locker api_locker; 8294fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8304fc6cb9cSJim Ingham 831ceb6b139SCaroline Tice 83217a6ad05SGreg Clayton if (log) 833324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepOut ()", 834324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 83517a6ad05SGreg Clayton 8361ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 83730fdc8d8SChris Lattner { 8387ba6e991SJim Ingham bool abort_other_plans = false; 83994b09246SJim Ingham bool stop_other_threads = false; 84030fdc8d8SChris Lattner 8411ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 8421ac04c30SGreg Clayton 8434b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 8444d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans, 845481cef25SGreg Clayton NULL, 846481cef25SGreg Clayton false, 847481cef25SGreg Clayton stop_other_threads, 848481cef25SGreg Clayton eVoteYes, 849481cef25SGreg Clayton eVoteNoOpinion, 8504b4b2478SJim Ingham 0, 8514b4b2478SJim Ingham avoid_no_debug)); 852481cef25SGreg Clayton 85364e7ead1SJim Ingham // This returns an error, we should use it! 8544d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 855481cef25SGreg Clayton } 856481cef25SGreg Clayton } 857481cef25SGreg Clayton 858481cef25SGreg Clayton void 859481cef25SGreg Clayton SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame) 860481cef25SGreg Clayton { 8615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 862481cef25SGreg Clayton 8634fc6cb9cSJim Ingham Mutex::Locker api_locker; 8644fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8654fc6cb9cSJim Ingham 866b57e4a1bSJason Molenda StackFrameSP frame_sp (sb_frame.GetFrameSP()); 867481cef25SGreg Clayton if (log) 868481cef25SGreg Clayton { 869481cef25SGreg Clayton SBStream frame_desc_strm; 870481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 871324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", 872324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 873324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 874324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 875481cef25SGreg Clayton } 876481cef25SGreg Clayton 8771ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 878481cef25SGreg Clayton { 8797ba6e991SJim Ingham bool abort_other_plans = false; 88094b09246SJim Ingham bool stop_other_threads = false; 8811ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 882481cef25SGreg Clayton 8834d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans, 884481cef25SGreg Clayton NULL, 885481cef25SGreg Clayton false, 886481cef25SGreg Clayton stop_other_threads, 887481cef25SGreg Clayton eVoteYes, 888481cef25SGreg Clayton eVoteNoOpinion, 8894d56e9c1SJim Ingham frame_sp->GetFrameIndex())); 89030fdc8d8SChris Lattner 89164e7ead1SJim Ingham // This returns an error, we should use it! 8924d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 89330fdc8d8SChris Lattner } 89430fdc8d8SChris Lattner } 89530fdc8d8SChris Lattner 89630fdc8d8SChris Lattner void 89730fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over) 89830fdc8d8SChris Lattner { 8995160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 900ceb6b139SCaroline Tice 9014fc6cb9cSJim Ingham Mutex::Locker api_locker; 9024fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9034fc6cb9cSJim Ingham 9041ac04c30SGreg Clayton 905ceb6b139SCaroline Tice 90617a6ad05SGreg Clayton if (log) 907324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", 908324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), step_over); 90917a6ad05SGreg Clayton 9101ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 91130fdc8d8SChris Lattner { 9121ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 9134d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true)); 91464e7ead1SJim Ingham 91564e7ead1SJim Ingham // This returns an error, we should use it! 9164d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 91730fdc8d8SChris Lattner } 91830fdc8d8SChris Lattner } 91930fdc8d8SChris Lattner 92030fdc8d8SChris Lattner void 92130fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr) 92230fdc8d8SChris Lattner { 9235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 924ceb6b139SCaroline Tice 9254fc6cb9cSJim Ingham Mutex::Locker api_locker; 9264fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9274fc6cb9cSJim Ingham 928ceb6b139SCaroline Tice 92917a6ad05SGreg Clayton if (log) 930324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", 931324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), addr); 93217a6ad05SGreg Clayton 9331ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 93430fdc8d8SChris Lattner { 9357ba6e991SJim Ingham bool abort_other_plans = false; 93630fdc8d8SChris Lattner bool stop_other_threads = true; 93730fdc8d8SChris Lattner 938e72dfb32SGreg Clayton Address target_addr (addr); 93930fdc8d8SChris Lattner 9401ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 9411ac04c30SGreg Clayton 9422bdbfd50SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, 9432bdbfd50SJim Ingham target_addr, 9442bdbfd50SJim Ingham stop_other_threads)); 94564e7ead1SJim Ingham 94664e7ead1SJim Ingham // This returns an error, we should use it! 9474d56e9c1SJim Ingham ResumeNewPlan (exe_ctx, new_plan_sp.get()); 94830fdc8d8SChris Lattner } 94930fdc8d8SChris Lattner } 95030fdc8d8SChris Lattner 951481cef25SGreg Clayton SBError 952481cef25SGreg Clayton SBThread::StepOverUntil (lldb::SBFrame &sb_frame, 953481cef25SGreg Clayton lldb::SBFileSpec &sb_file_spec, 954481cef25SGreg Clayton uint32_t line) 955481cef25SGreg Clayton { 956481cef25SGreg Clayton SBError sb_error; 9575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 958481cef25SGreg Clayton char path[PATH_MAX]; 959481cef25SGreg Clayton 9604fc6cb9cSJim Ingham Mutex::Locker api_locker; 9614fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9624fc6cb9cSJim Ingham 963b57e4a1bSJason Molenda StackFrameSP frame_sp (sb_frame.GetFrameSP()); 96417a6ad05SGreg Clayton 965481cef25SGreg Clayton if (log) 966481cef25SGreg Clayton { 967481cef25SGreg Clayton SBStream frame_desc_strm; 968481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 969481cef25SGreg Clayton sb_file_spec->GetPath (path, sizeof(path)); 970481cef25SGreg Clayton log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)", 971324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 972324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 973324a1036SSaleem Abdulrasool frame_desc_strm.GetData(), path, line); 974481cef25SGreg Clayton } 975481cef25SGreg Clayton 9761ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 977481cef25SGreg Clayton { 9781ac04c30SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9791ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 980481cef25SGreg Clayton 981481cef25SGreg Clayton if (line == 0) 982481cef25SGreg Clayton { 983481cef25SGreg Clayton sb_error.SetErrorString("invalid line argument"); 984481cef25SGreg Clayton return sb_error; 985481cef25SGreg Clayton } 986481cef25SGreg Clayton 987b9556accSGreg Clayton if (!frame_sp) 988481cef25SGreg Clayton { 9891ac04c30SGreg Clayton frame_sp = thread->GetSelectedFrame (); 990481cef25SGreg Clayton if (!frame_sp) 9911ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex (0); 992481cef25SGreg Clayton } 993481cef25SGreg Clayton 994481cef25SGreg Clayton SymbolContext frame_sc; 995481cef25SGreg Clayton if (!frame_sp) 996481cef25SGreg Clayton { 997481cef25SGreg Clayton sb_error.SetErrorString("no valid frames in thread to step"); 998481cef25SGreg Clayton return sb_error; 999481cef25SGreg Clayton } 1000481cef25SGreg Clayton 1001481cef25SGreg Clayton // If we have a frame, get its line 1002481cef25SGreg Clayton frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit | 1003481cef25SGreg Clayton eSymbolContextFunction | 1004481cef25SGreg Clayton eSymbolContextLineEntry | 1005481cef25SGreg Clayton eSymbolContextSymbol ); 1006481cef25SGreg Clayton 1007481cef25SGreg Clayton if (frame_sc.comp_unit == NULL) 1008481cef25SGreg Clayton { 1009481cef25SGreg Clayton sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex()); 1010481cef25SGreg Clayton return sb_error; 1011481cef25SGreg Clayton } 1012481cef25SGreg Clayton 1013481cef25SGreg Clayton FileSpec step_file_spec; 1014481cef25SGreg Clayton if (sb_file_spec.IsValid()) 1015481cef25SGreg Clayton { 1016481cef25SGreg Clayton // The file spec passed in was valid, so use it 1017481cef25SGreg Clayton step_file_spec = sb_file_spec.ref(); 1018481cef25SGreg Clayton } 1019481cef25SGreg Clayton else 1020481cef25SGreg Clayton { 1021481cef25SGreg Clayton if (frame_sc.line_entry.IsValid()) 1022481cef25SGreg Clayton step_file_spec = frame_sc.line_entry.file; 1023481cef25SGreg Clayton else 1024481cef25SGreg Clayton { 1025481cef25SGreg Clayton sb_error.SetErrorString("invalid file argument or no file for frame"); 1026481cef25SGreg Clayton return sb_error; 1027481cef25SGreg Clayton } 1028481cef25SGreg Clayton } 1029481cef25SGreg Clayton 10309b70ddb3SJim Ingham // Grab the current function, then we will make sure the "until" address is 10319b70ddb3SJim Ingham // within the function. We discard addresses that are out of the current 10329b70ddb3SJim Ingham // function, and then if there are no addresses remaining, give an appropriate 10339b70ddb3SJim Ingham // error message. 10349b70ddb3SJim Ingham 10359b70ddb3SJim Ingham bool all_in_function = true; 10369b70ddb3SJim Ingham AddressRange fun_range = frame_sc.function->GetAddressRange(); 10379b70ddb3SJim Ingham 1038481cef25SGreg Clayton std::vector<addr_t> step_over_until_addrs; 10397ba6e991SJim Ingham const bool abort_other_plans = false; 1040c02e3344SJim Ingham const bool stop_other_threads = false; 1041481cef25SGreg Clayton const bool check_inlines = true; 1042481cef25SGreg Clayton const bool exact = false; 1043481cef25SGreg Clayton 1044481cef25SGreg Clayton SymbolContextList sc_list; 10459b70ddb3SJim Ingham const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec, 10469b70ddb3SJim Ingham line, 10479b70ddb3SJim Ingham check_inlines, 10489b70ddb3SJim Ingham exact, 10499b70ddb3SJim Ingham eSymbolContextLineEntry, 10509b70ddb3SJim Ingham sc_list); 1051481cef25SGreg Clayton if (num_matches > 0) 1052481cef25SGreg Clayton { 1053481cef25SGreg Clayton SymbolContext sc; 1054481cef25SGreg Clayton for (uint32_t i=0; i<num_matches; ++i) 1055481cef25SGreg Clayton { 1056481cef25SGreg Clayton if (sc_list.GetContextAtIndex(i, sc)) 1057481cef25SGreg Clayton { 10589b70ddb3SJim Ingham addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target); 1059481cef25SGreg Clayton if (step_addr != LLDB_INVALID_ADDRESS) 1060481cef25SGreg Clayton { 10619b70ddb3SJim Ingham if (fun_range.ContainsLoadAddress(step_addr, target)) 1062481cef25SGreg Clayton step_over_until_addrs.push_back(step_addr); 10639b70ddb3SJim Ingham else 10649b70ddb3SJim Ingham all_in_function = false; 1065481cef25SGreg Clayton } 1066481cef25SGreg Clayton } 1067481cef25SGreg Clayton } 1068481cef25SGreg Clayton } 1069481cef25SGreg Clayton 1070481cef25SGreg Clayton if (step_over_until_addrs.empty()) 1071481cef25SGreg Clayton { 10729b70ddb3SJim Ingham if (all_in_function) 10739b70ddb3SJim Ingham { 1074481cef25SGreg Clayton step_file_spec.GetPath (path, sizeof(path)); 1075fd54b368SJason Molenda sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line); 1076481cef25SGreg Clayton } 1077481cef25SGreg Clayton else 107886edbf41SGreg Clayton sb_error.SetErrorString ("step until target not in current function"); 10799b70ddb3SJim Ingham } 10809b70ddb3SJim Ingham else 1081481cef25SGreg Clayton { 10824d56e9c1SJim Ingham ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans, 1083481cef25SGreg Clayton &step_over_until_addrs[0], 1084481cef25SGreg Clayton step_over_until_addrs.size(), 1085481cef25SGreg Clayton stop_other_threads, 10864d56e9c1SJim Ingham frame_sp->GetFrameIndex())); 1087481cef25SGreg Clayton 10884d56e9c1SJim Ingham sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get()); 1089481cef25SGreg Clayton } 1090481cef25SGreg Clayton } 1091481cef25SGreg Clayton else 1092481cef25SGreg Clayton { 1093481cef25SGreg Clayton sb_error.SetErrorString("this SBThread object is invalid"); 1094481cef25SGreg Clayton } 1095481cef25SGreg Clayton return sb_error; 1096481cef25SGreg Clayton } 1097481cef25SGreg Clayton 10984413758cSJim Ingham SBError 10992bdbfd50SJim Ingham SBThread::StepUsingScriptedThreadPlan (const char *script_class_name) 11002bdbfd50SJim Ingham { 11012bdbfd50SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11022bdbfd50SJim Ingham SBError sb_error; 11032bdbfd50SJim Ingham 11042bdbfd50SJim Ingham Mutex::Locker api_locker; 11052bdbfd50SJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11062bdbfd50SJim Ingham 11072bdbfd50SJim Ingham if (log) 11082bdbfd50SJim Ingham { 11092bdbfd50SJim Ingham log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s", 11102bdbfd50SJim Ingham static_cast<void*>(exe_ctx.GetThreadPtr()), 11112bdbfd50SJim Ingham script_class_name); 11122bdbfd50SJim Ingham } 11132bdbfd50SJim Ingham 11142bdbfd50SJim Ingham 11152bdbfd50SJim Ingham if (!exe_ctx.HasThreadScope()) 11162bdbfd50SJim Ingham { 11172bdbfd50SJim Ingham sb_error.SetErrorString("this SBThread object is invalid"); 11182bdbfd50SJim Ingham return sb_error; 11192bdbfd50SJim Ingham } 11202bdbfd50SJim Ingham 11212bdbfd50SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 11222bdbfd50SJim Ingham ThreadPlanSP thread_plan_sp = thread->QueueThreadPlanForStepScripted(false, script_class_name, false); 11232bdbfd50SJim Ingham 11242bdbfd50SJim Ingham if (thread_plan_sp) 11252bdbfd50SJim Ingham sb_error = ResumeNewPlan(exe_ctx, thread_plan_sp.get()); 11262bdbfd50SJim Ingham else 11272bdbfd50SJim Ingham { 11282bdbfd50SJim Ingham sb_error.SetErrorStringWithFormat("Error queuing thread plan for class: %s.", script_class_name); 11292bdbfd50SJim Ingham if (log) 11302bdbfd50SJim Ingham log->Printf ("SBThread(%p)::StepUsingScriptedThreadPlan: Error queuing thread plan for class: %s", 11312bdbfd50SJim Ingham static_cast<void*>(exe_ctx.GetThreadPtr()), 11322bdbfd50SJim Ingham script_class_name); 11332bdbfd50SJim Ingham } 11342bdbfd50SJim Ingham 11352bdbfd50SJim Ingham return sb_error; 11362bdbfd50SJim Ingham } 11372bdbfd50SJim Ingham 11382bdbfd50SJim Ingham SBError 1139f86248d9SRichard Mitton SBThread::JumpToLine (lldb::SBFileSpec &file_spec, uint32_t line) 1140f86248d9SRichard Mitton { 1141f86248d9SRichard Mitton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1142f86248d9SRichard Mitton SBError sb_error; 1143f86248d9SRichard Mitton 1144f86248d9SRichard Mitton Mutex::Locker api_locker; 1145f86248d9SRichard Mitton ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1146f86248d9SRichard Mitton 1147f86248d9SRichard Mitton if (log) 1148324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::JumpToLine (file+line = %s:%u)", 1149324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1150324a1036SSaleem Abdulrasool file_spec->GetPath().c_str(), line); 1151f86248d9SRichard Mitton 1152f86248d9SRichard Mitton if (!exe_ctx.HasThreadScope()) 1153f86248d9SRichard Mitton { 1154f86248d9SRichard Mitton sb_error.SetErrorString("this SBThread object is invalid"); 1155f86248d9SRichard Mitton return sb_error; 1156f86248d9SRichard Mitton } 1157f86248d9SRichard Mitton 1158f86248d9SRichard Mitton Thread *thread = exe_ctx.GetThreadPtr(); 1159f86248d9SRichard Mitton 1160f86248d9SRichard Mitton Error err = thread->JumpToLine (file_spec.get(), line, true); 1161f86248d9SRichard Mitton sb_error.SetError (err); 1162f86248d9SRichard Mitton return sb_error; 1163f86248d9SRichard Mitton } 1164f86248d9SRichard Mitton 1165f86248d9SRichard Mitton SBError 1166cb640dd8SJim Ingham SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value) 11674413758cSJim Ingham { 11684413758cSJim Ingham SBError sb_error; 11694413758cSJim Ingham 11705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11714413758cSJim Ingham 11724413758cSJim Ingham Mutex::Locker api_locker; 11734413758cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11744413758cSJim Ingham 11754413758cSJim Ingham 11764413758cSJim Ingham if (log) 1177324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", 1178324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1179324a1036SSaleem Abdulrasool frame.GetFrameID()); 11804413758cSJim Ingham 11814413758cSJim Ingham if (exe_ctx.HasThreadScope()) 11824413758cSJim Ingham { 11834413758cSJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 1184cb640dd8SJim Ingham sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP())); 11854413758cSJim Ingham } 11864413758cSJim Ingham 11874413758cSJim Ingham return sb_error; 11884413758cSJim Ingham } 11894413758cSJim Ingham 1190481cef25SGreg Clayton 1191722a0cdcSGreg Clayton bool 1192722a0cdcSGreg Clayton SBThread::Suspend() 1193722a0cdcSGreg Clayton { 11945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11957fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 1196c9858e4dSGreg Clayton bool result = false; 11971ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1198722a0cdcSGreg Clayton { 1199c9858e4dSGreg Clayton Process::StopLocker stop_locker; 1200c9858e4dSGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1201c9858e4dSGreg Clayton { 12021ac04c30SGreg Clayton exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended); 1203c9858e4dSGreg Clayton result = true; 1204722a0cdcSGreg Clayton } 1205c9858e4dSGreg Clayton else 1206c9858e4dSGreg Clayton { 1207c9858e4dSGreg Clayton if (log) 1208324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Suspend() => error: process is running", 1209324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1210c9858e4dSGreg Clayton } 1211c9858e4dSGreg Clayton } 1212c9858e4dSGreg Clayton if (log) 1213324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Suspend() => %i", 1214324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), result); 1215c9858e4dSGreg Clayton return result; 1216722a0cdcSGreg Clayton } 1217722a0cdcSGreg Clayton 1218722a0cdcSGreg Clayton bool 1219722a0cdcSGreg Clayton SBThread::Resume () 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 { 12296c9ed91cSJim Ingham const bool override_suspend = true; 12306c9ed91cSJim Ingham exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning, override_suspend); 1231c9858e4dSGreg Clayton result = true; 1232722a0cdcSGreg Clayton } 1233c9858e4dSGreg Clayton else 1234c9858e4dSGreg Clayton { 1235c9858e4dSGreg Clayton if (log) 1236324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Resume() => error: process is running", 1237324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1238c9858e4dSGreg Clayton } 1239c9858e4dSGreg Clayton } 1240c9858e4dSGreg Clayton if (log) 1241324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::Resume() => %i", 1242324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), result); 1243c9858e4dSGreg Clayton return result; 1244722a0cdcSGreg Clayton } 1245722a0cdcSGreg Clayton 1246722a0cdcSGreg Clayton bool 1247722a0cdcSGreg Clayton SBThread::IsSuspended() 1248722a0cdcSGreg Clayton { 12497fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 12501ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 12511ac04c30SGreg Clayton return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended; 1252722a0cdcSGreg Clayton return false; 1253722a0cdcSGreg Clayton } 1254722a0cdcSGreg Clayton 1255a75418dbSAndrew Kaylor bool 1256a75418dbSAndrew Kaylor SBThread::IsStopped() 1257a75418dbSAndrew Kaylor { 1258a75418dbSAndrew Kaylor ExecutionContext exe_ctx (m_opaque_sp.get()); 1259a75418dbSAndrew Kaylor if (exe_ctx.HasThreadScope()) 1260a75418dbSAndrew Kaylor return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true); 1261a75418dbSAndrew Kaylor return false; 1262a75418dbSAndrew Kaylor } 1263a75418dbSAndrew Kaylor 126430fdc8d8SChris Lattner SBProcess 126530fdc8d8SChris Lattner SBThread::GetProcess () 126630fdc8d8SChris Lattner { 1267b9556accSGreg Clayton SBProcess sb_process; 12687fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 12691ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 127030fdc8d8SChris Lattner { 127130fdc8d8SChris Lattner // Have to go up to the target so we can get a shared pointer to our process... 12721ac04c30SGreg Clayton sb_process.SetSP (exe_ctx.GetProcessSP()); 127330fdc8d8SChris Lattner } 1274ceb6b139SCaroline Tice 12755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1276ceb6b139SCaroline Tice if (log) 1277ceb6b139SCaroline Tice { 1278481cef25SGreg Clayton SBStream frame_desc_strm; 1279b9556accSGreg Clayton sb_process.GetDescription (frame_desc_strm); 1280324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", 1281324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1282324a1036SSaleem Abdulrasool static_cast<void*>(sb_process.GetSP().get()), 1283324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1284ceb6b139SCaroline Tice } 1285ceb6b139SCaroline Tice 1286b9556accSGreg Clayton return sb_process; 128730fdc8d8SChris Lattner } 128830fdc8d8SChris Lattner 128930fdc8d8SChris Lattner uint32_t 129030fdc8d8SChris Lattner SBThread::GetNumFrames () 129130fdc8d8SChris Lattner { 12925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1293ceb6b139SCaroline Tice 1294ceb6b139SCaroline Tice uint32_t num_frames = 0; 12954fc6cb9cSJim Ingham Mutex::Locker api_locker; 12964fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12974fc6cb9cSJim Ingham 12981ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1299af67cecdSGreg Clayton { 13007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13017fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 13027fdf9ef1SGreg Clayton { 13031ac04c30SGreg Clayton num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount(); 1304af67cecdSGreg Clayton } 1305c9858e4dSGreg Clayton else 1306c9858e4dSGreg Clayton { 1307c9858e4dSGreg Clayton if (log) 1308324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", 1309324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1310c9858e4dSGreg Clayton } 13117fdf9ef1SGreg Clayton } 1312ceb6b139SCaroline Tice 1313ceb6b139SCaroline Tice if (log) 1314324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetNumFrames () => %u", 1315324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), num_frames); 1316ceb6b139SCaroline Tice 1317ceb6b139SCaroline Tice return num_frames; 131830fdc8d8SChris Lattner } 131930fdc8d8SChris Lattner 132030fdc8d8SChris Lattner SBFrame 132130fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx) 132230fdc8d8SChris Lattner { 13235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1324ceb6b139SCaroline Tice 132530fdc8d8SChris Lattner SBFrame sb_frame; 1326b57e4a1bSJason Molenda StackFrameSP frame_sp; 13274fc6cb9cSJim Ingham Mutex::Locker api_locker; 13284fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13294fc6cb9cSJim Ingham 13301ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1331af67cecdSGreg Clayton { 13327fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13337fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 13347fdf9ef1SGreg Clayton { 13351ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx); 1336b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1337af67cecdSGreg Clayton } 1338c9858e4dSGreg Clayton else 1339c9858e4dSGreg Clayton { 1340c9858e4dSGreg Clayton if (log) 1341324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", 1342324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1343c9858e4dSGreg Clayton } 13447fdf9ef1SGreg Clayton } 1345ceb6b139SCaroline Tice 1346ceb6b139SCaroline Tice if (log) 1347ceb6b139SCaroline Tice { 1348481cef25SGreg Clayton SBStream frame_desc_strm; 1349481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 13504838131bSGreg Clayton log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s", 1351324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), idx, 1352324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 1353324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1354ceb6b139SCaroline Tice } 1355ceb6b139SCaroline Tice 135630fdc8d8SChris Lattner return sb_frame; 135730fdc8d8SChris Lattner } 135830fdc8d8SChris Lattner 1359f028a1fbSGreg Clayton lldb::SBFrame 1360f028a1fbSGreg Clayton SBThread::GetSelectedFrame () 1361f028a1fbSGreg Clayton { 13625160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1363f028a1fbSGreg Clayton 1364f028a1fbSGreg Clayton SBFrame sb_frame; 1365b57e4a1bSJason Molenda StackFrameSP frame_sp; 13664fc6cb9cSJim Ingham Mutex::Locker api_locker; 13674fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13684fc6cb9cSJim Ingham 13691ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1370af67cecdSGreg Clayton { 13717fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13727fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 13737fdf9ef1SGreg Clayton { 13741ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame (); 1375b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1376af67cecdSGreg Clayton } 1377c9858e4dSGreg Clayton else 1378c9858e4dSGreg Clayton { 1379c9858e4dSGreg Clayton if (log) 1380324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", 1381324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1382c9858e4dSGreg Clayton } 13837fdf9ef1SGreg Clayton } 1384f028a1fbSGreg Clayton 1385f028a1fbSGreg Clayton if (log) 1386f028a1fbSGreg Clayton { 1387481cef25SGreg Clayton SBStream frame_desc_strm; 1388481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 1389f028a1fbSGreg Clayton log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s", 1390324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1391324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 1392324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1393f028a1fbSGreg Clayton } 1394f028a1fbSGreg Clayton 1395f028a1fbSGreg Clayton return sb_frame; 1396f028a1fbSGreg Clayton } 1397f028a1fbSGreg Clayton 1398f028a1fbSGreg Clayton lldb::SBFrame 1399f028a1fbSGreg Clayton SBThread::SetSelectedFrame (uint32_t idx) 1400f028a1fbSGreg Clayton { 14015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1402f028a1fbSGreg Clayton 1403f028a1fbSGreg Clayton SBFrame sb_frame; 1404b57e4a1bSJason Molenda StackFrameSP frame_sp; 14054fc6cb9cSJim Ingham Mutex::Locker api_locker; 14064fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 14074fc6cb9cSJim Ingham 14081ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1409f028a1fbSGreg Clayton { 14107fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14117fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 14127fdf9ef1SGreg Clayton { 14131ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 14141ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex (idx); 1415f028a1fbSGreg Clayton if (frame_sp) 1416f028a1fbSGreg Clayton { 14171ac04c30SGreg Clayton thread->SetSelectedFrame (frame_sp.get()); 1418b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1419f028a1fbSGreg Clayton } 1420f028a1fbSGreg Clayton } 1421c9858e4dSGreg Clayton else 1422c9858e4dSGreg Clayton { 1423c9858e4dSGreg Clayton if (log) 1424324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", 1425324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 1426c9858e4dSGreg Clayton } 14277fdf9ef1SGreg Clayton } 1428f028a1fbSGreg Clayton 1429f028a1fbSGreg Clayton if (log) 1430f028a1fbSGreg Clayton { 1431481cef25SGreg Clayton SBStream frame_desc_strm; 1432481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 1433f028a1fbSGreg Clayton log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s", 1434324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), idx, 1435324a1036SSaleem Abdulrasool static_cast<void*>(frame_sp.get()), 1436324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1437f028a1fbSGreg Clayton } 1438f028a1fbSGreg Clayton return sb_frame; 1439f028a1fbSGreg Clayton } 1440f028a1fbSGreg Clayton 14414f465cffSJim Ingham bool 14424f465cffSJim Ingham SBThread::EventIsThreadEvent (const SBEvent &event) 14434f465cffSJim Ingham { 14444f465cffSJim Ingham return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL; 14454f465cffSJim Ingham } 14464f465cffSJim Ingham 14474f465cffSJim Ingham SBFrame 14484f465cffSJim Ingham SBThread::GetStackFrameFromEvent (const SBEvent &event) 14494f465cffSJim Ingham { 14504f465cffSJim Ingham return Thread::ThreadEventData::GetStackFrameFromEvent (event.get()); 14514f465cffSJim Ingham 14524f465cffSJim Ingham } 14534f465cffSJim Ingham 14544f465cffSJim Ingham SBThread 14554f465cffSJim Ingham SBThread::GetThreadFromEvent (const SBEvent &event) 14564f465cffSJim Ingham { 14574f465cffSJim Ingham return Thread::ThreadEventData::GetThreadFromEvent (event.get()); 14584f465cffSJim Ingham } 1459f028a1fbSGreg Clayton 146030fdc8d8SChris Lattner bool 146130fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const 146230fdc8d8SChris Lattner { 14637fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get(); 146430fdc8d8SChris Lattner } 146530fdc8d8SChris Lattner 146630fdc8d8SChris Lattner bool 146730fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const 146830fdc8d8SChris Lattner { 14697fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get(); 147030fdc8d8SChris Lattner } 1471dde9cff3SCaroline Tice 1472dde9cff3SCaroline Tice bool 14734f465cffSJim Ingham SBThread::GetStatus (SBStream &status) const 14744f465cffSJim Ingham { 14754f465cffSJim Ingham Stream &strm = status.ref(); 14764f465cffSJim Ingham 14774f465cffSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get()); 14784f465cffSJim Ingham if (exe_ctx.HasThreadScope()) 14794f465cffSJim Ingham { 14804f465cffSJim Ingham exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1); 14814f465cffSJim Ingham } 14824f465cffSJim Ingham else 14834f465cffSJim Ingham strm.PutCString ("No status"); 14844f465cffSJim Ingham 14854f465cffSJim Ingham return true; 14864f465cffSJim Ingham } 14874f465cffSJim Ingham 14884f465cffSJim Ingham bool 1489ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const 1490ceb6b139SCaroline Tice { 1491da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1492da7bc7d0SGreg Clayton 14937fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 14941ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1495ceb6b139SCaroline Tice { 1496603985fcSJim Ingham exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, LLDB_INVALID_THREAD_ID); 1497603985fcSJim Ingham //strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID()); 1498ceb6b139SCaroline Tice } 1499ceb6b139SCaroline Tice else 1500da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1501ceb6b139SCaroline Tice 1502ceb6b139SCaroline Tice return true; 1503ceb6b139SCaroline Tice } 15045dd4916fSJason Molenda 15055dd4916fSJason Molenda SBThread 1506008c45f1SJason Molenda SBThread::GetExtendedBacktraceThread (const char *type) 15075dd4916fSJason Molenda { 15085dd4916fSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15095dd4916fSJason Molenda Mutex::Locker api_locker; 15105dd4916fSJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 15115dd4916fSJason Molenda SBThread sb_origin_thread; 15125dd4916fSJason Molenda 15135dd4916fSJason Molenda if (exe_ctx.HasThreadScope()) 15145dd4916fSJason Molenda { 15155dd4916fSJason Molenda Process::StopLocker stop_locker; 15165dd4916fSJason Molenda if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 15175dd4916fSJason Molenda { 15187a2f7904SJason Molenda ThreadSP real_thread(exe_ctx.GetThreadSP()); 15195dd4916fSJason Molenda if (real_thread) 15205dd4916fSJason Molenda { 15215dd4916fSJason Molenda ConstString type_const (type); 15227a2f7904SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 15237a2f7904SJason Molenda if (process) 15247a2f7904SJason Molenda { 15257a2f7904SJason Molenda SystemRuntime *runtime = process->GetSystemRuntime(); 15265dd4916fSJason Molenda if (runtime) 15275dd4916fSJason Molenda { 1528008c45f1SJason Molenda ThreadSP new_thread_sp (runtime->GetExtendedBacktraceThread (real_thread, type_const)); 1529a6e9130dSJason Molenda if (new_thread_sp) 1530a6e9130dSJason Molenda { 15317a2f7904SJason Molenda // Save this in the Process' ExtendedThreadList so a strong pointer retains the 15327a2f7904SJason Molenda // object. 15337a2f7904SJason Molenda process->GetExtendedThreadList().AddThread (new_thread_sp); 15347a2f7904SJason Molenda sb_origin_thread.SetThread (new_thread_sp); 1535a6e9130dSJason Molenda if (log) 1536a6e9130dSJason Molenda { 1537a6e9130dSJason Molenda const char *queue_name = new_thread_sp->GetQueueName(); 1538a6e9130dSJason Molenda if (queue_name == NULL) 1539a6e9130dSJason Molenda queue_name = ""; 15402bdbfd50SJim Ingham log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => new extended Thread " 15412bdbfd50SJim Ingham "created (%p) with queue_id 0x%" PRIx64 " queue name '%s'", 1542324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr()), 1543324a1036SSaleem Abdulrasool static_cast<void*>(new_thread_sp.get()), 1544324a1036SSaleem Abdulrasool new_thread_sp->GetQueueID(), 1545324a1036SSaleem Abdulrasool queue_name); 1546a6e9130dSJason Molenda } 1547a6e9130dSJason Molenda } 15487a2f7904SJason Molenda } 15495dd4916fSJason Molenda } 15505dd4916fSJason Molenda } 15515dd4916fSJason Molenda } 15525dd4916fSJason Molenda else 15535dd4916fSJason Molenda { 15545dd4916fSJason Molenda if (log) 1555324a1036SSaleem Abdulrasool log->Printf ("SBThread(%p)::GetExtendedBacktraceThread() => error: process is running", 1556324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 15575dd4916fSJason Molenda } 15585dd4916fSJason Molenda } 15595dd4916fSJason Molenda 1560ac605f4aSJason Molenda if (log && sb_origin_thread.IsValid() == false) 1561324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a Valid thread", 1562324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetThreadPtr())); 15635dd4916fSJason Molenda return sb_origin_thread; 15645dd4916fSJason Molenda } 15658ee9cb58SJason Molenda 15668ee9cb58SJason Molenda uint32_t 15678ee9cb58SJason Molenda SBThread::GetExtendedBacktraceOriginatingIndexID () 15688ee9cb58SJason Molenda { 15698ee9cb58SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 15708ee9cb58SJason Molenda if (thread_sp) 15718ee9cb58SJason Molenda return thread_sp->GetExtendedBacktraceOriginatingIndexID(); 15728ee9cb58SJason Molenda return LLDB_INVALID_INDEX32; 15738ee9cb58SJason Molenda } 1574b4892cd2SJason Molenda 1575b4892cd2SJason Molenda bool 1576b4892cd2SJason Molenda SBThread::SafeToCallFunctions () 1577b4892cd2SJason Molenda { 1578b4892cd2SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1579b4892cd2SJason Molenda if (thread_sp) 1580b4892cd2SJason Molenda return thread_sp->SafeToCallFunctions(); 1581b4892cd2SJason Molenda return true; 1582b4892cd2SJason Molenda } 15832bdbfd50SJim Ingham 15842bdbfd50SJim Ingham lldb_private::Thread * 15852bdbfd50SJim Ingham SBThread::operator->() 15862bdbfd50SJim Ingham { 15872bdbfd50SJim Ingham ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 15882bdbfd50SJim Ingham if (thread_sp) 15892bdbfd50SJim Ingham return thread_sp.get(); 15902bdbfd50SJim Ingham else 15912bdbfd50SJim Ingham return NULL; 15922bdbfd50SJim Ingham } 15932bdbfd50SJim Ingham 15942bdbfd50SJim Ingham lldb_private::Thread * 15952bdbfd50SJim Ingham SBThread::get() 15962bdbfd50SJim Ingham { 15972bdbfd50SJim Ingham ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 15982bdbfd50SJim Ingham if (thread_sp) 15992bdbfd50SJim Ingham return thread_sp.get(); 16002bdbfd50SJim Ingham else 16012bdbfd50SJim Ingham return NULL; 16022bdbfd50SJim Ingham } 16032bdbfd50SJim Ingham 1604