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" 1730fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 1830fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 196611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 2030fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 2130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2230fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2330fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h" 24f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h" 2530fdc8d8SChris Lattner #include "lldb/Target/Target.h" 2630fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h" 2730fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h" 2830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h" 2930fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h" 3030fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInRange.h" 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner 334c5de699SEli Friedman #include "lldb/API/SBAddress.h" 344c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 354f465cffSJim Ingham #include "lldb/API/SBEvent.h" 3673ca05a2SJim Ingham #include "lldb/API/SBFrame.h" 374c5de699SEli Friedman #include "lldb/API/SBProcess.h" 3873ca05a2SJim Ingham #include "lldb/API/SBValue.h" 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner using namespace lldb; 4130fdc8d8SChris Lattner using namespace lldb_private; 4230fdc8d8SChris Lattner 434f465cffSJim Ingham const char * 444f465cffSJim Ingham SBThread::GetBroadcasterClassName () 454f465cffSJim Ingham { 464f465cffSJim Ingham return Thread::GetStaticBroadcasterClass().AsCString(); 474f465cffSJim Ingham } 484f465cffSJim Ingham 49cfd1acedSGreg Clayton //---------------------------------------------------------------------- 50cfd1acedSGreg Clayton // Constructors 51cfd1acedSGreg Clayton //---------------------------------------------------------------------- 5230fdc8d8SChris Lattner SBThread::SBThread () : 537fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) : 587fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef(lldb_object_sp)) 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 6292ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) : 637fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp)) 6430fdc8d8SChris Lattner { 657fdf9ef1SGreg Clayton 6630fdc8d8SChris Lattner } 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner //---------------------------------------------------------------------- 69cfd1acedSGreg Clayton // Assignment operator 70cfd1acedSGreg Clayton //---------------------------------------------------------------------- 71cfd1acedSGreg Clayton 72cfd1acedSGreg Clayton const lldb::SBThread & 73cfd1acedSGreg Clayton SBThread::operator = (const SBThread &rhs) 74cfd1acedSGreg Clayton { 75cfd1acedSGreg Clayton if (this != &rhs) 767fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 77cfd1acedSGreg Clayton return *this; 78cfd1acedSGreg Clayton } 79cfd1acedSGreg Clayton 80cfd1acedSGreg Clayton //---------------------------------------------------------------------- 8130fdc8d8SChris Lattner // Destructor 8230fdc8d8SChris Lattner //---------------------------------------------------------------------- 8330fdc8d8SChris Lattner SBThread::~SBThread() 8430fdc8d8SChris Lattner { 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 8730fdc8d8SChris Lattner bool 8830fdc8d8SChris Lattner SBThread::IsValid() const 8930fdc8d8SChris Lattner { 907fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() != NULL; 9130fdc8d8SChris Lattner } 9230fdc8d8SChris Lattner 9348e42549SGreg Clayton void 9448e42549SGreg Clayton SBThread::Clear () 9548e42549SGreg Clayton { 967fdf9ef1SGreg Clayton m_opaque_sp->Clear(); 9748e42549SGreg Clayton } 9848e42549SGreg Clayton 9948e42549SGreg Clayton 10030fdc8d8SChris Lattner StopReason 10130fdc8d8SChris Lattner SBThread::GetStopReason() 10230fdc8d8SChris Lattner { 1032d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 104ceb6b139SCaroline Tice 105ceb6b139SCaroline Tice StopReason reason = eStopReasonInvalid; 1064fc6cb9cSJim Ingham Mutex::Locker api_locker; 1074fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1084fc6cb9cSJim Ingham 1091ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 11030fdc8d8SChris Lattner { 1117fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1127fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1137fdf9ef1SGreg Clayton { 11497d5cf05SGreg Clayton return exe_ctx.GetThreadPtr()->GetStopReason(); 11530fdc8d8SChris Lattner } 116c9858e4dSGreg Clayton else 117c9858e4dSGreg Clayton { 118c9858e4dSGreg Clayton if (log) 119c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetStopReason() => error: process is running", exe_ctx.GetThreadPtr()); 120c9858e4dSGreg Clayton } 1217fdf9ef1SGreg Clayton } 122ceb6b139SCaroline Tice 123ceb6b139SCaroline Tice if (log) 1241ac04c30SGreg Clayton log->Printf ("SBThread(%p)::GetStopReason () => %s", exe_ctx.GetThreadPtr(), 125750cd175SCaroline Tice Thread::StopReasonAsCString (reason)); 126ceb6b139SCaroline Tice 127ceb6b139SCaroline Tice return reason; 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner 13030fdc8d8SChris Lattner size_t 1314e78f606SGreg Clayton SBThread::GetStopReasonDataCount () 1324e78f606SGreg Clayton { 1334fc6cb9cSJim Ingham Mutex::Locker api_locker; 1344fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1354fc6cb9cSJim Ingham 1361ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1374e78f606SGreg Clayton { 1387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1397fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1407fdf9ef1SGreg Clayton { 1411ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 1424e78f606SGreg Clayton if (stop_info_sp) 1434e78f606SGreg Clayton { 1444e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 1454e78f606SGreg Clayton switch (reason) 1464e78f606SGreg Clayton { 1474e78f606SGreg Clayton case eStopReasonInvalid: 1484e78f606SGreg Clayton case eStopReasonNone: 1494e78f606SGreg Clayton case eStopReasonTrace: 150*90ba8115SGreg Clayton case eStopReasonExec: 1514e78f606SGreg Clayton case eStopReasonPlanComplete: 1524e78f606SGreg Clayton // There is no data for these stop reasons. 1534e78f606SGreg Clayton return 0; 1544e78f606SGreg Clayton 1554e78f606SGreg Clayton case eStopReasonBreakpoint: 1564e78f606SGreg Clayton { 1574e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 1581ac04c30SGreg Clayton lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); 1594e78f606SGreg Clayton if (bp_site_sp) 1604e78f606SGreg Clayton return bp_site_sp->GetNumberOfOwners () * 2; 1614e78f606SGreg Clayton else 1624e78f606SGreg Clayton return 0; // Breakpoint must have cleared itself... 1634e78f606SGreg Clayton } 1644e78f606SGreg Clayton break; 1654e78f606SGreg Clayton 1664e78f606SGreg Clayton case eStopReasonWatchpoint: 167290fa41bSJohnny Chen return 1; 1684e78f606SGreg Clayton 1694e78f606SGreg Clayton case eStopReasonSignal: 1704e78f606SGreg Clayton return 1; 1714e78f606SGreg Clayton 1724e78f606SGreg Clayton case eStopReasonException: 1734e78f606SGreg Clayton return 1; 1744e78f606SGreg Clayton } 1754e78f606SGreg Clayton } 1764e78f606SGreg Clayton } 177c9858e4dSGreg Clayton else 178c9858e4dSGreg Clayton { 179c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 180c9858e4dSGreg Clayton if (log) 181c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running", exe_ctx.GetThreadPtr()); 182c9858e4dSGreg Clayton } 1837fdf9ef1SGreg Clayton } 1844e78f606SGreg Clayton return 0; 1854e78f606SGreg Clayton } 1864e78f606SGreg Clayton 1874e78f606SGreg Clayton uint64_t 1884e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx) 1894e78f606SGreg Clayton { 1904fc6cb9cSJim Ingham Mutex::Locker api_locker; 1914fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1924fc6cb9cSJim Ingham 1931ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1944e78f606SGreg Clayton { 1957fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1967fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1977fdf9ef1SGreg Clayton { 1981ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 1991ac04c30SGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 2004e78f606SGreg Clayton if (stop_info_sp) 2014e78f606SGreg Clayton { 2024e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 2034e78f606SGreg Clayton switch (reason) 2044e78f606SGreg Clayton { 2054e78f606SGreg Clayton case eStopReasonInvalid: 2064e78f606SGreg Clayton case eStopReasonNone: 2074e78f606SGreg Clayton case eStopReasonTrace: 208*90ba8115SGreg Clayton case eStopReasonExec: 2094e78f606SGreg Clayton case eStopReasonPlanComplete: 2104e78f606SGreg Clayton // There is no data for these stop reasons. 2114e78f606SGreg Clayton return 0; 2124e78f606SGreg Clayton 2134e78f606SGreg Clayton case eStopReasonBreakpoint: 2144e78f606SGreg Clayton { 2154e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 2161ac04c30SGreg Clayton lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id)); 2174e78f606SGreg Clayton if (bp_site_sp) 2184e78f606SGreg Clayton { 2194e78f606SGreg Clayton uint32_t bp_index = idx / 2; 2204e78f606SGreg Clayton BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index)); 2214e78f606SGreg Clayton if (bp_loc_sp) 2224e78f606SGreg Clayton { 2234e78f606SGreg Clayton if (bp_index & 1) 2244e78f606SGreg Clayton { 2254e78f606SGreg Clayton // Odd idx, return the breakpoint location ID 2264e78f606SGreg Clayton return bp_loc_sp->GetID(); 2274e78f606SGreg Clayton } 2284e78f606SGreg Clayton else 2294e78f606SGreg Clayton { 2304e78f606SGreg Clayton // Even idx, return the breakpoint ID 2314e78f606SGreg Clayton return bp_loc_sp->GetBreakpoint().GetID(); 2324e78f606SGreg Clayton } 2334e78f606SGreg Clayton } 2344e78f606SGreg Clayton } 2354e78f606SGreg Clayton return LLDB_INVALID_BREAK_ID; 2364e78f606SGreg Clayton } 2374e78f606SGreg Clayton break; 2384e78f606SGreg Clayton 2394e78f606SGreg Clayton case eStopReasonWatchpoint: 240290fa41bSJohnny Chen return stop_info_sp->GetValue(); 2414e78f606SGreg Clayton 2424e78f606SGreg Clayton case eStopReasonSignal: 2434e78f606SGreg Clayton return stop_info_sp->GetValue(); 2444e78f606SGreg Clayton 2454e78f606SGreg Clayton case eStopReasonException: 2464e78f606SGreg Clayton return stop_info_sp->GetValue(); 2474e78f606SGreg Clayton } 2484e78f606SGreg Clayton } 2494e78f606SGreg Clayton } 250c9858e4dSGreg Clayton else 251c9858e4dSGreg Clayton { 252c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 253c9858e4dSGreg Clayton if (log) 254c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running", exe_ctx.GetThreadPtr()); 255c9858e4dSGreg Clayton } 2567fdf9ef1SGreg Clayton } 2574e78f606SGreg Clayton return 0; 2584e78f606SGreg Clayton } 2594e78f606SGreg Clayton 2604e78f606SGreg Clayton size_t 26130fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len) 26230fdc8d8SChris Lattner { 2632d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 264ceb6b139SCaroline Tice 2654fc6cb9cSJim Ingham Mutex::Locker api_locker; 2664fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2674fc6cb9cSJim Ingham 2681ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 26930fdc8d8SChris Lattner { 2707fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2717fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2727fdf9ef1SGreg Clayton { 2737fdf9ef1SGreg Clayton 2741ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 275b15bfc75SJim Ingham if (stop_info_sp) 27630fdc8d8SChris Lattner { 277b15bfc75SJim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 27830fdc8d8SChris Lattner if (stop_desc) 27930fdc8d8SChris Lattner { 280ceb6b139SCaroline Tice if (log) 2814838131bSGreg Clayton log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"", 2821ac04c30SGreg Clayton exe_ctx.GetThreadPtr(), stop_desc); 28330fdc8d8SChris Lattner if (dst) 28430fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc); 28530fdc8d8SChris Lattner else 28630fdc8d8SChris Lattner { 28730fdc8d8SChris Lattner // NULL dst passed in, return the length needed to contain the description 28830fdc8d8SChris Lattner return ::strlen (stop_desc) + 1; // Include the NULL byte for size 28930fdc8d8SChris Lattner } 29030fdc8d8SChris Lattner } 29130fdc8d8SChris Lattner else 29230fdc8d8SChris Lattner { 29330fdc8d8SChris Lattner size_t stop_desc_len = 0; 294b15bfc75SJim Ingham switch (stop_info_sp->GetStopReason()) 29530fdc8d8SChris Lattner { 29630fdc8d8SChris Lattner case eStopReasonTrace: 29730fdc8d8SChris Lattner case eStopReasonPlanComplete: 29830fdc8d8SChris Lattner { 29930fdc8d8SChris Lattner static char trace_desc[] = "step"; 30030fdc8d8SChris Lattner stop_desc = trace_desc; 30130fdc8d8SChris Lattner stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size 30230fdc8d8SChris Lattner } 30330fdc8d8SChris Lattner break; 30430fdc8d8SChris Lattner 30530fdc8d8SChris Lattner case eStopReasonBreakpoint: 30630fdc8d8SChris Lattner { 30730fdc8d8SChris Lattner static char bp_desc[] = "breakpoint hit"; 30830fdc8d8SChris Lattner stop_desc = bp_desc; 30930fdc8d8SChris Lattner stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size 31030fdc8d8SChris Lattner } 31130fdc8d8SChris Lattner break; 31230fdc8d8SChris Lattner 31330fdc8d8SChris Lattner case eStopReasonWatchpoint: 31430fdc8d8SChris Lattner { 31530fdc8d8SChris Lattner static char wp_desc[] = "watchpoint hit"; 31630fdc8d8SChris Lattner stop_desc = wp_desc; 31730fdc8d8SChris Lattner stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner break; 32030fdc8d8SChris Lattner 32130fdc8d8SChris Lattner case eStopReasonSignal: 32230fdc8d8SChris Lattner { 3231ac04c30SGreg Clayton stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue()); 32430fdc8d8SChris Lattner if (stop_desc == NULL || stop_desc[0] == '\0') 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner static char signal_desc[] = "signal"; 32730fdc8d8SChris Lattner stop_desc = signal_desc; 32830fdc8d8SChris Lattner stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner break; 33230fdc8d8SChris Lattner 33330fdc8d8SChris Lattner case eStopReasonException: 33430fdc8d8SChris Lattner { 33530fdc8d8SChris Lattner char exc_desc[] = "exception"; 33630fdc8d8SChris Lattner stop_desc = exc_desc; 33730fdc8d8SChris Lattner stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 33830fdc8d8SChris Lattner } 33930fdc8d8SChris Lattner break; 340c982c768SGreg Clayton 341*90ba8115SGreg Clayton case eStopReasonExec: 342*90ba8115SGreg Clayton { 343*90ba8115SGreg Clayton char exc_desc[] = "exec"; 344*90ba8115SGreg Clayton stop_desc = exc_desc; 345*90ba8115SGreg Clayton stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 346*90ba8115SGreg Clayton } 347*90ba8115SGreg Clayton break; 348*90ba8115SGreg Clayton 349c982c768SGreg Clayton default: 350c982c768SGreg Clayton break; 35130fdc8d8SChris Lattner } 35230fdc8d8SChris Lattner 35330fdc8d8SChris Lattner if (stop_desc && stop_desc[0]) 35430fdc8d8SChris Lattner { 355ceb6b139SCaroline Tice if (log) 35693aa84e8SGreg Clayton log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'", 3571ac04c30SGreg Clayton exe_ctx.GetThreadPtr(), stop_desc); 358ceb6b139SCaroline Tice 35930fdc8d8SChris Lattner if (dst) 36030fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte 36130fdc8d8SChris Lattner 36230fdc8d8SChris Lattner if (stop_desc_len == 0) 36330fdc8d8SChris Lattner stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte 36430fdc8d8SChris Lattner 36530fdc8d8SChris Lattner return stop_desc_len; 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner } 36930fdc8d8SChris Lattner } 370c9858e4dSGreg Clayton else 371c9858e4dSGreg Clayton { 372c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 373c9858e4dSGreg Clayton if (log) 374c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running", exe_ctx.GetThreadPtr()); 375c9858e4dSGreg Clayton } 3767fdf9ef1SGreg Clayton } 37730fdc8d8SChris Lattner if (dst) 37830fdc8d8SChris Lattner *dst = 0; 37930fdc8d8SChris Lattner return 0; 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner 38273ca05a2SJim Ingham SBValue 38373ca05a2SJim Ingham SBThread::GetStopReturnValue () 38473ca05a2SJim Ingham { 385c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 38673ca05a2SJim Ingham ValueObjectSP return_valobj_sp; 3874fc6cb9cSJim Ingham Mutex::Locker api_locker; 3884fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3894fc6cb9cSJim Ingham 3901ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 39173ca05a2SJim Ingham { 3927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3937fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3947fdf9ef1SGreg Clayton { 3951ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo (); 39673ca05a2SJim Ingham if (stop_info_sp) 39773ca05a2SJim Ingham { 39873ca05a2SJim Ingham return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 39973ca05a2SJim Ingham } 40073ca05a2SJim Ingham } 401c9858e4dSGreg Clayton else 402c9858e4dSGreg Clayton { 403c9858e4dSGreg Clayton if (log) 404c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running", exe_ctx.GetThreadPtr()); 405c9858e4dSGreg Clayton } 4067fdf9ef1SGreg Clayton } 40773ca05a2SJim Ingham 40873ca05a2SJim Ingham if (log) 4091ac04c30SGreg Clayton log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", exe_ctx.GetThreadPtr(), 41073ca05a2SJim Ingham return_valobj_sp.get() 41173ca05a2SJim Ingham ? return_valobj_sp->GetValueAsCString() 41273ca05a2SJim Ingham : "<no return value>"); 41373ca05a2SJim Ingham 41473ca05a2SJim Ingham return SBValue (return_valobj_sp); 41573ca05a2SJim Ingham } 41673ca05a2SJim Ingham 41730fdc8d8SChris Lattner void 41830fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp) 41930fdc8d8SChris Lattner { 4207fdf9ef1SGreg Clayton m_opaque_sp->SetThreadSP (lldb_object_sp); 42130fdc8d8SChris Lattner } 42230fdc8d8SChris Lattner 42330fdc8d8SChris Lattner 42430fdc8d8SChris Lattner lldb::tid_t 42530fdc8d8SChris Lattner SBThread::GetThreadID () const 42630fdc8d8SChris Lattner { 4277fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 42817a6ad05SGreg Clayton if (thread_sp) 4291ac04c30SGreg Clayton return thread_sp->GetID(); 4301ac04c30SGreg Clayton return LLDB_INVALID_THREAD_ID; 43130fdc8d8SChris Lattner } 43230fdc8d8SChris Lattner 43330fdc8d8SChris Lattner uint32_t 43430fdc8d8SChris Lattner SBThread::GetIndexID () const 43530fdc8d8SChris Lattner { 4367fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 43717a6ad05SGreg Clayton if (thread_sp) 43817a6ad05SGreg Clayton return thread_sp->GetIndexID(); 43930fdc8d8SChris Lattner return LLDB_INVALID_INDEX32; 44030fdc8d8SChris Lattner } 4411ac04c30SGreg Clayton 44230fdc8d8SChris Lattner const char * 44330fdc8d8SChris Lattner SBThread::GetName () const 44430fdc8d8SChris Lattner { 445c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4464838131bSGreg Clayton const char *name = NULL; 4474fc6cb9cSJim Ingham Mutex::Locker api_locker; 4484fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4494fc6cb9cSJim Ingham 4501ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 451af67cecdSGreg Clayton { 4527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4537fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4547fdf9ef1SGreg Clayton { 4551ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetName(); 456af67cecdSGreg Clayton } 457c9858e4dSGreg Clayton else 458c9858e4dSGreg Clayton { 459c9858e4dSGreg Clayton if (log) 460c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetName() => error: process is running", exe_ctx.GetThreadPtr()); 461c9858e4dSGreg Clayton } 4627fdf9ef1SGreg Clayton } 463ceb6b139SCaroline Tice 464ceb6b139SCaroline Tice if (log) 4651ac04c30SGreg Clayton log->Printf ("SBThread(%p)::GetName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL"); 466ceb6b139SCaroline Tice 4674838131bSGreg Clayton return name; 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner const char * 47130fdc8d8SChris Lattner SBThread::GetQueueName () const 47230fdc8d8SChris Lattner { 4734838131bSGreg Clayton const char *name = NULL; 4744fc6cb9cSJim Ingham Mutex::Locker api_locker; 4754fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4764fc6cb9cSJim Ingham 477c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4781ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 479af67cecdSGreg Clayton { 4807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4817fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4827fdf9ef1SGreg Clayton { 4831ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetQueueName(); 484af67cecdSGreg Clayton } 485c9858e4dSGreg Clayton else 486c9858e4dSGreg Clayton { 487c9858e4dSGreg Clayton if (log) 488c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetQueueName() => error: process is running", exe_ctx.GetThreadPtr()); 489c9858e4dSGreg Clayton } 4907fdf9ef1SGreg Clayton } 491ceb6b139SCaroline Tice 492ceb6b139SCaroline Tice if (log) 4931ac04c30SGreg Clayton log->Printf ("SBThread(%p)::GetQueueName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL"); 494ceb6b139SCaroline Tice 4954838131bSGreg Clayton return name; 49630fdc8d8SChris Lattner } 49730fdc8d8SChris Lattner 49864e7ead1SJim Ingham SBError 49964e7ead1SJim Ingham SBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan) 50064e7ead1SJim Ingham { 50164e7ead1SJim Ingham SBError sb_error; 50264e7ead1SJim Ingham 50364e7ead1SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 50464e7ead1SJim Ingham if (!process) 50564e7ead1SJim Ingham { 50664e7ead1SJim Ingham sb_error.SetErrorString("No process in SBThread::ResumeNewPlan"); 50764e7ead1SJim Ingham return sb_error; 50864e7ead1SJim Ingham } 50964e7ead1SJim Ingham 51064e7ead1SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 51164e7ead1SJim Ingham if (!thread) 51264e7ead1SJim Ingham { 51364e7ead1SJim Ingham sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan"); 51464e7ead1SJim Ingham return sb_error; 51564e7ead1SJim Ingham } 51664e7ead1SJim Ingham 51764e7ead1SJim Ingham // User level plans should be Master Plans so they can be interrupted, other plans executed, and 51864e7ead1SJim Ingham // then a "continue" will resume the plan. 51964e7ead1SJim Ingham if (new_plan != NULL) 52064e7ead1SJim Ingham { 52164e7ead1SJim Ingham new_plan->SetIsMasterPlan(true); 52264e7ead1SJim Ingham new_plan->SetOkayToDiscard(false); 52364e7ead1SJim Ingham } 52464e7ead1SJim Ingham 52564e7ead1SJim Ingham // Why do we need to set the current thread by ID here??? 52664e7ead1SJim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 52764e7ead1SJim Ingham sb_error.ref() = process->Resume(); 52864e7ead1SJim Ingham 52964e7ead1SJim Ingham if (sb_error.Success()) 53064e7ead1SJim Ingham { 53164e7ead1SJim Ingham // If we are doing synchronous mode, then wait for the 53264e7ead1SJim Ingham // process to stop yet again! 53364e7ead1SJim Ingham if (process->GetTarget().GetDebugger().GetAsyncExecution () == false) 53464e7ead1SJim Ingham process->WaitForProcessToStop (NULL); 53564e7ead1SJim Ingham } 53664e7ead1SJim Ingham 53764e7ead1SJim Ingham return sb_error; 53864e7ead1SJim Ingham } 53930fdc8d8SChris Lattner 54030fdc8d8SChris Lattner void 54130fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads) 54230fdc8d8SChris Lattner { 5432d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 544ceb6b139SCaroline Tice 5454fc6cb9cSJim Ingham Mutex::Locker api_locker; 5464fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5474fc6cb9cSJim Ingham 54817a6ad05SGreg Clayton 549ceb6b139SCaroline Tice if (log) 5501ac04c30SGreg Clayton log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", exe_ctx.GetThreadPtr(), 551ceb6b139SCaroline Tice Thread::RunModeAsCString (stop_other_threads)); 552ceb6b139SCaroline Tice 5531ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 55430fdc8d8SChris Lattner { 5551ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 5567ba6e991SJim Ingham bool abort_other_plans = false; 5571ac04c30SGreg Clayton StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 55864e7ead1SJim Ingham ThreadPlan *new_plan = NULL; 55930fdc8d8SChris Lattner 56030fdc8d8SChris Lattner if (frame_sp) 56130fdc8d8SChris Lattner { 56230fdc8d8SChris Lattner if (frame_sp->HasDebugInformation ()) 56330fdc8d8SChris Lattner { 56430fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 56564e7ead1SJim Ingham new_plan = thread->QueueThreadPlanForStepRange (abort_other_plans, 56630fdc8d8SChris Lattner eStepTypeOver, 56730fdc8d8SChris Lattner sc.line_entry.range, 56830fdc8d8SChris Lattner sc, 569474966a4SGreg Clayton stop_other_threads, 570474966a4SGreg Clayton false); 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner } 57330fdc8d8SChris Lattner else 57430fdc8d8SChris Lattner { 57564e7ead1SJim Ingham new_plan = thread->QueueThreadPlanForStepSingleInstruction (true, 57630fdc8d8SChris Lattner abort_other_plans, 57730fdc8d8SChris Lattner stop_other_threads); 57830fdc8d8SChris Lattner } 57930fdc8d8SChris Lattner } 58030fdc8d8SChris Lattner 58164e7ead1SJim Ingham // This returns an error, we should use it! 58264e7ead1SJim Ingham ResumeNewPlan (exe_ctx, new_plan); 58330fdc8d8SChris Lattner } 58430fdc8d8SChris Lattner } 58530fdc8d8SChris Lattner 58630fdc8d8SChris Lattner void 58730fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads) 58830fdc8d8SChris Lattner { 5892d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 590ceb6b139SCaroline Tice 5914fc6cb9cSJim Ingham Mutex::Locker api_locker; 5924fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 59317a6ad05SGreg Clayton 59417a6ad05SGreg Clayton if (log) 5951ac04c30SGreg Clayton log->Printf ("SBThread(%p)::StepInto (stop_other_threads='%s')", exe_ctx.GetThreadPtr(), 59617a6ad05SGreg Clayton Thread::RunModeAsCString (stop_other_threads)); 5971ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 59830fdc8d8SChris Lattner { 5997ba6e991SJim Ingham bool abort_other_plans = false; 60030fdc8d8SChris Lattner 6011ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 6021ac04c30SGreg Clayton StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 60364e7ead1SJim Ingham ThreadPlan *new_plan = NULL; 60430fdc8d8SChris Lattner 60530fdc8d8SChris Lattner if (frame_sp && frame_sp->HasDebugInformation ()) 60630fdc8d8SChris Lattner { 607474966a4SGreg Clayton bool avoid_code_without_debug_info = true; 60830fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 60964e7ead1SJim Ingham new_plan = thread->QueueThreadPlanForStepRange (abort_other_plans, 61030fdc8d8SChris Lattner eStepTypeInto, 61130fdc8d8SChris Lattner sc.line_entry.range, 61230fdc8d8SChris Lattner sc, 613474966a4SGreg Clayton stop_other_threads, 614474966a4SGreg Clayton avoid_code_without_debug_info); 61530fdc8d8SChris Lattner } 61630fdc8d8SChris Lattner else 61730fdc8d8SChris Lattner { 61864e7ead1SJim Ingham new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, 61930fdc8d8SChris Lattner abort_other_plans, 62030fdc8d8SChris Lattner stop_other_threads); 62130fdc8d8SChris Lattner } 62230fdc8d8SChris Lattner 62364e7ead1SJim Ingham // This returns an error, we should use it! 62464e7ead1SJim Ingham ResumeNewPlan (exe_ctx, new_plan); 62530fdc8d8SChris Lattner } 62630fdc8d8SChris Lattner } 62730fdc8d8SChris Lattner 62830fdc8d8SChris Lattner void 62930fdc8d8SChris Lattner SBThread::StepOut () 63030fdc8d8SChris Lattner { 6312d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 632ceb6b139SCaroline Tice 6334fc6cb9cSJim Ingham Mutex::Locker api_locker; 6344fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6354fc6cb9cSJim Ingham 636ceb6b139SCaroline Tice 63717a6ad05SGreg Clayton if (log) 6381ac04c30SGreg Clayton log->Printf ("SBThread(%p)::StepOut ()", exe_ctx.GetThreadPtr()); 63917a6ad05SGreg Clayton 6401ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 64130fdc8d8SChris Lattner { 6427ba6e991SJim Ingham bool abort_other_plans = false; 64394b09246SJim Ingham bool stop_other_threads = false; 64430fdc8d8SChris Lattner 6451ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 6461ac04c30SGreg Clayton 64764e7ead1SJim Ingham ThreadPlan *new_plan = thread->QueueThreadPlanForStepOut (abort_other_plans, 648481cef25SGreg Clayton NULL, 649481cef25SGreg Clayton false, 650481cef25SGreg Clayton stop_other_threads, 651481cef25SGreg Clayton eVoteYes, 652481cef25SGreg Clayton eVoteNoOpinion, 653481cef25SGreg Clayton 0); 654481cef25SGreg Clayton 65564e7ead1SJim Ingham // This returns an error, we should use it! 65664e7ead1SJim Ingham ResumeNewPlan (exe_ctx, new_plan); 657481cef25SGreg Clayton } 658481cef25SGreg Clayton } 659481cef25SGreg Clayton 660481cef25SGreg Clayton void 661481cef25SGreg Clayton SBThread::StepOutOfFrame (lldb::SBFrame &sb_frame) 662481cef25SGreg Clayton { 663481cef25SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 664481cef25SGreg Clayton 6654fc6cb9cSJim Ingham Mutex::Locker api_locker; 6664fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6674fc6cb9cSJim Ingham 668b9556accSGreg Clayton StackFrameSP frame_sp (sb_frame.GetFrameSP()); 669481cef25SGreg Clayton if (log) 670481cef25SGreg Clayton { 671481cef25SGreg Clayton SBStream frame_desc_strm; 672481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 6731ac04c30SGreg Clayton log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData()); 674481cef25SGreg Clayton } 675481cef25SGreg Clayton 6761ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 677481cef25SGreg Clayton { 6787ba6e991SJim Ingham bool abort_other_plans = false; 67994b09246SJim Ingham bool stop_other_threads = false; 6801ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 681481cef25SGreg Clayton 68264e7ead1SJim Ingham ThreadPlan *new_plan = thread->QueueThreadPlanForStepOut (abort_other_plans, 683481cef25SGreg Clayton NULL, 684481cef25SGreg Clayton false, 685481cef25SGreg Clayton stop_other_threads, 686481cef25SGreg Clayton eVoteYes, 687481cef25SGreg Clayton eVoteNoOpinion, 688b9556accSGreg Clayton frame_sp->GetFrameIndex()); 68930fdc8d8SChris Lattner 69064e7ead1SJim Ingham // This returns an error, we should use it! 69164e7ead1SJim Ingham ResumeNewPlan (exe_ctx, new_plan); 69230fdc8d8SChris Lattner } 69330fdc8d8SChris Lattner } 69430fdc8d8SChris Lattner 69530fdc8d8SChris Lattner void 69630fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over) 69730fdc8d8SChris Lattner { 6982d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 699ceb6b139SCaroline Tice 7004fc6cb9cSJim Ingham Mutex::Locker api_locker; 7014fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7024fc6cb9cSJim Ingham 7031ac04c30SGreg Clayton 704ceb6b139SCaroline Tice 70517a6ad05SGreg Clayton if (log) 7061ac04c30SGreg Clayton log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", exe_ctx.GetThreadPtr(), step_over); 70717a6ad05SGreg Clayton 7081ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 70930fdc8d8SChris Lattner { 7101ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 71164e7ead1SJim Ingham ThreadPlan *new_plan = thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true); 71264e7ead1SJim Ingham 71364e7ead1SJim Ingham // This returns an error, we should use it! 71464e7ead1SJim Ingham ResumeNewPlan (exe_ctx, new_plan); 71530fdc8d8SChris Lattner } 71630fdc8d8SChris Lattner } 71730fdc8d8SChris Lattner 71830fdc8d8SChris Lattner void 71930fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr) 72030fdc8d8SChris Lattner { 7212d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 722ceb6b139SCaroline Tice 7234fc6cb9cSJim Ingham Mutex::Locker api_locker; 7244fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7254fc6cb9cSJim Ingham 726ceb6b139SCaroline Tice 72717a6ad05SGreg Clayton if (log) 728d01b2953SDaniel Malea log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", exe_ctx.GetThreadPtr(), addr); 72917a6ad05SGreg Clayton 7301ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 73130fdc8d8SChris Lattner { 7327ba6e991SJim Ingham bool abort_other_plans = false; 73330fdc8d8SChris Lattner bool stop_other_threads = true; 73430fdc8d8SChris Lattner 735e72dfb32SGreg Clayton Address target_addr (addr); 73630fdc8d8SChris Lattner 7371ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 7381ac04c30SGreg Clayton 73964e7ead1SJim Ingham ThreadPlan *new_plan = thread->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads); 74064e7ead1SJim Ingham 74164e7ead1SJim Ingham // This returns an error, we should use it! 74264e7ead1SJim Ingham ResumeNewPlan (exe_ctx, new_plan); 74330fdc8d8SChris Lattner } 74430fdc8d8SChris Lattner } 74530fdc8d8SChris Lattner 746481cef25SGreg Clayton SBError 747481cef25SGreg Clayton SBThread::StepOverUntil (lldb::SBFrame &sb_frame, 748481cef25SGreg Clayton lldb::SBFileSpec &sb_file_spec, 749481cef25SGreg Clayton uint32_t line) 750481cef25SGreg Clayton { 751481cef25SGreg Clayton SBError sb_error; 752481cef25SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 753481cef25SGreg Clayton char path[PATH_MAX]; 754481cef25SGreg Clayton 7554fc6cb9cSJim Ingham Mutex::Locker api_locker; 7564fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7574fc6cb9cSJim Ingham 758b9556accSGreg Clayton StackFrameSP frame_sp (sb_frame.GetFrameSP()); 75917a6ad05SGreg Clayton 760481cef25SGreg Clayton if (log) 761481cef25SGreg Clayton { 762481cef25SGreg Clayton SBStream frame_desc_strm; 763481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 764481cef25SGreg Clayton sb_file_spec->GetPath (path, sizeof(path)); 765481cef25SGreg Clayton log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)", 7661ac04c30SGreg Clayton exe_ctx.GetThreadPtr(), 767b9556accSGreg Clayton frame_sp.get(), 768481cef25SGreg Clayton frame_desc_strm.GetData(), 769481cef25SGreg Clayton path, line); 770481cef25SGreg Clayton } 771481cef25SGreg Clayton 7721ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 773481cef25SGreg Clayton { 7741ac04c30SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7751ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 776481cef25SGreg Clayton 777481cef25SGreg Clayton if (line == 0) 778481cef25SGreg Clayton { 779481cef25SGreg Clayton sb_error.SetErrorString("invalid line argument"); 780481cef25SGreg Clayton return sb_error; 781481cef25SGreg Clayton } 782481cef25SGreg Clayton 783b9556accSGreg Clayton if (!frame_sp) 784481cef25SGreg Clayton { 7851ac04c30SGreg Clayton frame_sp = thread->GetSelectedFrame (); 786481cef25SGreg Clayton if (!frame_sp) 7871ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex (0); 788481cef25SGreg Clayton } 789481cef25SGreg Clayton 790481cef25SGreg Clayton SymbolContext frame_sc; 791481cef25SGreg Clayton if (!frame_sp) 792481cef25SGreg Clayton { 793481cef25SGreg Clayton sb_error.SetErrorString("no valid frames in thread to step"); 794481cef25SGreg Clayton return sb_error; 795481cef25SGreg Clayton } 796481cef25SGreg Clayton 797481cef25SGreg Clayton // If we have a frame, get its line 798481cef25SGreg Clayton frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit | 799481cef25SGreg Clayton eSymbolContextFunction | 800481cef25SGreg Clayton eSymbolContextLineEntry | 801481cef25SGreg Clayton eSymbolContextSymbol ); 802481cef25SGreg Clayton 803481cef25SGreg Clayton if (frame_sc.comp_unit == NULL) 804481cef25SGreg Clayton { 805481cef25SGreg Clayton sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex()); 806481cef25SGreg Clayton return sb_error; 807481cef25SGreg Clayton } 808481cef25SGreg Clayton 809481cef25SGreg Clayton FileSpec step_file_spec; 810481cef25SGreg Clayton if (sb_file_spec.IsValid()) 811481cef25SGreg Clayton { 812481cef25SGreg Clayton // The file spec passed in was valid, so use it 813481cef25SGreg Clayton step_file_spec = sb_file_spec.ref(); 814481cef25SGreg Clayton } 815481cef25SGreg Clayton else 816481cef25SGreg Clayton { 817481cef25SGreg Clayton if (frame_sc.line_entry.IsValid()) 818481cef25SGreg Clayton step_file_spec = frame_sc.line_entry.file; 819481cef25SGreg Clayton else 820481cef25SGreg Clayton { 821481cef25SGreg Clayton sb_error.SetErrorString("invalid file argument or no file for frame"); 822481cef25SGreg Clayton return sb_error; 823481cef25SGreg Clayton } 824481cef25SGreg Clayton } 825481cef25SGreg Clayton 8269b70ddb3SJim Ingham // Grab the current function, then we will make sure the "until" address is 8279b70ddb3SJim Ingham // within the function. We discard addresses that are out of the current 8289b70ddb3SJim Ingham // function, and then if there are no addresses remaining, give an appropriate 8299b70ddb3SJim Ingham // error message. 8309b70ddb3SJim Ingham 8319b70ddb3SJim Ingham bool all_in_function = true; 8329b70ddb3SJim Ingham AddressRange fun_range = frame_sc.function->GetAddressRange(); 8339b70ddb3SJim Ingham 834481cef25SGreg Clayton std::vector<addr_t> step_over_until_addrs; 8357ba6e991SJim Ingham const bool abort_other_plans = false; 836c02e3344SJim Ingham const bool stop_other_threads = false; 837481cef25SGreg Clayton const bool check_inlines = true; 838481cef25SGreg Clayton const bool exact = false; 839481cef25SGreg Clayton 840481cef25SGreg Clayton SymbolContextList sc_list; 8419b70ddb3SJim Ingham const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec, 8429b70ddb3SJim Ingham line, 8439b70ddb3SJim Ingham check_inlines, 8449b70ddb3SJim Ingham exact, 8459b70ddb3SJim Ingham eSymbolContextLineEntry, 8469b70ddb3SJim Ingham sc_list); 847481cef25SGreg Clayton if (num_matches > 0) 848481cef25SGreg Clayton { 849481cef25SGreg Clayton SymbolContext sc; 850481cef25SGreg Clayton for (uint32_t i=0; i<num_matches; ++i) 851481cef25SGreg Clayton { 852481cef25SGreg Clayton if (sc_list.GetContextAtIndex(i, sc)) 853481cef25SGreg Clayton { 8549b70ddb3SJim Ingham addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target); 855481cef25SGreg Clayton if (step_addr != LLDB_INVALID_ADDRESS) 856481cef25SGreg Clayton { 8579b70ddb3SJim Ingham if (fun_range.ContainsLoadAddress(step_addr, target)) 858481cef25SGreg Clayton step_over_until_addrs.push_back(step_addr); 8599b70ddb3SJim Ingham else 8609b70ddb3SJim Ingham all_in_function = false; 861481cef25SGreg Clayton } 862481cef25SGreg Clayton } 863481cef25SGreg Clayton } 864481cef25SGreg Clayton } 865481cef25SGreg Clayton 866481cef25SGreg Clayton if (step_over_until_addrs.empty()) 867481cef25SGreg Clayton { 8689b70ddb3SJim Ingham if (all_in_function) 8699b70ddb3SJim Ingham { 870481cef25SGreg Clayton step_file_spec.GetPath (path, sizeof(path)); 871fd54b368SJason Molenda sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line); 872481cef25SGreg Clayton } 873481cef25SGreg Clayton else 87486edbf41SGreg Clayton sb_error.SetErrorString ("step until target not in current function"); 8759b70ddb3SJim Ingham } 8769b70ddb3SJim Ingham else 877481cef25SGreg Clayton { 87864e7ead1SJim Ingham ThreadPlan *new_plan = thread->QueueThreadPlanForStepUntil (abort_other_plans, 879481cef25SGreg Clayton &step_over_until_addrs[0], 880481cef25SGreg Clayton step_over_until_addrs.size(), 881481cef25SGreg Clayton stop_other_threads, 882481cef25SGreg Clayton frame_sp->GetFrameIndex()); 883481cef25SGreg Clayton 88464e7ead1SJim Ingham sb_error = ResumeNewPlan (exe_ctx, new_plan); 885481cef25SGreg Clayton } 886481cef25SGreg Clayton } 887481cef25SGreg Clayton else 888481cef25SGreg Clayton { 889481cef25SGreg Clayton sb_error.SetErrorString("this SBThread object is invalid"); 890481cef25SGreg Clayton } 891481cef25SGreg Clayton return sb_error; 892481cef25SGreg Clayton } 893481cef25SGreg Clayton 8944413758cSJim Ingham SBError 895cb640dd8SJim Ingham SBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value) 8964413758cSJim Ingham { 8974413758cSJim Ingham SBError sb_error; 8984413758cSJim Ingham 8994413758cSJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9004413758cSJim Ingham 9014413758cSJim Ingham Mutex::Locker api_locker; 9024413758cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9034413758cSJim Ingham 9044413758cSJim Ingham 9054413758cSJim Ingham if (log) 906cb640dd8SJim Ingham log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", exe_ctx.GetThreadPtr(), frame.GetFrameID()); 9074413758cSJim Ingham 9084413758cSJim Ingham if (exe_ctx.HasThreadScope()) 9094413758cSJim Ingham { 9104413758cSJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 911cb640dd8SJim Ingham sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP())); 9124413758cSJim Ingham } 9134413758cSJim Ingham 9144413758cSJim Ingham return sb_error; 9154413758cSJim Ingham } 9164413758cSJim Ingham 917481cef25SGreg Clayton 918722a0cdcSGreg Clayton bool 919722a0cdcSGreg Clayton SBThread::Suspend() 920722a0cdcSGreg Clayton { 921c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9227fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 923c9858e4dSGreg Clayton bool result = false; 9241ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 925722a0cdcSGreg Clayton { 926c9858e4dSGreg Clayton Process::StopLocker stop_locker; 927c9858e4dSGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 928c9858e4dSGreg Clayton { 9291ac04c30SGreg Clayton exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended); 930c9858e4dSGreg Clayton result = true; 931722a0cdcSGreg Clayton } 932c9858e4dSGreg Clayton else 933c9858e4dSGreg Clayton { 934c9858e4dSGreg Clayton if (log) 935c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::Suspend() => error: process is running", exe_ctx.GetThreadPtr()); 936c9858e4dSGreg Clayton } 937c9858e4dSGreg Clayton } 938c9858e4dSGreg Clayton if (log) 939c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::Suspend() => %i", exe_ctx.GetThreadPtr(), result); 940c9858e4dSGreg Clayton return result; 941722a0cdcSGreg Clayton } 942722a0cdcSGreg Clayton 943722a0cdcSGreg Clayton bool 944722a0cdcSGreg Clayton SBThread::Resume () 945722a0cdcSGreg Clayton { 946c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9477fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 948c9858e4dSGreg Clayton bool result = false; 9491ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 950722a0cdcSGreg Clayton { 951c9858e4dSGreg Clayton Process::StopLocker stop_locker; 952c9858e4dSGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 953c9858e4dSGreg Clayton { 9541ac04c30SGreg Clayton exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning); 955c9858e4dSGreg Clayton result = true; 956722a0cdcSGreg Clayton } 957c9858e4dSGreg Clayton else 958c9858e4dSGreg Clayton { 959c9858e4dSGreg Clayton if (log) 960c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::Resume() => error: process is running", exe_ctx.GetThreadPtr()); 961c9858e4dSGreg Clayton } 962c9858e4dSGreg Clayton } 963c9858e4dSGreg Clayton if (log) 964c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::Resume() => %i", exe_ctx.GetThreadPtr(), result); 965c9858e4dSGreg Clayton return result; 966722a0cdcSGreg Clayton } 967722a0cdcSGreg Clayton 968722a0cdcSGreg Clayton bool 969722a0cdcSGreg Clayton SBThread::IsSuspended() 970722a0cdcSGreg Clayton { 9717fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 9721ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 9731ac04c30SGreg Clayton return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended; 974722a0cdcSGreg Clayton return false; 975722a0cdcSGreg Clayton } 976722a0cdcSGreg Clayton 97730fdc8d8SChris Lattner SBProcess 97830fdc8d8SChris Lattner SBThread::GetProcess () 97930fdc8d8SChris Lattner { 980ceb6b139SCaroline Tice 981b9556accSGreg Clayton SBProcess sb_process; 982b9556accSGreg Clayton ProcessSP process_sp; 9837fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 9841ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 98530fdc8d8SChris Lattner { 98630fdc8d8SChris Lattner // Have to go up to the target so we can get a shared pointer to our process... 9871ac04c30SGreg Clayton sb_process.SetSP (exe_ctx.GetProcessSP()); 98830fdc8d8SChris Lattner } 989ceb6b139SCaroline Tice 9902d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 991ceb6b139SCaroline Tice if (log) 992ceb6b139SCaroline Tice { 993481cef25SGreg Clayton SBStream frame_desc_strm; 994b9556accSGreg Clayton sb_process.GetDescription (frame_desc_strm); 9951ac04c30SGreg Clayton log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", exe_ctx.GetThreadPtr(), 996b9556accSGreg Clayton process_sp.get(), frame_desc_strm.GetData()); 997ceb6b139SCaroline Tice } 998ceb6b139SCaroline Tice 999b9556accSGreg Clayton return sb_process; 100030fdc8d8SChris Lattner } 100130fdc8d8SChris Lattner 100230fdc8d8SChris Lattner uint32_t 100330fdc8d8SChris Lattner SBThread::GetNumFrames () 100430fdc8d8SChris Lattner { 10052d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1006ceb6b139SCaroline Tice 1007ceb6b139SCaroline Tice uint32_t num_frames = 0; 10084fc6cb9cSJim Ingham Mutex::Locker api_locker; 10094fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10104fc6cb9cSJim Ingham 10111ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1012af67cecdSGreg Clayton { 10137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10147fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10157fdf9ef1SGreg Clayton { 10161ac04c30SGreg Clayton num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount(); 1017af67cecdSGreg Clayton } 1018c9858e4dSGreg Clayton else 1019c9858e4dSGreg Clayton { 1020c9858e4dSGreg Clayton if (log) 1021c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", exe_ctx.GetThreadPtr()); 1022c9858e4dSGreg Clayton } 10237fdf9ef1SGreg Clayton } 1024ceb6b139SCaroline Tice 1025ceb6b139SCaroline Tice if (log) 10261ac04c30SGreg Clayton log->Printf ("SBThread(%p)::GetNumFrames () => %u", exe_ctx.GetThreadPtr(), num_frames); 1027ceb6b139SCaroline Tice 1028ceb6b139SCaroline Tice return num_frames; 102930fdc8d8SChris Lattner } 103030fdc8d8SChris Lattner 103130fdc8d8SChris Lattner SBFrame 103230fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx) 103330fdc8d8SChris Lattner { 10342d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1035ceb6b139SCaroline Tice 103630fdc8d8SChris Lattner SBFrame sb_frame; 1037b9556accSGreg Clayton StackFrameSP frame_sp; 10384fc6cb9cSJim Ingham Mutex::Locker api_locker; 10394fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10404fc6cb9cSJim Ingham 10411ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1042af67cecdSGreg Clayton { 10437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10447fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10457fdf9ef1SGreg Clayton { 10461ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx); 1047b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1048af67cecdSGreg Clayton } 1049c9858e4dSGreg Clayton else 1050c9858e4dSGreg Clayton { 1051c9858e4dSGreg Clayton if (log) 1052c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", exe_ctx.GetThreadPtr()); 1053c9858e4dSGreg Clayton } 10547fdf9ef1SGreg Clayton } 1055ceb6b139SCaroline Tice 1056ceb6b139SCaroline Tice if (log) 1057ceb6b139SCaroline Tice { 1058481cef25SGreg Clayton SBStream frame_desc_strm; 1059481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 10604838131bSGreg Clayton log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s", 10611ac04c30SGreg Clayton exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData()); 1062ceb6b139SCaroline Tice } 1063ceb6b139SCaroline Tice 106430fdc8d8SChris Lattner return sb_frame; 106530fdc8d8SChris Lattner } 106630fdc8d8SChris Lattner 1067f028a1fbSGreg Clayton lldb::SBFrame 1068f028a1fbSGreg Clayton SBThread::GetSelectedFrame () 1069f028a1fbSGreg Clayton { 1070f028a1fbSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1071f028a1fbSGreg Clayton 1072f028a1fbSGreg Clayton SBFrame sb_frame; 1073b9556accSGreg Clayton StackFrameSP frame_sp; 10744fc6cb9cSJim Ingham Mutex::Locker api_locker; 10754fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10764fc6cb9cSJim Ingham 10771ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1078af67cecdSGreg Clayton { 10797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10807fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10817fdf9ef1SGreg Clayton { 10821ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame (); 1083b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1084af67cecdSGreg Clayton } 1085c9858e4dSGreg Clayton else 1086c9858e4dSGreg Clayton { 1087c9858e4dSGreg Clayton if (log) 1088c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr()); 1089c9858e4dSGreg Clayton } 10907fdf9ef1SGreg Clayton } 1091f028a1fbSGreg Clayton 1092f028a1fbSGreg Clayton if (log) 1093f028a1fbSGreg Clayton { 1094481cef25SGreg Clayton SBStream frame_desc_strm; 1095481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 1096f028a1fbSGreg Clayton log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s", 10971ac04c30SGreg Clayton exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData()); 1098f028a1fbSGreg Clayton } 1099f028a1fbSGreg Clayton 1100f028a1fbSGreg Clayton return sb_frame; 1101f028a1fbSGreg Clayton } 1102f028a1fbSGreg Clayton 1103f028a1fbSGreg Clayton lldb::SBFrame 1104f028a1fbSGreg Clayton SBThread::SetSelectedFrame (uint32_t idx) 1105f028a1fbSGreg Clayton { 1106f028a1fbSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1107f028a1fbSGreg Clayton 1108f028a1fbSGreg Clayton SBFrame sb_frame; 1109b9556accSGreg Clayton StackFrameSP frame_sp; 11104fc6cb9cSJim Ingham Mutex::Locker api_locker; 11114fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11124fc6cb9cSJim Ingham 11131ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1114f028a1fbSGreg Clayton { 11157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11177fdf9ef1SGreg Clayton { 11181ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 11191ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex (idx); 1120f028a1fbSGreg Clayton if (frame_sp) 1121f028a1fbSGreg Clayton { 11221ac04c30SGreg Clayton thread->SetSelectedFrame (frame_sp.get()); 1123b9556accSGreg Clayton sb_frame.SetFrameSP (frame_sp); 1124f028a1fbSGreg Clayton } 1125f028a1fbSGreg Clayton } 1126c9858e4dSGreg Clayton else 1127c9858e4dSGreg Clayton { 1128c9858e4dSGreg Clayton if (log) 1129c9858e4dSGreg Clayton log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr()); 1130c9858e4dSGreg Clayton } 11317fdf9ef1SGreg Clayton } 1132f028a1fbSGreg Clayton 1133f028a1fbSGreg Clayton if (log) 1134f028a1fbSGreg Clayton { 1135481cef25SGreg Clayton SBStream frame_desc_strm; 1136481cef25SGreg Clayton sb_frame.GetDescription (frame_desc_strm); 1137f028a1fbSGreg Clayton log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s", 11381ac04c30SGreg Clayton exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData()); 1139f028a1fbSGreg Clayton } 1140f028a1fbSGreg Clayton return sb_frame; 1141f028a1fbSGreg Clayton } 1142f028a1fbSGreg Clayton 11434f465cffSJim Ingham bool 11444f465cffSJim Ingham SBThread::EventIsThreadEvent (const SBEvent &event) 11454f465cffSJim Ingham { 11464f465cffSJim Ingham return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL; 11474f465cffSJim Ingham } 11484f465cffSJim Ingham 11494f465cffSJim Ingham SBFrame 11504f465cffSJim Ingham SBThread::GetStackFrameFromEvent (const SBEvent &event) 11514f465cffSJim Ingham { 11524f465cffSJim Ingham return Thread::ThreadEventData::GetStackFrameFromEvent (event.get()); 11534f465cffSJim Ingham 11544f465cffSJim Ingham } 11554f465cffSJim Ingham 11564f465cffSJim Ingham SBThread 11574f465cffSJim Ingham SBThread::GetThreadFromEvent (const SBEvent &event) 11584f465cffSJim Ingham { 11594f465cffSJim Ingham return Thread::ThreadEventData::GetThreadFromEvent (event.get()); 11604f465cffSJim Ingham } 1161f028a1fbSGreg Clayton 116230fdc8d8SChris Lattner bool 116330fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const 116430fdc8d8SChris Lattner { 11657fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get(); 116630fdc8d8SChris Lattner } 116730fdc8d8SChris Lattner 116830fdc8d8SChris Lattner bool 116930fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const 117030fdc8d8SChris Lattner { 11717fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get(); 117230fdc8d8SChris Lattner } 1173dde9cff3SCaroline Tice 1174dde9cff3SCaroline Tice bool 11754f465cffSJim Ingham SBThread::GetStatus (SBStream &status) const 11764f465cffSJim Ingham { 11774f465cffSJim Ingham Stream &strm = status.ref(); 11784f465cffSJim Ingham 11794f465cffSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get()); 11804f465cffSJim Ingham if (exe_ctx.HasThreadScope()) 11814f465cffSJim Ingham { 11824f465cffSJim Ingham exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1); 11834f465cffSJim Ingham } 11844f465cffSJim Ingham else 11854f465cffSJim Ingham strm.PutCString ("No status"); 11864f465cffSJim Ingham 11874f465cffSJim Ingham return true; 11884f465cffSJim Ingham } 11894f465cffSJim Ingham 11904f465cffSJim Ingham bool 1191ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const 1192ceb6b139SCaroline Tice { 1193da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1194da7bc7d0SGreg Clayton 11957fdf9ef1SGreg Clayton ExecutionContext exe_ctx (m_opaque_sp.get()); 11961ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 1197ceb6b139SCaroline Tice { 1198d01b2953SDaniel Malea strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID()); 1199ceb6b139SCaroline Tice } 1200ceb6b139SCaroline Tice else 1201da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1202ceb6b139SCaroline Tice 1203ceb6b139SCaroline Tice return true; 1204ceb6b139SCaroline Tice } 1205