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