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/SBFrame.h"
354c5de699SEli Friedman #include "lldb/API/SBSourceManager.h"
364c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
374c5de699SEli Friedman #include "lldb/API/SBProcess.h"
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner using namespace lldb;
4030fdc8d8SChris Lattner using namespace lldb_private;
4130fdc8d8SChris Lattner 
42cfd1acedSGreg Clayton //----------------------------------------------------------------------
43cfd1acedSGreg Clayton // Constructors
44cfd1acedSGreg Clayton //----------------------------------------------------------------------
4530fdc8d8SChris Lattner SBThread::SBThread () :
466611103cSGreg Clayton     m_opaque_sp ()
4730fdc8d8SChris Lattner {
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) :
516611103cSGreg Clayton     m_opaque_sp (lldb_object_sp)
5230fdc8d8SChris Lattner {
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
5592ef5735SGreg Clayton SBThread::SBThread (const SBThread &rhs) :
5692ef5735SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5730fdc8d8SChris Lattner {
5830fdc8d8SChris Lattner }
5930fdc8d8SChris Lattner 
6030fdc8d8SChris Lattner //----------------------------------------------------------------------
61cfd1acedSGreg Clayton // Assignment operator
62cfd1acedSGreg Clayton //----------------------------------------------------------------------
63cfd1acedSGreg Clayton 
64cfd1acedSGreg Clayton const lldb::SBThread &
65cfd1acedSGreg Clayton SBThread::operator = (const SBThread &rhs)
66cfd1acedSGreg Clayton {
67cfd1acedSGreg Clayton     if (this != &rhs)
68cfd1acedSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
69cfd1acedSGreg Clayton     return *this;
70cfd1acedSGreg Clayton }
71cfd1acedSGreg Clayton 
72cfd1acedSGreg Clayton //----------------------------------------------------------------------
7330fdc8d8SChris Lattner // Destructor
7430fdc8d8SChris Lattner //----------------------------------------------------------------------
7530fdc8d8SChris Lattner SBThread::~SBThread()
7630fdc8d8SChris Lattner {
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner bool
8030fdc8d8SChris Lattner SBThread::IsValid() const
8130fdc8d8SChris Lattner {
826611103cSGreg Clayton     return m_opaque_sp != NULL;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
8548e42549SGreg Clayton void
8648e42549SGreg Clayton SBThread::Clear ()
8748e42549SGreg Clayton {
8848e42549SGreg Clayton     m_opaque_sp.reset();
8948e42549SGreg Clayton }
9048e42549SGreg Clayton 
9148e42549SGreg Clayton 
9230fdc8d8SChris Lattner StopReason
9330fdc8d8SChris Lattner SBThread::GetStopReason()
9430fdc8d8SChris Lattner {
952d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
96ceb6b139SCaroline Tice 
97ceb6b139SCaroline Tice     StopReason reason = eStopReasonInvalid;
986611103cSGreg Clayton     if (m_opaque_sp)
9930fdc8d8SChris Lattner     {
100af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
101b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
102b15bfc75SJim Ingham         if (stop_info_sp)
103ceb6b139SCaroline Tice             reason =  stop_info_sp->GetStopReason();
10430fdc8d8SChris Lattner     }
105ceb6b139SCaroline Tice 
106ceb6b139SCaroline Tice     if (log)
1074838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetStopReason () => %s", m_opaque_sp.get(),
108750cd175SCaroline Tice                      Thread::StopReasonAsCString (reason));
109ceb6b139SCaroline Tice 
110ceb6b139SCaroline Tice     return reason;
11130fdc8d8SChris Lattner }
11230fdc8d8SChris Lattner 
11330fdc8d8SChris Lattner size_t
1144e78f606SGreg Clayton SBThread::GetStopReasonDataCount ()
1154e78f606SGreg Clayton {
1164e78f606SGreg Clayton     if (m_opaque_sp)
1174e78f606SGreg Clayton     {
118af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
1194e78f606SGreg Clayton         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
1204e78f606SGreg Clayton         if (stop_info_sp)
1214e78f606SGreg Clayton         {
1224e78f606SGreg Clayton             StopReason reason = stop_info_sp->GetStopReason();
1234e78f606SGreg Clayton             switch (reason)
1244e78f606SGreg Clayton             {
1254e78f606SGreg Clayton             case eStopReasonInvalid:
1264e78f606SGreg Clayton             case eStopReasonNone:
1274e78f606SGreg Clayton             case eStopReasonTrace:
1284e78f606SGreg Clayton             case eStopReasonPlanComplete:
1294e78f606SGreg Clayton                 // There is no data for these stop reasons.
1304e78f606SGreg Clayton                 return 0;
1314e78f606SGreg Clayton 
1324e78f606SGreg Clayton             case eStopReasonBreakpoint:
1334e78f606SGreg Clayton                 {
1344e78f606SGreg Clayton                     break_id_t site_id = stop_info_sp->GetValue();
1354e78f606SGreg Clayton                     lldb::BreakpointSiteSP bp_site_sp (m_opaque_sp->GetProcess().GetBreakpointSiteList().FindByID (site_id));
1364e78f606SGreg Clayton                     if (bp_site_sp)
1374e78f606SGreg Clayton                         return bp_site_sp->GetNumberOfOwners () * 2;
1384e78f606SGreg Clayton                     else
1394e78f606SGreg Clayton                         return 0; // Breakpoint must have cleared itself...
1404e78f606SGreg Clayton                 }
1414e78f606SGreg Clayton                 break;
1424e78f606SGreg Clayton 
1434e78f606SGreg Clayton             case eStopReasonWatchpoint:
1444e78f606SGreg Clayton                 assert (!"implement watchpoint support in SBThread::GetStopReasonDataCount ()");
1454e78f606SGreg Clayton                 return 0; // We don't have watchpoint support yet...
1464e78f606SGreg Clayton 
1474e78f606SGreg Clayton             case eStopReasonSignal:
1484e78f606SGreg Clayton                 return 1;
1494e78f606SGreg Clayton 
1504e78f606SGreg Clayton             case eStopReasonException:
1514e78f606SGreg Clayton                 return 1;
1524e78f606SGreg Clayton             }
1534e78f606SGreg Clayton         }
1544e78f606SGreg Clayton     }
1554e78f606SGreg Clayton     return 0;
1564e78f606SGreg Clayton }
1574e78f606SGreg Clayton 
1584e78f606SGreg Clayton uint64_t
1594e78f606SGreg Clayton SBThread::GetStopReasonDataAtIndex (uint32_t idx)
1604e78f606SGreg Clayton {
1614e78f606SGreg Clayton     if (m_opaque_sp)
1624e78f606SGreg Clayton     {
163af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
1644e78f606SGreg Clayton         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
1654e78f606SGreg Clayton         if (stop_info_sp)
1664e78f606SGreg Clayton         {
1674e78f606SGreg Clayton             StopReason reason = stop_info_sp->GetStopReason();
1684e78f606SGreg Clayton             switch (reason)
1694e78f606SGreg Clayton             {
1704e78f606SGreg Clayton             case eStopReasonInvalid:
1714e78f606SGreg Clayton             case eStopReasonNone:
1724e78f606SGreg Clayton             case eStopReasonTrace:
1734e78f606SGreg Clayton             case eStopReasonPlanComplete:
1744e78f606SGreg Clayton                 // There is no data for these stop reasons.
1754e78f606SGreg Clayton                 return 0;
1764e78f606SGreg Clayton 
1774e78f606SGreg Clayton             case eStopReasonBreakpoint:
1784e78f606SGreg Clayton                 {
1794e78f606SGreg Clayton                     break_id_t site_id = stop_info_sp->GetValue();
1804e78f606SGreg Clayton                     lldb::BreakpointSiteSP bp_site_sp (m_opaque_sp->GetProcess().GetBreakpointSiteList().FindByID (site_id));
1814e78f606SGreg Clayton                     if (bp_site_sp)
1824e78f606SGreg Clayton                     {
1834e78f606SGreg Clayton                         uint32_t bp_index = idx / 2;
1844e78f606SGreg Clayton                         BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
1854e78f606SGreg Clayton                         if (bp_loc_sp)
1864e78f606SGreg Clayton                         {
1874e78f606SGreg Clayton                             if (bp_index & 1)
1884e78f606SGreg Clayton                             {
1894e78f606SGreg Clayton                                 // Odd idx, return the breakpoint location ID
1904e78f606SGreg Clayton                                 return bp_loc_sp->GetID();
1914e78f606SGreg Clayton                             }
1924e78f606SGreg Clayton                             else
1934e78f606SGreg Clayton                             {
1944e78f606SGreg Clayton                                 // Even idx, return the breakpoint ID
1954e78f606SGreg Clayton                                 return bp_loc_sp->GetBreakpoint().GetID();
1964e78f606SGreg Clayton                             }
1974e78f606SGreg Clayton                         }
1984e78f606SGreg Clayton                     }
1994e78f606SGreg Clayton                     return LLDB_INVALID_BREAK_ID;
2004e78f606SGreg Clayton                 }
2014e78f606SGreg Clayton                 break;
2024e78f606SGreg Clayton 
2034e78f606SGreg Clayton             case eStopReasonWatchpoint:
2044e78f606SGreg Clayton                 assert (!"implement watchpoint support in SBThread::GetStopReasonDataCount ()");
2054e78f606SGreg Clayton                 return 0; // We don't have watchpoint support yet...
2064e78f606SGreg Clayton 
2074e78f606SGreg Clayton             case eStopReasonSignal:
2084e78f606SGreg Clayton                 return stop_info_sp->GetValue();
2094e78f606SGreg Clayton 
2104e78f606SGreg Clayton             case eStopReasonException:
2114e78f606SGreg Clayton                 return stop_info_sp->GetValue();
2124e78f606SGreg Clayton             }
2134e78f606SGreg Clayton         }
2144e78f606SGreg Clayton     }
2154e78f606SGreg Clayton     return 0;
2164e78f606SGreg Clayton }
2174e78f606SGreg Clayton 
2184e78f606SGreg Clayton size_t
21930fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len)
22030fdc8d8SChris Lattner {
2212d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
222ceb6b139SCaroline Tice 
2236611103cSGreg Clayton     if (m_opaque_sp)
22430fdc8d8SChris Lattner     {
225af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
226b15bfc75SJim Ingham         StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo ();
227b15bfc75SJim Ingham         if (stop_info_sp)
22830fdc8d8SChris Lattner         {
229b15bfc75SJim Ingham             const char *stop_desc = stop_info_sp->GetDescription();
23030fdc8d8SChris Lattner             if (stop_desc)
23130fdc8d8SChris Lattner             {
232ceb6b139SCaroline Tice                 if (log)
2334838131bSGreg Clayton                     log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
234750cd175SCaroline Tice                                  m_opaque_sp.get(), stop_desc);
23530fdc8d8SChris Lattner                 if (dst)
23630fdc8d8SChris Lattner                     return ::snprintf (dst, dst_len, "%s", stop_desc);
23730fdc8d8SChris Lattner                 else
23830fdc8d8SChris Lattner                 {
23930fdc8d8SChris Lattner                     // NULL dst passed in, return the length needed to contain the description
24030fdc8d8SChris Lattner                     return ::strlen (stop_desc) + 1; // Include the NULL byte for size
24130fdc8d8SChris Lattner                 }
24230fdc8d8SChris Lattner             }
24330fdc8d8SChris Lattner             else
24430fdc8d8SChris Lattner             {
24530fdc8d8SChris Lattner                 size_t stop_desc_len = 0;
246b15bfc75SJim Ingham                 switch (stop_info_sp->GetStopReason())
24730fdc8d8SChris Lattner                 {
24830fdc8d8SChris Lattner                 case eStopReasonTrace:
24930fdc8d8SChris Lattner                 case eStopReasonPlanComplete:
25030fdc8d8SChris Lattner                     {
25130fdc8d8SChris Lattner                         static char trace_desc[] = "step";
25230fdc8d8SChris Lattner                         stop_desc = trace_desc;
25330fdc8d8SChris Lattner                         stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
25430fdc8d8SChris Lattner                     }
25530fdc8d8SChris Lattner                     break;
25630fdc8d8SChris Lattner 
25730fdc8d8SChris Lattner                 case eStopReasonBreakpoint:
25830fdc8d8SChris Lattner                     {
25930fdc8d8SChris Lattner                         static char bp_desc[] = "breakpoint hit";
26030fdc8d8SChris Lattner                         stop_desc = bp_desc;
26130fdc8d8SChris Lattner                         stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
26230fdc8d8SChris Lattner                     }
26330fdc8d8SChris Lattner                     break;
26430fdc8d8SChris Lattner 
26530fdc8d8SChris Lattner                 case eStopReasonWatchpoint:
26630fdc8d8SChris Lattner                     {
26730fdc8d8SChris Lattner                         static char wp_desc[] = "watchpoint hit";
26830fdc8d8SChris Lattner                         stop_desc = wp_desc;
26930fdc8d8SChris Lattner                         stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
27030fdc8d8SChris Lattner                     }
27130fdc8d8SChris Lattner                     break;
27230fdc8d8SChris Lattner 
27330fdc8d8SChris Lattner                 case eStopReasonSignal:
27430fdc8d8SChris Lattner                     {
275b15bfc75SJim Ingham                         stop_desc = m_opaque_sp->GetProcess().GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
27630fdc8d8SChris Lattner                         if (stop_desc == NULL || stop_desc[0] == '\0')
27730fdc8d8SChris Lattner                         {
27830fdc8d8SChris Lattner                             static char signal_desc[] = "signal";
27930fdc8d8SChris Lattner                             stop_desc = signal_desc;
28030fdc8d8SChris Lattner                             stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
28130fdc8d8SChris Lattner                         }
28230fdc8d8SChris Lattner                     }
28330fdc8d8SChris Lattner                     break;
28430fdc8d8SChris Lattner 
28530fdc8d8SChris Lattner                 case eStopReasonException:
28630fdc8d8SChris Lattner                     {
28730fdc8d8SChris Lattner                         char exc_desc[] = "exception";
28830fdc8d8SChris Lattner                         stop_desc = exc_desc;
28930fdc8d8SChris Lattner                         stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
29030fdc8d8SChris Lattner                     }
29130fdc8d8SChris Lattner                     break;
292c982c768SGreg Clayton 
293c982c768SGreg Clayton                 default:
294c982c768SGreg Clayton                     break;
29530fdc8d8SChris Lattner                 }
29630fdc8d8SChris Lattner 
29730fdc8d8SChris Lattner                 if (stop_desc && stop_desc[0])
29830fdc8d8SChris Lattner                 {
299ceb6b139SCaroline Tice                     if (log)
30093aa84e8SGreg Clayton                         log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
301750cd175SCaroline Tice                                      m_opaque_sp.get(), stop_desc);
302ceb6b139SCaroline Tice 
30330fdc8d8SChris Lattner                     if (dst)
30430fdc8d8SChris Lattner                         return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
30530fdc8d8SChris Lattner 
30630fdc8d8SChris Lattner                     if (stop_desc_len == 0)
30730fdc8d8SChris Lattner                         stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
30830fdc8d8SChris Lattner 
30930fdc8d8SChris Lattner                     return stop_desc_len;
31030fdc8d8SChris Lattner                 }
31130fdc8d8SChris Lattner             }
31230fdc8d8SChris Lattner         }
31330fdc8d8SChris Lattner     }
31430fdc8d8SChris Lattner     if (dst)
31530fdc8d8SChris Lattner         *dst = 0;
31630fdc8d8SChris Lattner     return 0;
31730fdc8d8SChris Lattner }
31830fdc8d8SChris Lattner 
31930fdc8d8SChris Lattner void
32030fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp)
32130fdc8d8SChris Lattner {
3226611103cSGreg Clayton     m_opaque_sp = lldb_object_sp;
32330fdc8d8SChris Lattner }
32430fdc8d8SChris Lattner 
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner lldb::tid_t
32730fdc8d8SChris Lattner SBThread::GetThreadID () const
32830fdc8d8SChris Lattner {
3292d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
330ceb6b139SCaroline Tice 
331af67cecdSGreg Clayton     lldb::tid_t tid = LLDB_INVALID_THREAD_ID;
3326611103cSGreg Clayton     if (m_opaque_sp)
333af67cecdSGreg Clayton         tid = m_opaque_sp->GetID();
334ceb6b139SCaroline Tice 
335ceb6b139SCaroline Tice     if (log)
336af67cecdSGreg Clayton         log->Printf ("SBThread(%p)::GetThreadID () => 0x%4.4x", m_opaque_sp.get(), tid);
337ceb6b139SCaroline Tice 
338af67cecdSGreg Clayton     return tid;
33930fdc8d8SChris Lattner }
34030fdc8d8SChris Lattner 
34130fdc8d8SChris Lattner uint32_t
34230fdc8d8SChris Lattner SBThread::GetIndexID () const
34330fdc8d8SChris Lattner {
3446611103cSGreg Clayton     if (m_opaque_sp)
3456611103cSGreg Clayton         return m_opaque_sp->GetIndexID();
34630fdc8d8SChris Lattner     return LLDB_INVALID_INDEX32;
34730fdc8d8SChris Lattner }
34830fdc8d8SChris Lattner const char *
34930fdc8d8SChris Lattner SBThread::GetName () const
35030fdc8d8SChris Lattner {
3514838131bSGreg Clayton     const char *name = NULL;
3526611103cSGreg Clayton     if (m_opaque_sp)
353af67cecdSGreg Clayton     {
354af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
3554838131bSGreg Clayton         name = m_opaque_sp->GetName();
356af67cecdSGreg Clayton     }
357ceb6b139SCaroline Tice 
3582d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
359ceb6b139SCaroline Tice     if (log)
3604838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetName () => %s", m_opaque_sp.get(), name ? name : "NULL");
361ceb6b139SCaroline Tice 
3624838131bSGreg Clayton     return name;
36330fdc8d8SChris Lattner }
36430fdc8d8SChris Lattner 
36530fdc8d8SChris Lattner const char *
36630fdc8d8SChris Lattner SBThread::GetQueueName () const
36730fdc8d8SChris Lattner {
3684838131bSGreg Clayton     const char *name = NULL;
3696611103cSGreg Clayton     if (m_opaque_sp)
370af67cecdSGreg Clayton     {
371af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
3724838131bSGreg Clayton         name = m_opaque_sp->GetQueueName();
373af67cecdSGreg Clayton     }
374ceb6b139SCaroline Tice 
3752d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
376ceb6b139SCaroline Tice     if (log)
3774838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetQueueName () => %s", m_opaque_sp.get(), name ? name : "NULL");
378ceb6b139SCaroline Tice 
3794838131bSGreg Clayton     return name;
38030fdc8d8SChris Lattner }
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner 
38330fdc8d8SChris Lattner void
38430fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads)
38530fdc8d8SChris Lattner {
3862d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
387ceb6b139SCaroline Tice 
388ceb6b139SCaroline Tice     if (log)
38993aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", m_opaque_sp.get(),
390ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
391ceb6b139SCaroline Tice 
3926611103cSGreg Clayton     if (m_opaque_sp)
39330fdc8d8SChris Lattner     {
394af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
39530fdc8d8SChris Lattner         bool abort_other_plans = true;
3966611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
39730fdc8d8SChris Lattner 
39830fdc8d8SChris Lattner         if (frame_sp)
39930fdc8d8SChris Lattner         {
40030fdc8d8SChris Lattner             if (frame_sp->HasDebugInformation ())
40130fdc8d8SChris Lattner             {
40230fdc8d8SChris Lattner                 SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
4036611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
40430fdc8d8SChris Lattner                                                           eStepTypeOver,
40530fdc8d8SChris Lattner                                                           sc.line_entry.range,
40630fdc8d8SChris Lattner                                                           sc,
407474966a4SGreg Clayton                                                           stop_other_threads,
408474966a4SGreg Clayton                                                           false);
40930fdc8d8SChris Lattner 
41030fdc8d8SChris Lattner             }
41130fdc8d8SChris Lattner             else
41230fdc8d8SChris Lattner             {
4136611103cSGreg Clayton                 m_opaque_sp->QueueThreadPlanForStepSingleInstruction (true,
41430fdc8d8SChris Lattner                                                                       abort_other_plans,
41530fdc8d8SChris Lattner                                                                       stop_other_threads);
41630fdc8d8SChris Lattner             }
41730fdc8d8SChris Lattner         }
41830fdc8d8SChris Lattner 
4196611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
42030fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
4212976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4225d5028b5SGreg Clayton         Error error (process.Resume());
4235d5028b5SGreg Clayton         if (error.Success())
4245d5028b5SGreg Clayton         {
4255d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4265d5028b5SGreg Clayton             // process to stop yet again!
4275d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4285d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4295d5028b5SGreg Clayton         }
43030fdc8d8SChris Lattner     }
43130fdc8d8SChris Lattner }
43230fdc8d8SChris Lattner 
43330fdc8d8SChris Lattner void
43430fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads)
43530fdc8d8SChris Lattner {
4362d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
437ceb6b139SCaroline Tice 
438ceb6b139SCaroline Tice     if (log)
43993aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInto (stop_other_threads='%s')", m_opaque_sp.get(),
440ceb6b139SCaroline Tice                      Thread::RunModeAsCString (stop_other_threads));
441ceb6b139SCaroline Tice 
4426611103cSGreg Clayton     if (m_opaque_sp)
44330fdc8d8SChris Lattner     {
444af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
44530fdc8d8SChris Lattner         bool abort_other_plans = true;
44630fdc8d8SChris Lattner 
4476611103cSGreg Clayton         StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0));
44830fdc8d8SChris Lattner 
44930fdc8d8SChris Lattner         if (frame_sp && frame_sp->HasDebugInformation ())
45030fdc8d8SChris Lattner         {
451474966a4SGreg Clayton             bool avoid_code_without_debug_info = true;
45230fdc8d8SChris Lattner             SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
4536611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans,
45430fdc8d8SChris Lattner                                                       eStepTypeInto,
45530fdc8d8SChris Lattner                                                       sc.line_entry.range,
45630fdc8d8SChris Lattner                                                       sc,
457474966a4SGreg Clayton                                                       stop_other_threads,
458474966a4SGreg Clayton                                                       avoid_code_without_debug_info);
45930fdc8d8SChris Lattner         }
46030fdc8d8SChris Lattner         else
46130fdc8d8SChris Lattner         {
4626611103cSGreg Clayton             m_opaque_sp->QueueThreadPlanForStepSingleInstruction (false,
46330fdc8d8SChris Lattner                                                                   abort_other_plans,
46430fdc8d8SChris Lattner                                                                   stop_other_threads);
46530fdc8d8SChris Lattner         }
46630fdc8d8SChris Lattner 
4676611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
46830fdc8d8SChris Lattner         // Why do we need to set the current thread by ID here???
4692976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4705d5028b5SGreg Clayton         Error error (process.Resume());
4715d5028b5SGreg Clayton         if (error.Success())
4725d5028b5SGreg Clayton         {
4735d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
4745d5028b5SGreg Clayton             // process to stop yet again!
4755d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
4765d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
4775d5028b5SGreg Clayton         }
47830fdc8d8SChris Lattner     }
47930fdc8d8SChris Lattner }
48030fdc8d8SChris Lattner 
48130fdc8d8SChris Lattner void
48230fdc8d8SChris Lattner SBThread::StepOut ()
48330fdc8d8SChris Lattner {
4842d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
485ceb6b139SCaroline Tice 
486ceb6b139SCaroline Tice     if (log)
4874838131bSGreg Clayton         log->Printf ("SBThread(%p)::StepOut ()", m_opaque_sp.get());
488ceb6b139SCaroline Tice 
4896611103cSGreg Clayton     if (m_opaque_sp)
49030fdc8d8SChris Lattner     {
491af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
49230fdc8d8SChris Lattner         bool abort_other_plans = true;
49330fdc8d8SChris Lattner         bool stop_other_threads = true;
49430fdc8d8SChris Lattner 
4956611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, stop_other_threads, eVoteYes, eVoteNoOpinion);
49630fdc8d8SChris Lattner 
4976611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
4982976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
4995d5028b5SGreg Clayton         Error error (process.Resume());
5005d5028b5SGreg Clayton         if (error.Success())
5015d5028b5SGreg Clayton         {
5025d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
5035d5028b5SGreg Clayton             // process to stop yet again!
5045d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
5055d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
5065d5028b5SGreg Clayton         }
50730fdc8d8SChris Lattner     }
50830fdc8d8SChris Lattner }
50930fdc8d8SChris Lattner 
51030fdc8d8SChris Lattner void
51130fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over)
51230fdc8d8SChris Lattner {
5132d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
514ceb6b139SCaroline Tice 
515ceb6b139SCaroline Tice     if (log)
51693aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", m_opaque_sp.get(), step_over);
517ceb6b139SCaroline Tice 
5186611103cSGreg Clayton     if (m_opaque_sp)
51930fdc8d8SChris Lattner     {
520af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
5216611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForStepSingleInstruction (step_over, true, true);
5226611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
5232976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
5245d5028b5SGreg Clayton         Error error (process.Resume());
5255d5028b5SGreg Clayton         if (error.Success())
5265d5028b5SGreg Clayton         {
5275d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
5285d5028b5SGreg Clayton             // process to stop yet again!
5295d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
5305d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
5315d5028b5SGreg Clayton         }
53230fdc8d8SChris Lattner     }
53330fdc8d8SChris Lattner }
53430fdc8d8SChris Lattner 
53530fdc8d8SChris Lattner void
53630fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr)
53730fdc8d8SChris Lattner {
5382d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
539ceb6b139SCaroline Tice 
540ceb6b139SCaroline Tice     if (log)
54193aa84e8SGreg Clayton         log->Printf ("SBThread(%p)::RunToAddress (addr=0x%llx)", m_opaque_sp.get(), addr);
542ceb6b139SCaroline Tice 
5436611103cSGreg Clayton     if (m_opaque_sp)
54430fdc8d8SChris Lattner     {
54530fdc8d8SChris Lattner         bool abort_other_plans = true;
54630fdc8d8SChris Lattner         bool stop_other_threads = true;
54730fdc8d8SChris Lattner 
54830fdc8d8SChris Lattner         Address target_addr (NULL, addr);
54930fdc8d8SChris Lattner 
5506611103cSGreg Clayton         m_opaque_sp->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads);
5516611103cSGreg Clayton         Process &process = m_opaque_sp->GetProcess();
5522976d00aSJim Ingham         process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID());
5535d5028b5SGreg Clayton         Error error (process.Resume());
5545d5028b5SGreg Clayton         if (error.Success())
5555d5028b5SGreg Clayton         {
5565d5028b5SGreg Clayton             // If we are doing synchronous mode, then wait for the
5575d5028b5SGreg Clayton             // process to stop yet again!
5585d5028b5SGreg Clayton             if (process.GetTarget().GetDebugger().GetAsyncExecution () == false)
5595d5028b5SGreg Clayton                 process.WaitForProcessToStop (NULL);
5605d5028b5SGreg Clayton         }
56130fdc8d8SChris Lattner     }
56230fdc8d8SChris Lattner 
56330fdc8d8SChris Lattner }
56430fdc8d8SChris Lattner 
565*722a0cdcSGreg Clayton bool
566*722a0cdcSGreg Clayton SBThread::Suspend()
567*722a0cdcSGreg Clayton {
568*722a0cdcSGreg Clayton     if (m_opaque_sp)
569*722a0cdcSGreg Clayton     {
570*722a0cdcSGreg Clayton         m_opaque_sp->SetResumeState (eStateSuspended);
571*722a0cdcSGreg Clayton         return true;
572*722a0cdcSGreg Clayton     }
573*722a0cdcSGreg Clayton     return false;
574*722a0cdcSGreg Clayton }
575*722a0cdcSGreg Clayton 
576*722a0cdcSGreg Clayton bool
577*722a0cdcSGreg Clayton SBThread::Resume ()
578*722a0cdcSGreg Clayton {
579*722a0cdcSGreg Clayton     if (m_opaque_sp)
580*722a0cdcSGreg Clayton     {
581*722a0cdcSGreg Clayton         m_opaque_sp->SetResumeState (eStateRunning);
582*722a0cdcSGreg Clayton         return true;
583*722a0cdcSGreg Clayton     }
584*722a0cdcSGreg Clayton     return false;
585*722a0cdcSGreg Clayton }
586*722a0cdcSGreg Clayton 
587*722a0cdcSGreg Clayton bool
588*722a0cdcSGreg Clayton SBThread::IsSuspended()
589*722a0cdcSGreg Clayton {
590*722a0cdcSGreg Clayton     if (m_opaque_sp)
591*722a0cdcSGreg Clayton         m_opaque_sp->GetResumeState () == eStateSuspended;
592*722a0cdcSGreg Clayton     return false;
593*722a0cdcSGreg Clayton }
594*722a0cdcSGreg Clayton 
59530fdc8d8SChris Lattner SBProcess
59630fdc8d8SChris Lattner SBThread::GetProcess ()
59730fdc8d8SChris Lattner {
598ceb6b139SCaroline Tice 
59930fdc8d8SChris Lattner     SBProcess process;
6006611103cSGreg Clayton     if (m_opaque_sp)
60130fdc8d8SChris Lattner     {
60230fdc8d8SChris Lattner         // Have to go up to the target so we can get a shared pointer to our process...
6036611103cSGreg Clayton         process.SetProcess(m_opaque_sp->GetProcess().GetTarget().GetProcessSP());
60430fdc8d8SChris Lattner     }
605ceb6b139SCaroline Tice 
6062d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
607ceb6b139SCaroline Tice     if (log)
608ceb6b139SCaroline Tice     {
609ceb6b139SCaroline Tice         SBStream sstr;
610ceb6b139SCaroline Tice         process.GetDescription (sstr);
6114838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
612750cd175SCaroline Tice                      process.get(), sstr.GetData());
613ceb6b139SCaroline Tice     }
614ceb6b139SCaroline Tice 
61530fdc8d8SChris Lattner     return process;
61630fdc8d8SChris Lattner }
61730fdc8d8SChris Lattner 
61830fdc8d8SChris Lattner uint32_t
61930fdc8d8SChris Lattner SBThread::GetNumFrames ()
62030fdc8d8SChris Lattner {
6212d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
622ceb6b139SCaroline Tice 
623ceb6b139SCaroline Tice     uint32_t num_frames = 0;
6246611103cSGreg Clayton     if (m_opaque_sp)
625af67cecdSGreg Clayton     {
626af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
627ceb6b139SCaroline Tice         num_frames = m_opaque_sp->GetStackFrameCount();
628af67cecdSGreg Clayton     }
629ceb6b139SCaroline Tice 
630ceb6b139SCaroline Tice     if (log)
6314838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetNumFrames () => %u", m_opaque_sp.get(), num_frames);
632ceb6b139SCaroline Tice 
633ceb6b139SCaroline Tice     return num_frames;
63430fdc8d8SChris Lattner }
63530fdc8d8SChris Lattner 
63630fdc8d8SChris Lattner SBFrame
63730fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx)
63830fdc8d8SChris Lattner {
6392d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
640ceb6b139SCaroline Tice 
64130fdc8d8SChris Lattner     SBFrame sb_frame;
6426611103cSGreg Clayton     if (m_opaque_sp)
643af67cecdSGreg Clayton     {
644af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
6456611103cSGreg Clayton         sb_frame.SetFrame (m_opaque_sp->GetStackFrameAtIndex (idx));
646af67cecdSGreg Clayton     }
647ceb6b139SCaroline Tice 
648ceb6b139SCaroline Tice     if (log)
649ceb6b139SCaroline Tice     {
650ceb6b139SCaroline Tice         SBStream sstr;
651ceb6b139SCaroline Tice         sb_frame.GetDescription (sstr);
6524838131bSGreg Clayton         log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
653750cd175SCaroline Tice                      m_opaque_sp.get(), idx, sb_frame.get(), sstr.GetData());
654ceb6b139SCaroline Tice     }
655ceb6b139SCaroline Tice 
65630fdc8d8SChris Lattner     return sb_frame;
65730fdc8d8SChris Lattner }
65830fdc8d8SChris Lattner 
659f028a1fbSGreg Clayton lldb::SBFrame
660f028a1fbSGreg Clayton SBThread::GetSelectedFrame ()
661f028a1fbSGreg Clayton {
662f028a1fbSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
663f028a1fbSGreg Clayton 
664f028a1fbSGreg Clayton     SBFrame sb_frame;
665f028a1fbSGreg Clayton     if (m_opaque_sp)
666af67cecdSGreg Clayton     {
667af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
668f028a1fbSGreg Clayton         sb_frame.SetFrame (m_opaque_sp->GetSelectedFrame ());
669af67cecdSGreg Clayton     }
670f028a1fbSGreg Clayton 
671f028a1fbSGreg Clayton     if (log)
672f028a1fbSGreg Clayton     {
673f028a1fbSGreg Clayton         SBStream sstr;
674f028a1fbSGreg Clayton         sb_frame.GetDescription (sstr);
675f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
676f028a1fbSGreg Clayton                      m_opaque_sp.get(), sb_frame.get(), sstr.GetData());
677f028a1fbSGreg Clayton     }
678f028a1fbSGreg Clayton 
679f028a1fbSGreg Clayton     return sb_frame;
680f028a1fbSGreg Clayton }
681f028a1fbSGreg Clayton 
682f028a1fbSGreg Clayton lldb::SBFrame
683f028a1fbSGreg Clayton SBThread::SetSelectedFrame (uint32_t idx)
684f028a1fbSGreg Clayton {
685f028a1fbSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
686f028a1fbSGreg Clayton 
687f028a1fbSGreg Clayton     SBFrame sb_frame;
688f028a1fbSGreg Clayton     if (m_opaque_sp)
689f028a1fbSGreg Clayton     {
690af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetProcess().GetTarget().GetAPIMutex());
691f028a1fbSGreg Clayton         lldb::StackFrameSP frame_sp (m_opaque_sp->GetStackFrameAtIndex (idx));
692f028a1fbSGreg Clayton         if (frame_sp)
693f028a1fbSGreg Clayton         {
694f028a1fbSGreg Clayton             m_opaque_sp->SetSelectedFrame (frame_sp.get());
695f028a1fbSGreg Clayton             sb_frame.SetFrame (frame_sp);
696f028a1fbSGreg Clayton         }
697f028a1fbSGreg Clayton     }
698f028a1fbSGreg Clayton 
699f028a1fbSGreg Clayton     if (log)
700f028a1fbSGreg Clayton     {
701f028a1fbSGreg Clayton         SBStream sstr;
702f028a1fbSGreg Clayton         sb_frame.GetDescription (sstr);
703f028a1fbSGreg Clayton         log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
704f028a1fbSGreg Clayton                      m_opaque_sp.get(), idx, sb_frame.get(), sstr.GetData());
705f028a1fbSGreg Clayton     }
706f028a1fbSGreg Clayton     return sb_frame;
707f028a1fbSGreg Clayton }
708f028a1fbSGreg Clayton 
709f028a1fbSGreg Clayton 
71030fdc8d8SChris Lattner bool
71130fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const
71230fdc8d8SChris Lattner {
7136611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
71430fdc8d8SChris Lattner }
71530fdc8d8SChris Lattner 
71630fdc8d8SChris Lattner bool
71730fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const
71830fdc8d8SChris Lattner {
7196611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
72030fdc8d8SChris Lattner }
72130fdc8d8SChris Lattner 
72230fdc8d8SChris Lattner lldb_private::Thread *
7234838131bSGreg Clayton SBThread::get ()
72430fdc8d8SChris Lattner {
7256611103cSGreg Clayton     return m_opaque_sp.get();
72630fdc8d8SChris Lattner }
72730fdc8d8SChris Lattner 
72830fdc8d8SChris Lattner const lldb_private::Thread *
72930fdc8d8SChris Lattner SBThread::operator->() const
73030fdc8d8SChris Lattner {
7316611103cSGreg Clayton     return m_opaque_sp.get();
73230fdc8d8SChris Lattner }
73330fdc8d8SChris Lattner 
73430fdc8d8SChris Lattner const lldb_private::Thread &
73530fdc8d8SChris Lattner SBThread::operator*() const
73630fdc8d8SChris Lattner {
7376611103cSGreg Clayton     return *m_opaque_sp;
73830fdc8d8SChris Lattner }
73930fdc8d8SChris Lattner 
74030fdc8d8SChris Lattner lldb_private::Thread *
74130fdc8d8SChris Lattner SBThread::operator->()
74230fdc8d8SChris Lattner {
7436611103cSGreg Clayton     return m_opaque_sp.get();
74430fdc8d8SChris Lattner }
74530fdc8d8SChris Lattner 
74630fdc8d8SChris Lattner lldb_private::Thread &
74730fdc8d8SChris Lattner SBThread::operator*()
74830fdc8d8SChris Lattner {
7496611103cSGreg Clayton     return *m_opaque_sp;
75030fdc8d8SChris Lattner }
751dde9cff3SCaroline Tice 
752dde9cff3SCaroline Tice bool
753ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const
754ceb6b139SCaroline Tice {
755ceb6b139SCaroline Tice     if (m_opaque_sp)
756ceb6b139SCaroline Tice     {
757ceb6b139SCaroline Tice         StreamString strm;
758ceb6b139SCaroline Tice         description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID());
759ceb6b139SCaroline Tice     }
760ceb6b139SCaroline Tice     else
761ceb6b139SCaroline Tice         description.Printf ("No value");
762ceb6b139SCaroline Tice 
763ceb6b139SCaroline Tice     return true;
764ceb6b139SCaroline Tice }
765