124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBThread.cpp --------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
127a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBThread.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBSymbolContext.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBFileSpec.h"
1698f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice#include "lldb/API/SBStream.h"
17640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton#include "lldb/Breakpoint/BreakpointLocation.h"
1863094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h"
192c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor#include "lldb/Core/State.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
2263094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
27643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInstruction.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepOut.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepRange.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInRange.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
367a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBAddress.h"
377a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBDebugger.h"
3894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham#include "lldb/API/SBEvent.h"
391586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/API/SBFrame.h"
407a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBProcess.h"
411586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/API/SBValue.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Inghamconst char *
4794a5d0de4433dce556db59758f3d6124eb0e1a2aJim InghamSBThread::GetBroadcasterClassName ()
4894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham{
4994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    return Thread::GetStaticBroadcasterClass().AsCString();
5094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham}
5194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
5249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton//----------------------------------------------------------------------
5349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton// Constructors
5449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton//----------------------------------------------------------------------
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::SBThread () :
56a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    m_opaque_sp (new ExecutionContextRef())
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::SBThread (const ThreadSP& lldb_object_sp) :
61a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    m_opaque_sp (new ExecutionContextRef(lldb_object_sp))
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
651b28441cf05e7781bd9685a0cdcd349d8b09fefbGreg ClaytonSBThread::SBThread (const SBThread &rhs) :
66a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    m_opaque_sp (new ExecutionContextRef(*rhs.m_opaque_sp))
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton// Assignment operator
7349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton//----------------------------------------------------------------------
7449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
7549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Claytonconst lldb::SBThread &
7649ce682dfa7993d31206cea19ce7006cd3f3077eGreg ClaytonSBThread::operator = (const SBThread &rhs)
7749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton{
7849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (this != &rhs)
79a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        *m_opaque_sp = *rhs.m_opaque_sp;
8049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return *this;
8149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton}
8249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
8349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton//----------------------------------------------------------------------
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::~SBThread()
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::IsValid() const
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    return m_opaque_sp->GetThreadSP().get() != NULL;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9643490d1332d13694fb6690365984bf0ecdd8dcc3Greg Claytonvoid
9743490d1332d13694fb6690365984bf0ecdd8dcc3Greg ClaytonSBThread::Clear ()
9843490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton{
99a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    m_opaque_sp->Clear();
10043490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton}
10143490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton
10243490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStopReason
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetStopReason()
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
106952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1077826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
1087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    StopReason reason = eStopReasonInvalid;
109d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
110d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
111d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
112f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
114a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
115a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
116a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1173acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton            return exe_ctx.GetThreadPtr()->GetStopReason();
118a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1199f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
1209f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
1219f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
1229f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetStopReason() => error: process is running", exe_ctx.GetThreadPtr());
1239f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
1267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
127f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::GetStopReason () => %s", exe_ctx.GetThreadPtr(),
12861ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     Thread::StopReasonAsCString (reason));
1297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
1307826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return reason;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
134640dc6b983964615bcb149d7d37ee007a13fb02cGreg ClaytonSBThread::GetStopReasonDataCount ()
135640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton{
136d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
137d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
138d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
139f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
140640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    {
141a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
142a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
143640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton        {
144a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
145a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            if (stop_info_sp)
146640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton            {
147a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                StopReason reason = stop_info_sp->GetStopReason();
148a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                switch (reason)
149640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                {
150a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonInvalid:
151a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonNone:
152a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonTrace:
1530bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                case eStopReasonExec:
154a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonPlanComplete:
155278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                case eStopReasonThreadExiting:
156a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    // There is no data for these stop reasons.
157a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return 0;
158a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
159a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonBreakpoint:
160a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    {
161a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break_id_t site_id = stop_info_sp->GetValue();
162a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
163a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        if (bp_site_sp)
164a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            return bp_site_sp->GetNumberOfOwners () * 2;
165a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        else
166a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            return 0; // Breakpoint must have cleared itself...
167a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    }
168a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    break;
169640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
170a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonWatchpoint:
171a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return 1;
172640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
173a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonSignal:
174a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return 1;
175640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
176a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonException:
177a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return 1;
178a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                }
179640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton            }
180640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton        }
1819f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
1829f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
183952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1849f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
1859f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running", exe_ctx.GetThreadPtr());
1869f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
187640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    }
188640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    return 0;
189640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton}
190640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
191640dc6b983964615bcb149d7d37ee007a13fb02cGreg Claytonuint64_t
192640dc6b983964615bcb149d7d37ee007a13fb02cGreg ClaytonSBThread::GetStopReasonDataAtIndex (uint32_t idx)
193640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton{
194d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
195d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
196d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
197f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
198640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    {
199a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
200a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
201640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton        {
202a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Thread *thread = exe_ctx.GetThreadPtr();
203a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            StopInfoSP stop_info_sp = thread->GetStopInfo ();
204a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            if (stop_info_sp)
205640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton            {
206a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                StopReason reason = stop_info_sp->GetStopReason();
207a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                switch (reason)
208640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                {
209a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonInvalid:
210a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonNone:
211a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonTrace:
2120bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                case eStopReasonExec:
213a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonPlanComplete:
214278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                case eStopReasonThreadExiting:
215a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    // There is no data for these stop reasons.
216a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return 0;
217a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
218a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonBreakpoint:
219640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                    {
220a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break_id_t site_id = stop_info_sp->GetValue();
221a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        lldb::BreakpointSiteSP bp_site_sp (exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID (site_id));
222a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        if (bp_site_sp)
223640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                        {
224a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            uint32_t bp_index = idx / 2;
225a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            BreakpointLocationSP bp_loc_sp (bp_site_sp->GetOwnerAtIndex (bp_index));
226a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            if (bp_loc_sp)
227640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                            {
228a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                if (bp_index & 1)
229a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                {
230a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                    // Odd idx, return the breakpoint location ID
231a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                    return bp_loc_sp->GetID();
232a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                }
233a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                else
234a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                {
235a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                    // Even idx, return the breakpoint ID
236a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                    return bp_loc_sp->GetBreakpoint().GetID();
237a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                }
238640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                            }
239640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                        }
240a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        return LLDB_INVALID_BREAK_ID;
241640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton                    }
242a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    break;
243640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
244a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonWatchpoint:
245a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return stop_info_sp->GetValue();
246640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
247a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonSignal:
248a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return stop_info_sp->GetValue();
249640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
250a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                case eStopReasonException:
251a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    return stop_info_sp->GetValue();
252a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                }
253640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton            }
254640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton        }
2559f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
2569f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
257952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2589f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
2599f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
2609f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
261640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    }
262640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    return 0;
263640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton}
264640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
265640dc6b983964615bcb149d7d37ee007a13fb02cGreg Claytonsize_t
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetStopDescription (char *dst, size_t dst_len)
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
268952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2697826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
270d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
271d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
272d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
273f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
275a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
276a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
278a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
279a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
280a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            if (stop_info_sp)
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
282a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                const char *stop_desc = stop_info_sp->GetDescription();
283a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                if (stop_desc)
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
285a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    if (log)
286a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"",
287a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                     exe_ctx.GetThreadPtr(), stop_desc);
288a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    if (dst)
289a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        return ::snprintf (dst, dst_len, "%s", stop_desc);
290a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    else
291a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    {
292a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        // NULL dst passed in, return the length needed to contain the description
293a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        return ::strlen (stop_desc) + 1; // Include the NULL byte for size
294a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    }
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
296a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                else
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
298a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    size_t stop_desc_len = 0;
299a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    switch (stop_info_sp->GetStopReason())
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
301a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    case eStopReasonTrace:
302a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    case eStopReasonPlanComplete:
303a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        {
304a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            static char trace_desc[] = "step";
305a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc = trace_desc;
306a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size
307a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        }
308a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break;
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    case eStopReasonBreakpoint:
311a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        {
312a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            static char bp_desc[] = "breakpoint hit";
313a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc = bp_desc;
314a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size
315a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        }
316a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
318a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    case eStopReasonWatchpoint:
319a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        {
320a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            static char wp_desc[] = "watchpoint hit";
321a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc = wp_desc;
322a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size
323a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        }
324a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
326a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    case eStopReasonSignal:
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
328a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc = exe_ctx.GetProcessPtr()->GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue());
329a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            if (stop_desc == NULL || stop_desc[0] == '\0')
330a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            {
331a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                static char signal_desc[] = "signal";
332a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                stop_desc = signal_desc;
333a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size
334a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            }
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
336a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break;
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    case eStopReasonException:
339a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        {
340a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            char exc_desc[] = "exception";
341a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc = exc_desc;
342a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
343a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        }
344a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break;
34554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
3460bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                    case eStopReasonExec:
3470bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                        {
3480bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                            char exc_desc[] = "exec";
3490bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                            stop_desc = exc_desc;
3500bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                            stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size
3510bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                        }
3520bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                        break;
3530bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
354278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                    case eStopReasonThreadExiting:
355278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                        {
356278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                            char limbo_desc[] = "thread exiting";
357278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                            stop_desc = limbo_desc;
358278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                            stop_desc_len = sizeof(limbo_desc);
359278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                        }
360278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor                        break;
361a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    default:
362a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        break;
363a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    }
364a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
365a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    if (stop_desc && stop_desc[0])
366a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    {
367a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        if (log)
368a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            log->Printf ("SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'",
369a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                                         exe_ctx.GetThreadPtr(), stop_desc);
3707826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
371a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        if (dst)
372a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
374a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        if (stop_desc_len == 0)
375a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                            stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte
376a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
377a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                        return stop_desc_len;
378a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                    }
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
3829f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
3839f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
384952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3859f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
3869f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running", exe_ctx.GetThreadPtr());
3879f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (dst)
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        *dst = 0;
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3941586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamSBValue
3951586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamSBThread::GetStopReturnValue ()
3961586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham{
397952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3981586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ValueObjectSP return_valobj_sp;
399d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
400d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
401d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
402f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
4031586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    {
404a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
405a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4061586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        {
407a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo ();
408a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            if (stop_info_sp)
409a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            {
410a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
411a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            }
4121586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        }
4139f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
4149f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
4159f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
4169f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running", exe_ctx.GetThreadPtr());
4179f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
4181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    }
4191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
4201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    if (log)
421f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", exe_ctx.GetThreadPtr(),
4221586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                                  return_valobj_sp.get()
4231586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                                      ? return_valobj_sp->GetValueAsCString()
4241586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                                                                        : "<no return value>");
4251586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
4261586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    return SBValue (return_valobj_sp);
4271586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham}
4281586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::SetThread (const ThreadSP& lldb_object_sp)
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
432a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    m_opaque_sp->SetThreadSP (lldb_object_sp);
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::tid_t
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetThreadID () const
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
439a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
44090c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    if (thread_sp)
441f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        return thread_sp->GetID();
442f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    return LLDB_INVALID_THREAD_ID;
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetIndexID () const
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
448a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    ThreadSP thread_sp(m_opaque_sp->GetThreadSP());
44990c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    if (thread_sp)
45090c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton        return thread_sp->GetIndexID();
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_INVALID_INDEX32;
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
453f4124deeb9532044a38c0774ced872f2709347daGreg Clayton
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetName () const
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
457952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
458a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    const char *name = NULL;
459d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
460d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
461d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
462f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
463bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
464a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
465a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
466a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
467a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            name = exe_ctx.GetThreadPtr()->GetName();
468a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
4699f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
4709f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
4719f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
4729f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetName() => error: process is running", exe_ctx.GetThreadPtr());
4739f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
474bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
475a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
4767826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
477f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::GetName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
4787826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
479a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    return name;
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetQueueName () const
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
485a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    const char *name = NULL;
486d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
487d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
488d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
489952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
490f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
491bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
492a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
493a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
494a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
495a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            name = exe_ctx.GetThreadPtr()->GetQueueName();
496a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
4979f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
4989f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
4999f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
5009f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetQueueName() => error: process is running", exe_ctx.GetThreadPtr());
5019f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
502bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
503a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
5047826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
505f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::GetQueueName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
5067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
507a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    return name;
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51088e3de205708f14431559072ca258899b5ac31ccJim InghamSBError
51188e3de205708f14431559072ca258899b5ac31ccJim InghamSBThread::ResumeNewPlan (ExecutionContext &exe_ctx, ThreadPlan *new_plan)
51288e3de205708f14431559072ca258899b5ac31ccJim Ingham{
51388e3de205708f14431559072ca258899b5ac31ccJim Ingham    SBError sb_error;
51488e3de205708f14431559072ca258899b5ac31ccJim Ingham
51588e3de205708f14431559072ca258899b5ac31ccJim Ingham    Process *process = exe_ctx.GetProcessPtr();
51688e3de205708f14431559072ca258899b5ac31ccJim Ingham    if (!process)
51788e3de205708f14431559072ca258899b5ac31ccJim Ingham    {
51888e3de205708f14431559072ca258899b5ac31ccJim Ingham        sb_error.SetErrorString("No process in SBThread::ResumeNewPlan");
51988e3de205708f14431559072ca258899b5ac31ccJim Ingham        return sb_error;
52088e3de205708f14431559072ca258899b5ac31ccJim Ingham    }
52188e3de205708f14431559072ca258899b5ac31ccJim Ingham
52288e3de205708f14431559072ca258899b5ac31ccJim Ingham    Thread *thread = exe_ctx.GetThreadPtr();
52388e3de205708f14431559072ca258899b5ac31ccJim Ingham    if (!thread)
52488e3de205708f14431559072ca258899b5ac31ccJim Ingham    {
52588e3de205708f14431559072ca258899b5ac31ccJim Ingham        sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan");
52688e3de205708f14431559072ca258899b5ac31ccJim Ingham        return sb_error;
52788e3de205708f14431559072ca258899b5ac31ccJim Ingham    }
52888e3de205708f14431559072ca258899b5ac31ccJim Ingham
52988e3de205708f14431559072ca258899b5ac31ccJim Ingham    // User level plans should be Master Plans so they can be interrupted, other plans executed, and
53088e3de205708f14431559072ca258899b5ac31ccJim Ingham    // then a "continue" will resume the plan.
53188e3de205708f14431559072ca258899b5ac31ccJim Ingham    if (new_plan != NULL)
53288e3de205708f14431559072ca258899b5ac31ccJim Ingham    {
53388e3de205708f14431559072ca258899b5ac31ccJim Ingham        new_plan->SetIsMasterPlan(true);
53488e3de205708f14431559072ca258899b5ac31ccJim Ingham        new_plan->SetOkayToDiscard(false);
53588e3de205708f14431559072ca258899b5ac31ccJim Ingham    }
53688e3de205708f14431559072ca258899b5ac31ccJim Ingham
53788e3de205708f14431559072ca258899b5ac31ccJim Ingham    // Why do we need to set the current thread by ID here???
53888e3de205708f14431559072ca258899b5ac31ccJim Ingham    process->GetThreadList().SetSelectedThreadByID (thread->GetID());
53988e3de205708f14431559072ca258899b5ac31ccJim Ingham    sb_error.ref() = process->Resume();
54088e3de205708f14431559072ca258899b5ac31ccJim Ingham
54188e3de205708f14431559072ca258899b5ac31ccJim Ingham    if (sb_error.Success())
54288e3de205708f14431559072ca258899b5ac31ccJim Ingham    {
54388e3de205708f14431559072ca258899b5ac31ccJim Ingham        // If we are doing synchronous mode, then wait for the
54488e3de205708f14431559072ca258899b5ac31ccJim Ingham        // process to stop yet again!
54588e3de205708f14431559072ca258899b5ac31ccJim Ingham        if (process->GetTarget().GetDebugger().GetAsyncExecution () == false)
54688e3de205708f14431559072ca258899b5ac31ccJim Ingham            process->WaitForProcessToStop (NULL);
54788e3de205708f14431559072ca258899b5ac31ccJim Ingham    }
54888e3de205708f14431559072ca258899b5ac31ccJim Ingham
54988e3de205708f14431559072ca258899b5ac31ccJim Ingham    return sb_error;
55088e3de205708f14431559072ca258899b5ac31ccJim Ingham}
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::StepOver (lldb::RunMode stop_other_threads)
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
555952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5567826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
557d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
558d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
559d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
56090c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
5617826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
562f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::StepOver (stop_other_threads='%s')", exe_ctx.GetThreadPtr(),
5637826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice                     Thread::RunModeAsCString (stop_other_threads));
56490c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
565f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
567f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Thread *thread = exe_ctx.GetThreadPtr();
568d82bc6d623930e796d596d190399ec2450980e0fJim Ingham        bool abort_other_plans = false;
569f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
571008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ThreadPlanSP new_plan_sp;
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (frame_sp)
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (frame_sp->HasDebugInformation ())
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
577008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                new_plan_sp = thread->QueueThreadPlanForStepOverRange (abort_other_plans,
578f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                                    sc.line_entry.range,
579f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                                    sc,
580f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                                    stop_other_threads);
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
584008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (true,
58588e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                            abort_other_plans,
58688e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                            stop_other_threads);
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59088e3de205708f14431559072ca258899b5ac31ccJim Ingham        // This returns an error, we should use it!
591008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ResumeNewPlan (exe_ctx, new_plan_sp.get());
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::StepInto (lldb::RunMode stop_other_threads)
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
598f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    StepInto (NULL, stop_other_threads);
599f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham}
600f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham
601f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Inghamvoid
602f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim InghamSBThread::StepInto (const char *target_name, lldb::RunMode stop_other_threads)
603f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham{
604952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6057826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
606d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
607d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
60890c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
6097826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
610f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham        log->Printf ("SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')",
611f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                     exe_ctx.GetThreadPtr(),
612f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                     target_name? target_name: "<NULL>",
6137826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice                     Thread::RunModeAsCString (stop_other_threads));
614f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham
615f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
617d82bc6d623930e796d596d190399ec2450980e0fJim Ingham        bool abort_other_plans = false;
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
619f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Thread *thread = exe_ctx.GetThreadPtr();
620f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
621008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ThreadPlanSP new_plan_sp;
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (frame_sp && frame_sp->HasDebugInformation ())
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6258f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton            bool avoid_code_without_debug_info = true;
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything));
627008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham            new_plan_sp = thread->QueueThreadPlanForStepInRange (abort_other_plans,
628f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                              sc.line_entry.range,
629f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                              sc,
630f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                              target_name,
631f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                              stop_other_threads,
632f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                                              avoid_code_without_debug_info);
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
636008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham            new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction (false,
63788e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                        abort_other_plans,
63888e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                        stop_other_threads);
6391a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton        }
64088e3de205708f14431559072ca258899b5ac31ccJim Ingham
64188e3de205708f14431559072ca258899b5ac31ccJim Ingham        // This returns an error, we should use it!
642008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ResumeNewPlan (exe_ctx, new_plan_sp.get());
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::StepOut ()
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
649952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6507826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
651d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
652d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
653d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
6547826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
65590c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    if (log)
656f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::StepOut ()", exe_ctx.GetThreadPtr());
65790c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
658f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
660d82bc6d623930e796d596d190399ec2450980e0fJim Ingham        bool abort_other_plans = false;
661be0cde978e34379e30c01c92858f8f037d80d388Jim Ingham        bool stop_other_threads = false;
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
663f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Thread *thread = exe_ctx.GetThreadPtr();
664f4124deeb9532044a38c0774ced872f2709347daGreg Clayton
665008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
66688e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                  NULL,
66788e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                  false,
66888e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                  stop_other_threads,
66988e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                  eVoteYes,
67088e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                  eVoteNoOpinion,
671008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                                                  0));
67288e3de205708f14431559072ca258899b5ac31ccJim Ingham
67388e3de205708f14431559072ca258899b5ac31ccJim Ingham        // This returns an error, we should use it!
674008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ResumeNewPlan (exe_ctx, new_plan_sp.get());
6751ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    }
6761ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton}
6771ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
6781ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Claytonvoid
6791ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg ClaytonSBThread::StepOutOfFrame (lldb::SBFrame &sb_frame)
6801ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton{
681952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
683d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
684d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
685d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
686334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    StackFrameSP frame_sp (sb_frame.GetFrameSP());
6871ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    if (log)
6881ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    {
6891ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SBStream frame_desc_strm;
6901ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        sb_frame.GetDescription (frame_desc_strm);
691f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
6921ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    }
6931ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
694f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
6951ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    {
696d82bc6d623930e796d596d190399ec2450980e0fJim Ingham        bool abort_other_plans = false;
697be0cde978e34379e30c01c92858f8f037d80d388Jim Ingham        bool stop_other_threads = false;
698f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Thread *thread = exe_ctx.GetThreadPtr();
6991ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
700008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut (abort_other_plans,
70188e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                    NULL,
70288e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                    false,
70388e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                    stop_other_threads,
70488e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                    eVoteYes,
70588e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                    eVoteNoOpinion,
706008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                                                    frame_sp->GetFrameIndex()));
70788e3de205708f14431559072ca258899b5ac31ccJim Ingham
70888e3de205708f14431559072ca258899b5ac31ccJim Ingham        // This returns an error, we should use it!
709008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ResumeNewPlan (exe_ctx, new_plan_sp.get());
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::StepInstruction (bool step_over)
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
716952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7177826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
718d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
719d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
720d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
721f4124deeb9532044a38c0774ced872f2709347daGreg Clayton
7227826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
72390c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    if (log)
724f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::StepInstruction (step_over=%i)", exe_ctx.GetThreadPtr(), step_over);
72590c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
726f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
728f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Thread *thread = exe_ctx.GetThreadPtr();
729008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction (step_over, true, true));
73088e3de205708f14431559072ca258899b5ac31ccJim Ingham
73188e3de205708f14431559072ca258899b5ac31ccJim Ingham        // This returns an error, we should use it!
732008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ResumeNewPlan (exe_ctx, new_plan_sp.get());
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::RunToAddress (lldb::addr_t addr)
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
739952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7407826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
741d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
742d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
743d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
7447826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
74590c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    if (log)
7465f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", exe_ctx.GetThreadPtr(), addr);
74790c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
748f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
750d82bc6d623930e796d596d190399ec2450980e0fJim Ingham        bool abort_other_plans = false;
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool stop_other_threads = true;
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        Address target_addr (addr);
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
755f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Thread *thread = exe_ctx.GetThreadPtr();
756f4124deeb9532044a38c0774ced872f2709347daGreg Clayton
757008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads));
75888e3de205708f14431559072ca258899b5ac31ccJim Ingham
75988e3de205708f14431559072ca258899b5ac31ccJim Ingham        // This returns an error, we should use it!
760008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham        ResumeNewPlan (exe_ctx, new_plan_sp.get());
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7621ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton}
7631ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
7641ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg ClaytonSBError
7651ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg ClaytonSBThread::StepOverUntil (lldb::SBFrame &sb_frame,
7661ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                         lldb::SBFileSpec &sb_file_spec,
7671ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                         uint32_t line)
7681ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton{
7691ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    SBError sb_error;
770952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7711ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    char path[PATH_MAX];
77290c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
773d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
774d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
775d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
776334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    StackFrameSP frame_sp (sb_frame.GetFrameSP());
777334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
7781ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    if (log)
7791ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    {
7801ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SBStream frame_desc_strm;
7811ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        sb_frame.GetDescription (frame_desc_strm);
7821ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        sb_file_spec->GetPath (path, sizeof(path));
7831ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        log->Printf ("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, file+line = %s:%u)",
784f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                     exe_ctx.GetThreadPtr(),
785334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                     frame_sp.get(),
7861ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                     frame_desc_strm.GetData(),
7871ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                     path, line);
7881ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    }
78990c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton
790f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
7911ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    {
792f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Target *target = exe_ctx.GetTargetPtr();
793f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Thread *thread = exe_ctx.GetThreadPtr();
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7951ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        if (line == 0)
7961ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
7971ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            sb_error.SetErrorString("invalid line argument");
7981ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            return sb_error;
7991ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
8001ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
801334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        if (!frame_sp)
8021ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
803f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            frame_sp = thread->GetSelectedFrame ();
8041ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            if (!frame_sp)
805f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                frame_sp = thread->GetStackFrameAtIndex (0);
8061ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
8071ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
8081ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SymbolContext frame_sc;
8091ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        if (!frame_sp)
8101ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
8111ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            sb_error.SetErrorString("no valid frames in thread to step");
8121ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            return sb_error;
8131ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
8141ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
8151ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        // If we have a frame, get its line
8161ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        frame_sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit  |
8171ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                               eSymbolContextFunction  |
8181ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                               eSymbolContextLineEntry |
8191ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                               eSymbolContextSymbol    );
8201ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
8211ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        if (frame_sc.comp_unit == NULL)
8221ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
8231ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            sb_error.SetErrorStringWithFormat("frame %u doesn't have debug information", frame_sp->GetFrameIndex());
8241ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            return sb_error;
8251ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
8261ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
8271ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        FileSpec step_file_spec;
8281ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        if (sb_file_spec.IsValid())
8291ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
8301ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            // The file spec passed in was valid, so use it
8311ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            step_file_spec = sb_file_spec.ref();
8321ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
8331ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        else
8341ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
8351ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            if (frame_sc.line_entry.IsValid())
8361ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                step_file_spec = frame_sc.line_entry.file;
8371ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            else
8381ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            {
8391ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                sb_error.SetErrorString("invalid file argument or no file for frame");
8401ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                return sb_error;
8411ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            }
8421ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
8431ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
844b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham        // Grab the current function, then we will make sure the "until" address is
845b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham        // within the function.  We discard addresses that are out of the current
846b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham        // function, and then if there are no addresses remaining, give an appropriate
847b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham        // error message.
848b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham
849b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham        bool all_in_function = true;
850b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham        AddressRange fun_range = frame_sc.function->GetAddressRange();
851b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham
8521ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        std::vector<addr_t> step_over_until_addrs;
853d82bc6d623930e796d596d190399ec2450980e0fJim Ingham        const bool abort_other_plans = false;
85452124e7711fc5628df6a256c6125f9e4e9a97a5dJim Ingham        const bool stop_other_threads = false;
8551ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        const bool check_inlines = true;
8561ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        const bool exact = false;
8571ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
8581ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SymbolContextList sc_list;
859b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham        const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext (step_file_spec,
860b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                                                                               line,
861b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                                                                               check_inlines,
862b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                                                                               exact,
863b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                                                                               eSymbolContextLineEntry,
864b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                                                                               sc_list);
8651ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        if (num_matches > 0)
8661ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
8671ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            SymbolContext sc;
8681ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            for (uint32_t i=0; i<num_matches; ++i)
8691ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            {
8701ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                if (sc_list.GetContextAtIndex(i, sc))
8711ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                {
872b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                    addr_t step_addr = sc.line_entry.range.GetBaseAddress().GetLoadAddress(target);
8731ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                    if (step_addr != LLDB_INVALID_ADDRESS)
8741ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                    {
875b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                        if (fun_range.ContainsLoadAddress(step_addr, target))
876b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                            step_over_until_addrs.push_back(step_addr);
877b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                        else
878b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                            all_in_function = false;
8791ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                    }
8801ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                }
8811ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton            }
8821ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
883b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham
8841ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        if (step_over_until_addrs.empty())
8851ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
886b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham            if (all_in_function)
887b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham            {
888b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham                step_file_spec.GetPath (path, sizeof(path));
8897e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, line);
890b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham            }
891b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham            else
8929c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                sb_error.SetErrorString ("step until target not in current function");
8931ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
8941ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        else
8951ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        {
896008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham            ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil (abort_other_plans,
89788e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                        &step_over_until_addrs[0],
89888e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                        step_over_until_addrs.size(),
89988e3de205708f14431559072ca258899b5ac31ccJim Ingham                                                                        stop_other_threads,
900008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham                                                                        frame_sp->GetFrameIndex()));
901f4124deeb9532044a38c0774ced872f2709347daGreg Clayton
902008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham            sb_error = ResumeNewPlan (exe_ctx, new_plan_sp.get());
9031ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        }
9041ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    }
9051ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    else
9061ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    {
9071ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        sb_error.SetErrorString("this SBThread object is invalid");
9081ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    }
9091ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    return sb_error;
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
912a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim InghamSBError
913f59388aa57559d7d074613d65b88abacfd699845Jim InghamSBThread::ReturnFromFrame (SBFrame &frame, SBValue &return_value)
914a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham{
915a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    SBError sb_error;
916a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
917952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
918a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
919a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    Mutex::Locker api_locker;
920a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
921a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
922a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
923a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    if (log)
924f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        log->Printf ("SBThread(%p)::ReturnFromFrame (frame=%d)", exe_ctx.GetThreadPtr(), frame.GetFrameID());
925a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
926a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    if (exe_ctx.HasThreadScope())
927a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    {
928a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham        Thread *thread = exe_ctx.GetThreadPtr();
929f59388aa57559d7d074613d65b88abacfd699845Jim Ingham        sb_error.SetError (thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP()));
930a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    }
931a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
932a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    return sb_error;
933a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham}
934a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
9351ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
936123db408a6bc06614ec893040aaad84d8d0d16f9Greg Claytonbool
937123db408a6bc06614ec893040aaad84d8d0d16f9Greg ClaytonSBThread::Suspend()
938123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton{
939952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
940a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    ExecutionContext exe_ctx (m_opaque_sp.get());
9419f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton    bool result = false;
942f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
943123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
9449f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        Process::StopLocker stop_locker;
9459f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9469f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
9479f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
9489f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            result = true;
9499f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
9509f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
9519f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
9529f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
9539f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::Suspend() => error: process is running", exe_ctx.GetThreadPtr());
9549f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
955123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
9569f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton    if (log)
9579f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        log->Printf ("SBThread(%p)::Suspend() => %i", exe_ctx.GetThreadPtr(), result);
9589f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton    return result;
959123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton}
960123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
961123db408a6bc06614ec893040aaad84d8d0d16f9Greg Claytonbool
962123db408a6bc06614ec893040aaad84d8d0d16f9Greg ClaytonSBThread::Resume ()
963123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton{
964952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
965a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    ExecutionContext exe_ctx (m_opaque_sp.get());
9669f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton    bool result = false;
967f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
968123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
9699f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        Process::StopLocker stop_locker;
9709f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9719f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
9729f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning);
9739f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            result = true;
9749f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
9759f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
9769f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
9779f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
9789f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::Resume() => error: process is running", exe_ctx.GetThreadPtr());
9799f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
980123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
9819f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton    if (log)
9829f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        log->Printf ("SBThread(%p)::Resume() => %i", exe_ctx.GetThreadPtr(), result);
9839f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton    return result;
984123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton}
985123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
986123db408a6bc06614ec893040aaad84d8d0d16f9Greg Claytonbool
987123db408a6bc06614ec893040aaad84d8d0d16f9Greg ClaytonSBThread::IsSuspended()
988123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton{
989a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    ExecutionContext exe_ctx (m_opaque_sp.get());
990f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
991f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        return exe_ctx.GetThreadPtr()->GetResumeState () == eStateSuspended;
992123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    return false;
993123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton}
9942c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor
9952c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylorbool
9962c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew KaylorSBThread::IsStopped()
9972c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor{
9982c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor    ExecutionContext exe_ctx (m_opaque_sp.get());
9992c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor    if (exe_ctx.HasThreadScope())
10002c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor        return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true);
10012c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor    return false;
10022c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor}
1003123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetProcess ()
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1007334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    SBProcess sb_process;
1008a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    ExecutionContext exe_ctx (m_opaque_sp.get());
1009f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Have to go up to the target so we can get a shared pointer to our process...
1012f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        sb_process.SetSP (exe_ctx.GetProcessSP());
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10147826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
1015952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10167826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
10177826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
10181ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SBStream frame_desc_strm;
1019334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        sb_process.GetDescription (frame_desc_strm);
1020f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::GetProcess () => SBProcess(%p): %s", exe_ctx.GetThreadPtr(),
1021cc28859e487562a6f39f1c22a72b417b5a8e3a1bEnrico Granata                     sb_process.GetSP().get(), frame_desc_strm.GetData());
10227826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
10237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
1024334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    return sb_process;
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetNumFrames ()
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1030952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10317826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
10327826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    uint32_t num_frames = 0;
1033d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
1034d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1035d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
1036f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
1037bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
1038a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1039a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1040a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1041a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
1042a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
10439f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
10449f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
10459f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
10469f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", exe_ctx.GetThreadPtr());
10479f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
1048bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
10497826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
10507826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
1051f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        log->Printf ("SBThread(%p)::GetNumFrames () => %u", exe_ctx.GetThreadPtr(), num_frames);
10527826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
10537826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return num_frames;
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBFrame
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::GetFrameAtIndex (uint32_t idx)
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1059952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10607826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBFrame sb_frame;
1062334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    StackFrameSP frame_sp;
1063d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
1064d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1065d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
1066f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
1067bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
1068a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1069a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1070a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1071a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
1072a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_frame.SetFrameSP (frame_sp);
1073a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
10749f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
10759f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
10769f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
10779f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
10789f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
1079bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
10807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
10817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
10827826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
10831ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SBStream frame_desc_strm;
10841ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        sb_frame.GetDescription (frame_desc_strm);
1085a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf ("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s",
1086f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                     exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
10877826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
10887826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_frame;
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1092c5157ecb9c6185b92923fab50de53f3fad86095dGreg Claytonlldb::SBFrame
1093c5157ecb9c6185b92923fab50de53f3fad86095dGreg ClaytonSBThread::GetSelectedFrame ()
1094c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton{
1095952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1096c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
1097c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    SBFrame sb_frame;
1098334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    StackFrameSP frame_sp;
1099d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
1100d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1101d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
1102f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
1103bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
1104a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1105a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1106a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1107a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
1108a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_frame.SetFrameSP (frame_sp);
1109a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
11109f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
11119f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
11129f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
11139f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
11149f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
1115bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
1116c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
1117c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    if (log)
1118c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    {
11191ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SBStream frame_desc_strm;
11201ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        sb_frame.GetDescription (frame_desc_strm);
1121c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton        log->Printf ("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s",
1122f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                     exe_ctx.GetThreadPtr(), frame_sp.get(), frame_desc_strm.GetData());
1123c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    }
1124c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
1125c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    return sb_frame;
1126c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton}
1127c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
1128c5157ecb9c6185b92923fab50de53f3fad86095dGreg Claytonlldb::SBFrame
1129c5157ecb9c6185b92923fab50de53f3fad86095dGreg ClaytonSBThread::SetSelectedFrame (uint32_t idx)
1130c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton{
1131952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1132c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
1133c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    SBFrame sb_frame;
1134334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    StackFrameSP frame_sp;
1135d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    Mutex::Locker api_locker;
1136d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1137d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham
1138f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
1139c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    {
1140a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1141a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1142c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton        {
1143a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Thread *thread = exe_ctx.GetThreadPtr();
1144a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            frame_sp = thread->GetStackFrameAtIndex (idx);
1145a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            if (frame_sp)
1146a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            {
1147a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                thread->SetSelectedFrame (frame_sp.get());
1148a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton                sb_frame.SetFrameSP (frame_sp);
1149a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            }
1150c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton        }
11519f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        else
11529f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        {
11539f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
11549f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
11559f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        }
1156c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    }
1157c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
1158c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    if (log)
1159c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    {
11601ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        SBStream frame_desc_strm;
11611ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton        sb_frame.GetDescription (frame_desc_strm);
1162c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton        log->Printf ("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s",
1163f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                     exe_ctx.GetThreadPtr(), idx, frame_sp.get(), frame_desc_strm.GetData());
1164c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    }
1165c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    return sb_frame;
1166c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton}
1167c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
116894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Inghambool
116994a5d0de4433dce556db59758f3d6124eb0e1a2aJim InghamSBThread::EventIsThreadEvent (const SBEvent &event)
117094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham{
117194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL;
117294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham}
117394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
117494a5d0de4433dce556db59758f3d6124eb0e1a2aJim InghamSBFrame
117594a5d0de4433dce556db59758f3d6124eb0e1a2aJim InghamSBThread::GetStackFrameFromEvent (const SBEvent &event)
117694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham{
117794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    return Thread::ThreadEventData::GetStackFrameFromEvent (event.get());
117894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
117994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham}
118094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
118194a5d0de4433dce556db59758f3d6124eb0e1a2aJim InghamSBThread
118294a5d0de4433dce556db59758f3d6124eb0e1a2aJim InghamSBThread::GetThreadFromEvent (const SBEvent &event)
118394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham{
118494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    return Thread::ThreadEventData::GetThreadFromEvent (event.get());
118594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham}
1186c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::operator == (const SBThread &rhs) const
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1190a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    return m_opaque_sp->GetThreadSP().get() == rhs.m_opaque_sp->GetThreadSP().get();
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread::operator != (const SBThread &rhs) const
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1196a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    return m_opaque_sp->GetThreadSP().get() != rhs.m_opaque_sp->GetThreadSP().get();
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
119898f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice
119998f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool
120094a5d0de4433dce556db59758f3d6124eb0e1a2aJim InghamSBThread::GetStatus (SBStream &status) const
120194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham{
120294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    Stream &strm = status.ref();
120394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
120494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    ExecutionContext exe_ctx (m_opaque_sp.get());
120594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    if (exe_ctx.HasThreadScope())
120694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    {
120794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1);
120894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    }
120994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    else
121094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        strm.PutCString ("No status");
121194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
121294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    return true;
121394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham}
121494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
121594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Inghambool
12167826c8894803dc729f29789ebc038956a94d3e7aCaroline TiceSBThread::GetDescription (SBStream &description) const
12177826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
121896154be69fa240a662419183ed08e1cfc5418164Greg Clayton    Stream &strm = description.ref();
121996154be69fa240a662419183ed08e1cfc5418164Greg Clayton
1220a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    ExecutionContext exe_ctx (m_opaque_sp.get());
1221f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    if (exe_ctx.HasThreadScope())
12227826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
12235f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        strm.Printf("SBThread: tid = 0x%4.4" PRIx64, exe_ctx.GetThreadPtr()->GetID());
12247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
12257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    else
122696154be69fa240a662419183ed08e1cfc5418164Greg Clayton        strm.PutCString ("No value");
12277826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
12287826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return true;
12297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
1230